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