鱼C论坛

 找回密码
 立即注册
查看: 1366|回复: 0

大佬们救救孩子

[复制链接]
发表于 2021-12-23 11:40:51 | 显示全部楼层 |阅读模式
59鱼币
这个代码我想弄一个新队来存放数据,但是这个队里面的数据为什么总是最后一个,我不知道我那的逻辑写错了QWQ有大佬帮帮我吗(是关于舞伴配对的代码)
'


代码: #include<stdio.h>
#include<stdlib.h>
#include<string.h>
//--------跳舞者个人信息-----
typedef struct
{
        char name[20];// 姓名
        char sex;//性别,‘F’表示女性,‘M’表示男性
        int hight;//身高
} DataType;
// ------队列的链式存储结构----
struct Node {
        DataType          data;//队列中数据元素类型为DataType
        struct Node* next;//指针域
};



typedef struct Node* PNode;
struct Queue
{
        PNode                f;//队头指针
        PNode                r;//队尾指针
};
typedef struct Queue* LinkQueue;
LinkQueue  SetNullQueue_Link()
{
        LinkQueue lqueue;
        lqueue = (LinkQueue)malloc(sizeof(struct Queue));
        if (lqueue != NULL)
        {
                lqueue->f = NULL;
                lqueue->r = NULL;
        }
        else
                printf("置空失败! \n");
        return  lqueue;
}

int IsNullQueue_link(LinkQueue lqueue)
{
        return (lqueue->f == NULL);
}

void EnQueue_link(LinkQueue lqueue, DataType x)//入队 (尾插法
{
        PNode  p;
        p = (PNode)malloc(sizeof(struct Node));
        if (p == NULL)
                printf("分配失败 ");
        else {
                p->data = x;//将新结点数据域置为x
                p->next = NULL;//指针域置空
                if (lqueue->f == NULL)//队列空
                {
                        lqueue->f = p;//修改头指针
                        lqueue->r = p;//修改尾指针
                }
                else
                {
                        lqueue->r->next = p;//将新结点插入到队尾
                        lqueue->r = p;//修改队尾指针
                }
        }
}

void WEnQueue_link(LinkQueue lqueue, DataType x)//入队 (头插法
{
        PNode  p;
        p = (PNode)malloc(sizeof(struct Node));
        if (p == NULL)
                printf("分配失败 ");
        else {
                p->data = x;//将新结点数据域置为x
                p->next = NULL;//指针域置空
                if (lqueue->f == NULL)//队列空
                {
                        lqueue->f = p;//修改头指针
                        lqueue->r = p;//修改尾指针
                }
                else
                {
                        lqueue->f = p;//将新结点插入到队头
                        lqueue->f->next = NULL;//修改队头指针
                }
        }
}



void DeQueue_link(LinkQueue lqueue)//出队
{
        struct Node* p;
        if (lqueue->f == NULL)//队列空
                printf("输出这是一个空队列 !\n ");
        else
        {
                p = lqueue->f;//p指向队头元素
                lqueue->f = lqueue->f->next;//修改头结点的指针域
                free(p);//释放节点
        }
}
DataType  FrontQueue_link(LinkQueue lqueue)//取队头元素
{
        if (lqueue->f == NULL)//空队列
        {
                printf("这是一个空队列 !\n");
        }
        else
                return (lqueue->f->data);//返回队头元素的值,队头指针不变
}



