链式队列实现舞伴问题
#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)
{
p=new QNode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
Status DeQueue(LinkQueue &Q,Person &e)
{
if(Q.front==Q.rear) return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
delete p;
return OK;
}
Person GetHead(LinkQueue &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) {
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);
}
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);
}
