// 在一次舞会上,来了许多男士和女士。这些男士和女士分别排队进入舞厅。第一个 |
//舞曲开始后,男士和女士按照队列顺序配对并走入舞池。当男士多于女士时,配对 |
//剩余的男士仍然在队列中。一曲终了,跳完舞的男士排在队尾,女士排成新的队列。 |
//下一舞曲开始时,男女重新按照队列顺序配对跳舞。当女士多于男士时,配对剩余 |
//的女士仍然在队列中,等待下一曲配对。现在要求按照队列中的先后顺序打印出第 |
//十轮配好对的人员名单和剩余人员的名单。 |
#include<stdio.h> |
#include<stdlib.h> |
#include"test4.h" |
#include<string.h> |
#define Maxsize 100 |
int main() |
{ |
int i,j,len,len1,len2,count; |
char str[Maxsize],e; |
LinkQueue *Q1,*Q2; //定义俩链式队列Q1,Q2 |
Q1=CreateQNode(0); //初始化Q1 |
Q2=CreateQNode(0); //初始化Q2 |
printf ( "用字母代表女士!输入女士:\n" ); |
gets (str); |
len1= strlen (str); //len1表示女士数量 |
for (i=0;i<len1;i++) |
EnQNode(Q1,str[i]); //将数据元素插入队列Q1中 |
|
printf ( "从链表队列中输出:\n" ); |
Display(Q1); //将队列Q1的数据元素输出 |
printf ( "用数字代表男士!输入男士:\n" ); |
gets (str); |
len2= strlen (str); //len2表示男士数量 |
for (i=0;i<len2;i++) |
EnQNode(Q2,str[i]); //将数据元素插入到队列Q2中 |
printf ( "从链表队列中输出:\n" ); |
Display(Q2); //输出队列Q2的数据元素 |
printf ( "共输出几轮配对:\n" ); |
scanf ( "%d" ,&count); //输入配对次数 |
for (i=1;i<=count;i++) |
{ |
printf ( "输出第%d轮配对\n" ,i); |
printf ( "输出配对男女:\n" ); |
if (len1 >= len2) //比较女士Q1和男士Q2的数量,取小值 |
len=len2; |
else |
len=len1; |
for (j=0;j<len;j++) |
{ |
DeQNode(Q1,&e); //从Q1中取出头元素(出队) |
printf ( "%c" ,e); |
EnQNode(Q1,e); //将取出的头元素再次插入队列Q1中(入队) |
DeQNode(Q2,&e); //从Q2中取出头元素(出队) |
printf ( "%c" ,e); |
EnQNode(Q2,e); //将取出的头元素再次插入队列Q2中(入队) |
printf ( " " ); |
} |
printf ( "\n输出未配对的男(女):\n" ); |
if (len1 <= len2) |
{ |
len=len2-len1; |
Output(Q2,len); //遍历队列,从Q2中输出前len个数量的数据元素 |
} |
else |
{ |
len=len1-len2; |
Output(Q1,len); //遍历队列,从Q1中输出前len个数量的数据元素 |
} |
printf ( "\n\n" ); |
} |
return 0; |
} |
//////////////////////////////////////// |
/* test4.cpp */ |
/* */ |
/* filename:test4.cpp */ |
/* description:test4.h的实现文件 */ |
/* designer:zhu jian */ |
/* data:12-10-27 */ |
/////////////////////////////////////// |
#include<stdio.h> |
#include<stdlib.h> |
#include"test4.h" |
#include<string.h> |
#define Maxsize 100 |
LinkQueue *CreateQNode(elemtype e) //创建一个空的链表队列 |
{ |
QNode *Q; |
LinkQueue *p; |
Q=(QNode *) malloc ( sizeof (QNode)); |
p=(LinkQueue *) malloc ( sizeof (LinkQueue)); |
if (!Q || !p) |
return NULL; |
Q->data=e; |
Q->next=NULL; |
p->front=p->rear=Q; |
return p; |
} |
unsigned char EnQNode(LinkQueue *Q,elemtype e) //插入数据元素(入队) |
{ |
LinkQueue *p; |
QNode *q; |
p=Q; |
if (!Q) |
return NULL; |
q=(QNode *) malloc ( sizeof (QNode)); |
if (!q) |
return ERROR; |
q->data=e; |
q->next=NULL; |
p->rear->next=q; |
p->rear=q; |
return OK; |
} |
unsigned char DeQNode(LinkQueue *Q,elemtype *e) //读取队列的数据元素,并删除结点(出队) |
{ |
QNode *p; |
QNode *q; |
p=Q->front; |
if (Q->front == Q->rear) |
return NULL; |
*e=p->next->data; |
q=p->next; |
p->next=q->next; |
if (Q->rear == q) |
Q->rear=p; |
free (q); |
return OK; |
} |
unsigned char Display(LinkQueue *Q) //遍历整个队列 |
{ |
LinkQueue *p; |
QNode *q; |
p=Q; |
if (!Q) |
return NULL; |
q=p->front->next; |
while (q != p->rear) |
{ |
printf ( "%c" ,q->data); |
q=q->next; |
} |
printf ( "%c\n" ,q->data); |
return OK; |
} |
unsigned char Output(LinkQueue *Q, int len) //输出链表队列的前len个元素 |
{ |
int i; |
QNode *p; |
p=Q->front; |
if (!Q) |
return ERROR; |
for (i=0;i<len;i++) |
{ |
printf ( "%c" ,p->next->data); |
p=p->next; |
} |
printf ( "\n" ); |
return OK; |
} |
/////////////////////////////////// |
/* test4.h */ |
/* */ |
/* filename:test4.h */ |
/* description:test4的头文件 */ |
/* designer:zhu jian */ |
/* data:12-10-27 */ |
//////////////////////////////////// |
#ifndef _DATA_STRUCTURE_TEST4_H_ |
#define _DATA_STRUCTURE_TEST4_H_ |
#ifndef ERROR |
#define ERROR 0 |
#endif |
#ifndef OK |
#define OK 1 |
#endif |
#ifndef NULL |
#define NULL 0 |
#endif |
typedef char elemtype; //用elemtype代替char |
typedef struct QNode{ //定义队列的链表结构体 |
elemtype data; |
struct QNode *next; |
}QNode; |
typedef struct { //定义队列的头指针和尾指针 |
QNode *front; |
QNode *rear; |
}LinkQueue; |
LinkQueue *CreateQNode(elemtype e); //创建一个链表结构的队列指针 |
unsigned char EnQNode(LinkQueue *Q,elemtype e); //插入数据元素(入队) |
unsigned char DeQNode(LinkQueue *Q,elemtype *e); //读取队列的数据元素(出对) |
unsigned char Display(LinkQueue *Q); //遍历整个队列 |
unsigned char Output(LinkQueue *Q, int len); //输出链表队列的前len个元素 |
#endif |