80分真心求解,队列舞会问题

C语言 码拜 10年前 (2015-05-11) 1254次浏览 0个评论

题目要求:
1、利用循环队列模拟舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。
2、假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。
试模拟解决上述舞伴配对问题。
3、要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    char name[20];
    char sex;
}people;
typedef people DataType;
typedef struct node{
	DataType data;
	struct node *next;
}QueueNode;
typedef struct{
	QueueNode *front;
	QueueNode *rear;
}LinkQueue;

void Initial(LinkQueue* Q);
void Push(LinkQueue* Q,DataType e);
DataType Pop(LinkQueue* Q);
int IsEmpty(LinkQueue* Q);

int main()
{
    int i,pair,number;
    LinkQueue F,M;
    people p,p_f,p_m;

    printf("请输入参加舞会的人数:");
    scanf("%d",&number);
    for(i=1;i<=number;i++)
    {
        printf("请输入第%d个人的姓名:",i);
        scanf("%s",p.name);
        getchar();
        printf("请输入第%d个人的性别(F/M):",i);
        scanf("%c",p.sex);
        if(p.sex==""F"")
            Push(&F,p);
        else Push(&M,p);
    }
    printf("请输入配对总数:");
    scanf("%d",&pair);
    for(i=1;i<=pair;i++)
    {
        p_f=Pop(&F);
        Push(&F,p_f);

        p_m=Pop(&M);
        Push(&M,p_f);

        printf("第%d对为:女:%s  男:%s\n",i,p_f.name,p_m.name);
    }
    return 0;
}

void Initial(LinkQueue *Q)
/*将顺序队列置空*/

{    Q->front=Q->rear=NULL;
}

/*判队列空*/
int IsEmpty(LinkQueue *Q)
{
    return Q->front==NULL&&Q->rear==NULL;
}

/*进队列*/
void Push(LinkQueue *Q,DataType x)
{
/*将元素x插入链队列尾部*/
	QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode));/*申请新结点*/
	p->data=x;
	p->next=NULL;
    if(IsEmpty(Q))
		Q->front=Q->rear=p;  /*将x插入空队列*/
	else
	{ /*x插入非空队列的尾*/
		Q->rear->next=p;     /*p链到原队尾结点后*/
		Q->rear=p;           /*队尾指针指向新的尾*/
	}
}

/*出队列*/
DataType Pop(LinkQueue *Q)
{
	DataType x;
	QueueNode *p;
	if(IsEmpty(Q))
	{
		printf("队列为空");/*下溢*/
		exit(1);
	}
	p=Q->front;                   /*指向对头结点*/
	x=p->data;                    /*保存对头结点的数据*/
	Q->front=p->next;             /*将对头结点从链上摘下*/
    if(Q->rear==p)/*原队中只有一个结点,删去后队列变空,此时队头指针已为空*/
		Q->rear=NULL;
	free(p);   /*释放被删队头结点*/
	return x;  /*返回原队头数据*/
}

队列的基本操作应该没问题,在其他地方调试过了,但主函数总是不对,找了好久实在是不知道怎么回事
希望各位帮忙看看

60分
输入scanf(“%c”,p.sex);这个之后你就不和之前一样把回车吃掉?
20分
仅供参考:

//舞会上,男士们(m人)和女士们(n人, n<m)进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。
//男队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。在第t首曲子时,第x个女生和第几个男生配对跳舞?
#include <stdio.h>
#include <string.h>
#define MAX 26
int m,n,t,x,y,i,j,k;
char md[MAX];
char nd[MAX];
char c;
void main() {
    while (1) {
        printf("Input n m(1<=n<m<=%d):",MAX);
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&n,&m)) {
            if (1<=n && n<m && m<=MAX) break;
        }
    }
    while (1) {
        printf("Input t x(1<=t<=%d 1<=x<=%d):",MAX,n);
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&t,&x)) {
            if (1<=t && t<=MAX && 1<=x && x<=n) break;
        }
    }
    for (i=0;i<m;i++) md[i]=""A""+i;
    for (i=0;i<n;i++) nd[i]=""a""+i;
    k=0;
    for (i=0;i<t;i++) {
        printf("%2d: ",i+1);
        for (j=0;j<n;j++) {
            c="" "";
            if (i==t-1 && j==x-1) {c=""*"";y=k+1;}
            printf("%c%c%c",md[k],nd[j],c);
            k=(k+1)%m;
        }
        printf("\n");
    }
    printf("%d\n",y);

}
引用 1 楼 pengzhixi 的回复:

输入scanf(“%c”,p.sex);这个之后你就不和之前一样把回车吃掉?

我试过了  还是不行啊

#include <cstdio>
#include <cstdlib>
typedef struct
{
    char name[20];
    char sex;
}people;
typedef people DataType;
typedef struct node{
    DataType data;
    struct node *next;
}QueueNode;
typedef struct{
    QueueNode *front;
    QueueNode *rear;
}LinkQueue;
 
void Initial(LinkQueue* Q);
void Push(LinkQueue* Q,DataType e);
DataType Pop(LinkQueue* Q);
int IsEmpty(LinkQueue* Q);
 
int main()
{
    int i,pair,number;
    LinkQueue F,M;
    people p,p_f,p_m;
 	Initial(&F);
 	Initial(&M);
    printf("请输入参加舞会的人数:");
    scanf("%d",&number);
    getchar();
    for(i=1;i<=number;i++)
    {
        printf("请输入第%d个人的姓名:\n",i);
        scanf("%s",p.name);
        printf("请输入第%d个人的性别(F/M):\n",i);
        scanf("%c",&(p.sex));
        getchar();
        if(p.sex==""F"")
            Push(&F,p);
        else Push(&M,p);
    }
    printf("请输入配对总数:");
    scanf("%d",&pair);
    for(i=1;i<=pair;i++)
    {
        p_f=Pop(&F);
        Push(&F,p_f);
 
        p_m=Pop(&M);
        Push(&M,p_f);
 
        printf("第%d对为:女:%s  男:%s\n",i,p_f.name,p_m.name);
    }
    
    getchar();
    return 0;
}
 
void Initial(LinkQueue *Q)
/*将顺序队列置空*/
 
{    Q->front=Q->rear=NULL;
}
 
/*判队列空*/
int IsEmpty(LinkQueue *Q)
{
    return Q->front==NULL&&Q->rear==NULL;
}
 
/*进队列*/
void Push(LinkQueue *Q,DataType x)
{
/*将元素x插入链队列尾部*/
    QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode));/*申请新结点*/
   // p->data=x;
    p->next=NULL;
    if(IsEmpty(Q))
        Q->front=Q->rear=p;  /*将x插入空队列*/
    else
    { /*x插入非空队列的尾*/
        Q->rear->next=p;     /*p链到原队尾结点后*/
        Q->rear=p;           /*队尾指针指向新的尾*/
    }
}
 
/*出队列*/
DataType Pop(LinkQueue *Q)
{
    DataType x;
    QueueNode *p;
    if(IsEmpty(Q))
    {
        printf("队列为空");/*下溢*/
        exit(1);
    }
    p=Q->front;                   /*指向对头结点*/
    x=p->data;                    /*保存对头结点的数据*/
    Q->front=p->next;             /*将对头结点从链上摘下*/
    if(Q->rear==p)/*原队中只有一个结点,删去后队列变空,此时队头指针已为空*/
        Q->rear=NULL;
    free(p);   /*释放被删队头结点*/
    return x;  /*返回原队头数据*/
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明80分真心求解,队列舞会问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!