void DancePartner(DataType dancer[], int num)//结构数组dancer中存放跳舞的男女,num是跳舞的人数
{
        int i,j;
        DataType redancer[50];
        LinkQueue Mdancers = SetNullQueue_Link();//男队初始化
        LinkQueue Fdancers = SetNullQueue_Link();//女队初始化
        LinkQueue reMdancers = SetNullQueue_Link();
        LinkQueue reFdancers = SetNullQueue_Link();
        for (i = 0; i <= num; i++)
        {
                if (dancer[i].sex == 'M')
                {
                        EnQueue_link(Mdancers, dancer[i]);//插入男队
                }
                if (dancer[i].sex == 'F')
                {
                        EnQueue_link(Fdancers, dancer[i]);//插入女队
                }
        }
        while (!IsNullQueue_link(Mdancers) && !IsNullQueue_link(Fdancers))//依次输出男女舞伴的姓名
        {
                printf("配对的人是:\n");
                printf("%s %s\n", FrontQueue_link(Fdancers).name, FrontQueue_link(Mdancers).name);// 输出男士、女士队头姓名,


                WEnQueue_link(reMdancers,FrontQueue_link(Mdancers));

                DeQueue_link(Mdancers);//男士出队

                WEnQueue_link(reFdancers,FrontQueue_link(Fdancers));
                DeQueue_link(Fdancers);//女士出队
                num--;
        }
        printf("\n");
        while(!IsNullQueue_link(Mdancers))//男士队列非空,输出队头男士的姓名
        {
                printf("剩下的先生是:%s\n", FrontQueue_link(Mdancers).name);//取男士队头
                WEnQueue_link(reMdancers,FrontQueue_link(Mdancers));
//                printf("新队对头是%s",FrontQueue_link(reMdancers).name);
                DeQueue_link(Mdancers);
               
        }
        while(!IsNullQueue_link(Fdancers)){
                printf("剩下的女士是:%s\n", FrontQueue_link(Fdancers).name);//取女士队头
                WEnQueue_link(reFdancers,FrontQueue_link(Fdancers));
                DeQueue_link(Fdancers);
        }
       
       
       
        while(!IsNullQueue_link(reFdancers)){
                printf("新队中女性是:\n");
                printf("%s\n",FrontQueue_link(reFdancers).name);
                DeQueue_link(reFdancers);
        }
       
       
       
        while(!IsNullQueue_link(reFdancers)){
                EnQueue_link(Fdancers,FrontQueue_link(reFdancers));
                DeQueue_link(reFdancers);
        }
        while(!IsNullQueue_link(reMdancers)){
                EnQueue_link(Mdancers,FrontQueue_link(reMdancers));
                DeQueue_link(reMdancers);
        }


}
void hightsort(DataType dancerhight[], int n)//按身高进行排序(从大到小)冒泡排序
{
        int i, j;
        DataType temp;//数据类型temp
        for (i = 1; i < n; i++)
        {
                for (j = 0; j < n - i; j++)
                {
                        if (dancerhight[j].hight < dancerhight[j + 1].hight)
                        {
                                temp = dancerhight[j];
                                dancerhight[j] = dancerhight[j + 1];
                                dancerhight[j + 1] = temp;
                        }
                }
        }
        DancePartner(dancerhight,n-1);
}
void menu()//主菜单
{
        printf("1.添加舞伴(最多11个人)\n");
        printf("2.按照身高匹配\n");
        printf("3.按照时间匹配\n");
        printf("0.结束\n");
}
int main()//主函数
{


        int i = 0; int contue = 1,num=0;
        int key = -1;
        while (key != 0)
        {
                menu();
                scanf("%d", &key);
                printf("请输入舞会的人数");
                scanf("%d",&num);
                while(num>11||num<0){
                                printf("输入错误,请输入1到11的整数");
                                num = scanf("%d",&num);
                        }
                        DataType dancer[11];//结构体数组
                        DataType dancerhight[11];
                switch (key)
                {

                case 1://输入舞者的基本信息
//                        DataType dancer[11];//结构体数组
                        while(i<=num-1)
                        {
                                printf("请输入第%d人的姓名\n",i+1);
                                scanf("%s", dancer[i].name);
                                getchar();
                                printf("请输入第%d人的性别\n",i+1);
                                scanf("%c",&dancer[i].sex);
                                getchar();
                                while(dancer[i].sex!='M'&&dancer[i].sex!='F'){      
                                        printf("输入错误(F为女生,M为男生)\n");
                                        scanf("%c",&dancer[i].sex);
                                }
                                printf("请输入第%d人的身高\n",i+1);
                                scanf("%d",&dancer[i].hight);
                                i++;
                        }
                        break;
                case 2://按身高从高到低排序
//                        DataType dancerhight[11];CPP和c格式有区别
                        for (i = 0; i < num; i++)
                        {
                                strcpy(dancerhight[i].name, dancer[i].name);
                                dancerhight[i].hight = dancer[i].hight;
                                dancerhight[i].sex = dancer[i].sex;
                        }
                        while(contue == 1){
                        hightsort(dancerhight, num);
                        printf("本场舞会已结束,请问是否还让他们参加下一场(1是参加,其他键是离场)\n");
                        scanf("%d", &contue);
                        getchar();
                        if(contue==1){
                                        i=0;
                                        hightsort(dancerhight, num);
                                }
                        }
                        break;
                case 3://按入场时间时间排序
                        while(contue == 1){
                                DancePartner(dancer, num);
                                printf("本场舞会已结束,请问是否还让他们参加下一场(1是参加,其他键是离场)\n");
                                scanf("%d", &contue);
                                getchar();
                                if(contue==1){
                                        i=0;
                                        DancePartner(dancer, num);
                                }
                        }
                        break;
                case 0: //结束整个程序
                return 0;
                }
        }
        return 0;
}

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 02:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表