数据结构舞伴问题(链队)

链式队列实现舞伴问题

#include<stdio.h>
#define OK 1
#define ERROR -1



typedef int Status;
typedef char SElemType;
typedef char QElemType;


//定义跳舞者 
typedef struct
{
    char name[20];
    char sex;

}Person; 


// 队列的链式存储结构 
typedef struct QNode
{
	Person data;
	struct QNode *next; 
} QNode,*QueuePtr;

QNode *p;


typedef struct
{
	QueuePtr front;//队头指针 
	QueuePtr rear;//队尾指针 
}LinkQueue;


LinkQueue Mdancers,Fdancers;

//队列的初始化
Status IniQueue(LinkQueue &Q) 
{
	Q.front=Q.rear=new QNode;//生成新的节点作为头结点,队头和队尾指针指向此节点 
	Q.front->next=NULL;//头结点的指针域置空 
	return OK;
}


//链栈的入队
Status EnQueue(LinkQueue &Q,Person &e)
{
	//插入元素e为Q的新的队尾元素
	p=new QNode;//为入队元素分配节点空间 ,用指针p指向 
	p->data=e;//将新的结点数据域置为e 
	p->next=NULL;
	Q.rear->next=p;//将新结点插入到队尾 
	Q.rear=p;//修改队尾指针 
	return OK; 
 } 
 
 
//链栈的出队
Status DeQueue(LinkQueue &Q,Person &e)
{
	//删除Q的队头的元素 ,用e返回其值
	if(Q.front==Q.rear) return ERROR;//若栈为空则返回ERROR 
	p=Q.front->next;//P指向队头元素 
	e=p->data;//e保存队头元素的值 
	Q.front->next=p->next;//修改头结点的指针域 
	if(Q.rear==p) Q.rear=Q.front;//最后一个元素被删,队尾指针指向头结点
	delete p;//释放原队元素的空间 
	return OK;
}


//取队头元素 
Person GetHead(LinkQueue &Q)
{
	//返回Q的队头元素,不修改队头指针
	if(Q.front!=Q.rear) 
	    return Q.front->next->data;
}



//判断队列是否为空
Status QueueEmpty(LinkQueue Q)
{
	if(Q.front==Q.rear) return 1;
	else return 0;
}


//算法描述
void DancerPartner(Person dancer[],int num) {
	//结构数组dancer中存放跳舞的男女,num是跳舞的人数
	IniQueue(Mdancers);//男士队列初始化 
	IniQueue(Fdancers); //女士队列初始化 
	Person t,z;
	for(int i=0;i<num;i++)
	{    t=dancer[i];
		if(t.sex=='F') EnQueue(Fdancers,t);//插入女队 
		else EnQueue(Mdancers,t);//插入男队 
	}
   printf("\n\n\n\n"); 
   printf("跳舞者搭档为:\t");
   while(QueueEmpty(Fdancers)==0 && QueueEmpty(Mdancers)==0)
   {
   	   //依次输出男女舞伴的姓名
		  DeQueue(Fdancers,t);//女士出队
		  printf("%s和",t.name);
		  DeQueue(Mdancers,t);//男士出队
		  printf("%s\t",t.name);		   		   
   }
   //z=GetHead(Fdancers);//取女士对头 
   //printf("第一个获得搭档的女士为:%s",z.name); 
   if(!QueueEmpty(Fdancers)) //女士队列非空,输出队头女士的姓名
   {
   	  z=GetHead(Fdancers);//取女士对头 
   	  printf("\n");
   	  printf("第一个获得搭档的女士为:%s",z.name);
   }
   else if(!QueueEmpty(Mdancers)) //男士队列非空,输出队头男士的姓名 
   {
   	  z=GetHead(Mdancers);
   	  printf("第一个获得搭档的男士为:%s",z.name);
   }
}
main()
{   
    int i;   
	Person dancer[8];  
	for(i=0;i<8;i++)
	{
								                       
    printf("请输入舞者姓名:");
	scanf("%s",&dancer[i].name);
	printf("请输入舞者性别:");
	scanf("%s",&dancer[i].sex);}
	DancerPartner(dancer,8);	
}

在这里插入图片描述

  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值