C 队列的应用-----舞伴问题

队列的应用-------舞伴问题

编程思路:
  1. 初始化Mdancer队列和Fdancer队列;
  2. 反复循环,依次将跳舞者根据其性别插入Mdancer队列和Fdancer队列;
  3. 当Mdancer队列和Fdancer队列均为非空时,反复循环,依次输出男女舞伴的姓名;
  4. 如果Mdancer队列为空而Fdancer队列非空,则输出Fdancer队列的队头女士的姓名;
  5. 如果Fdancer队列为空而Mdancer队列非空,则输出Mdancer队列的队头男士的姓名;
遇到的问题:
  1. 两个连续的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;
}
  1. 在main函数中的while 循环中定义了一个变量,当想在while 循环之外引用该变量时,发生了错误;

    解决方法:
    在while循环之外定义这个变量; (这里没有深入研究为啥会出现这种错误,就一个字:懒~~~~)

  2. 一定要理解指针变量!!!
    一定要理解指针变量!!!
    一定要理解指针变量!!!
    (即使个人也不怎么会)

代码如下,自行检验:
#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!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值