队列的应用-------舞伴问题
编程思路:
- 初始化Mdancer队列和Fdancer队列;
- 反复循环,依次将跳舞者根据其性别插入Mdancer队列和Fdancer队列;
- 当Mdancer队列和Fdancer队列均为非空时,反复循环,依次输出男女舞伴的姓名;
- 如果Mdancer队列为空而Fdancer队列非空,则输出Fdancer队列的队头女士的姓名;
- 如果Fdancer队列为空而Mdancer队列非空,则输出Mdancer队列的队头男士的姓名;
遇到的问题:
- 两个连续的scanf问题(很致命的):
在本程序中,定义了num(int型) 和 name(char *型) 两个变量,在C语言中,如果使用字符型变量(就是char型)时在有连续输入的情况下,第二个scanf会把第一个scanf没有存储的换行符读取进去,导致程序发生未知的错误;解决方法:
在第二个scanf的 % 之前加一个空格;(当然也有其他方法,自行百度解决吧,个人比较喜欢这个方法)
#include <stdio.h> //输入(scanf)、输出(printf)函数的头文件
int main()
{
int num;
char str;
printf("input the num:");
scanf("%d",&num);
printf("input the char:");
//有兴趣的同学可以把%s之前的空格体验一下
scanf(" %s",str);
return 0;
}
-
在main函数中的while 循环中定义了一个变量,当想在while 循环之外引用该变量时,发生了错误;
解决方法:
在while循环之外定义这个变量; (这里没有深入研究为啥会出现这种错误,就一个字:懒~~~~) -
一定要理解指针变量!!!
一定要理解指针变量!!!
一定要理解指针变量!!!
(即使个人也不怎么会)
代码如下,自行检验:
#include <stdio.h> //输入(scanf)、输出(printf)函数的头文件;
#include <stdlib.h> //malloc free 函数的头文件;
//定义队列结构;
//定义链式队列的结点;
typedef struct LinkNode
{
char *name;
LinkNode *next;
}LinkNode;
//定义链式队列的队头、队尾指针;
typedef struct
{
LinkNode *front,*rear;
}LinkQueue;
//初始化队列;(带头结点)
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
//判断队列是否为空;
bool EmptyQueue(LinkQueue Q)
{
if (Q.front->next == NULL)
return true;
else
return false;
}
//添加元素;入队
void InsertQueue(LinkQueue &Q, char *name)
{
LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode)); //定义一个结点,并分配空间;
p->name = name; //将名字放入当前临时结点;
p->next = NULL; //重置该结点的next属性值;
Q.rear->next = p; //将该结点插入到队尾;
Q.rear = p; //修改队尾指针的指向;
}
//删除元素;出队
bool DeleteQueue(LinkQueue &Q, char *&name)
{
if (EmptyQueue(Q)) //队空报错;
return false;
LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode)); //定义一个结点,并分配空间;
p = Q.front->next; //用p结点指向要被删除的结点;
name = p->name; //用name存储、传递要被删除的名字;
Q.front->next = p->next;//修改队头指针的指向;
}
//获取队头元素;在本程序中没有用到这个功能;
bool GetQueue(LinkQueue Q ,char *&name)
{
if (EmptyQueue(Q))
return false;
name = Q.front->next->name;
return true;
}
int main()
{
LinkQueue Mdancer,Fdancer;
InitQueue(Mdancer); //初始化队列;
InitQueue(Fdancer); //初始化队列;
printf("The function:\n");
printf("------队列的应用:舞伴问题------\n");
int num;
char *name; //定义name指针变量
char sex; //定义sex属性;
//增强程序的健壮性;
while(1)
{
printf("input the number of dancer:");
scanf("%d",&num);
if (num >= 0)
break;
printf("输入格式不符合要求。\n");
}
while(num) //循环num次,输入num个舞伴信息;
{
name = (char *)malloc(sizeof(char)); //给name分配空间;
printf("The name of dancer:");
scanf("%s",name);
//增强程序的健壮性;
while(1) //循环判断输入sex的属性值是否合法;
{
printf("The sex of dancer('F':woman; 'M':man;):");
//这里遇到两个scanf问题;可根据提示网站进行学习了解;
scanf(" %c",&sex); //输入sex属性值;
if (sex == 'F' or sex == 'M')
break;
printf("性别输入格式有误,请重新输入。\n");
}
//根据性别进入不同队列;
switch (sex)
{
case 'F' : //进入女队;
InsertQueue(Fdancer,name);
break;
case 'M' : //进入男队;
InsertQueue(Mdancer,name);
break;
}
num--;
}
/*分配舞伴,依次出队列*/
//当Mdancer队列和Fdancer队列均为非空时,反复循环,依次输出男女舞伴的姓名;
printf("进行如下分配舞伴:\n");
while (!EmptyQueue(Fdancer) and !EmptyQueue(Mdancer))
{
DeleteQueue(Fdancer,name);
printf("%s and ",name);
DeleteQueue(Mdancer,name);
printf("%s\n",name);
}
if (!EmptyQueue(Fdancer))
{
DeleteQueue(Fdancer,name);
printf("The lonely woman is %s",name);
}else if (!EmptyQueue(Mdancer))
{
DeleteQueue(Mdancer,name);
printf("The lonely man is %s",name);
}else
printf("Successful team building.");
return 0;
}
写在最后:
代码有冗余很正常,留言相互交流很Nice!