| 
 | 
 
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; 
} 
 
 |   
 
 
 
 
 
 |