C pta实验十 队列

6-1 小孩报数(顺序循环队列版)

有若干个小孩围成一圈,现从指定的第1个开始报数,报到第 w个时,该小孩出列,然后从下一个小孩开始报数,仍是报到w个出列,如此重复下去,直到所有的小孩都出列(总人数不足w个时将循环报数),求小孩出列的顺序。
算法要求:使用顺序循环队列来存储所有小孩,报数时小孩出队,未数到w时,接着入队;数到w时,输出小孩的名字,该小孩不再入队,如此直到所有小孩出队,队列为空时停止报数。
请写出顺序循环队列的所有基本操作。
说明 :参与报数游戏的小孩人数不能超过10人。

数据结构与操作函数接口定义:

typedef char ElemType;
typedef struct   // 顺序循环队列结点定义
{
    ElemType *name[MaxSize];   //小孩姓名
    int front,rear;        //队首和队尾指针
} SqQueue;
void InitQueue(SqQueue *&q);   //初始化队列;
void DestroyQueue(SqQueue *&q);  //销毁队列;
bool QueueEmpty(SqQueue *q);  //判定队列为空时返回true; 否则返回false;
bool enQueue(SqQueue *&q,ElemType *e);  // e 入队;成功入队返回true; 否则返回false;
bool deQueue(SqQueue *&q,ElemType *&e);  //出队,返回出队元素e,且成功出队返回true,否则返回false;

裁判测试程序样例:

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MaxSize 11
#define N 10

int main()
{
    ElemType *e;
    int n,i;
    SqQueue *q;
    InitQueue(q);    
    scanf("%d",&n);
    while(1)
    {
        char *name=(char *)malloc(sizeof(char)*N);
        scanf("%s",name);
        if( (strcmp("-1",name)==0)||!enQueue(q,name))
            break;
    }
    i=n-1;
    while(!QueueEmpty(q))
    {
        deQueue(q,e);
        if(i-->0) 
            enQueue(q,e);
        else
        {
            printf("%s\n",e);
            i=n-1;
            free(e);            
        }        
    }
    DestroyQueue(q);
}


/* 请在这里填写答案 */

输入样例:

第一行:报数w;
第二行:输入若干小孩姓名,以空格符间隔,以字符串“-1”结束输入。
在这里给出一组输入。例如:

3
Jenny Mike Lily Tom Yoyo -1

输出样例:

在这里给出相应的输出。例如:

Lily
Jenny
Yoyo
Mike
Tom
void InitQueue(SqQueue *&q)
{
	q = (SqQueue *)malloc(sizeof(SqQueue));
	q->front = q->rear = 0;
}
void DestroyQueue(SqQueue *&q)
{
	free(q);
}
bool QueueEmpty(SqQueue *q)
{
	return(q->front == q->rear);
}
bool enQueue(SqQueue *&q, ElemType *e)
{
	if ((q->rear+1)%MaxSize == q->front)
	{
		return false;
	}
	q->name[q->rear] = e;
	q->rear=(q->rear+1)%MaxSize;
	
	return true;
}
bool deQueue(SqQueue *&q, ElemType *&e)
{
	if (q->front==q->rear)
	{
		return false;
	}
	e = q->name[q->front];
	q->front = (q->front + 1) % MaxSize;
	
	return true;
}

6-2 舞伴问题

假设男士和女士的记录存放在一个数组中,设计算法实现舞伴配对,要求输出配对的舞伴,并输出没有配对的队头元素的姓名。

函数接口定义:

void DancePartner(DataType dancer[], int num) ;

其中 dancer[]是存放男士和女士信息的数组,num是数组大小。

裁判测试程序样例:


#include<stdio.h>
#include<stdlib.h>

typedef struct {
    char name[20]; 
    char sex; 
} DataType;

struct Node {
    DataType      data;
    struct Node*  next;
};
typedef struct Node  *PNode;
struct Queue
{
    PNode        f;
    PNode        r;
};
typedef struct Queue *LinkQueue;
LinkQueue  SetNullQueue_Link()
{
    LinkQueue lqueue;
    lqueue = (LinkQueue)malloc(sizeof(struct Queue));
    if (lqueue != NULL)
    {
        lqueue->f = NULL;
        lqueue->r = NULL;
    }
    else
        printf("Alloc failure! \n");
    return  lqueue;
}

int IsNullQueue_link(LinkQueue lqueue)
{
    return (lqueue->f == NULL);
}

void EnQueue_link(LinkQueue lqueue, DataType x)
{
    PNode  p;
    p = (PNode)malloc(sizeof(struct Node));
    if (p == NULL)
        printf("Alloc failure!");
    else {
        p->data = x;
        p->next = NULL;
        if (lqueue->f == NULL)
        {
            lqueue->f = p;
            lqueue->r = p;
        }
        else
        {
            lqueue->r->next = p;
            lqueue->r = p;
        }
    }
}
void DeQueue_link(LinkQueue lqueue)
{
    struct Node  * p;
    if (lqueue->f == NULL)
        printf("It is empty queue!\n ");
    else
    {
        p = lqueue->f;
        lqueue->f = lqueue->f->next;
        free(p);
    }
}
DataType  FrontQueue_link(LinkQueue lqueue)
{
    if (lqueue->f == NULL)
    {
        printf("It is empty queue!\n");
    }
    else
        return (lqueue->f->data);
}

void DancePartner(DataType dancer[], int num) 
{
            /* 请在这里填写答案 */
}

int main()
{
    DataType dancer[9];
    for (int i = 0; i < 9; i++)
    scanf("%s %c", dancer[i].name, &dancer[i].sex);
    DancePartner(dancer, 9);
    return 0;
}

输入样例:

在这里给出一组输入。例如:

李敏浩 M
李钟硕 M
高欣雅 F
吴彦祖 M
王思聪 M
张甜源 F
张智霖 M
许丹丹 F
马小云 F

输出样例:

高欣雅 李敏浩
张甜源 李钟硕
许丹丹 吴彦祖
马小云 王思聪

张智霖

void DancePartner(DataType dancer[], int num)
{
	DataType p;
	char *name;
	int i;
	// 创建两个队列
	LinkQueue male = SetNullQueue_Link(); // 男士队列
	LinkQueue fmale =  SetNullQueue_Link();  // 女士队列

	for(i = 0; i<num; i++)
	{
		if(dancer[i].sex=='M')
			EnQueue_link(male,dancer[i]);
		else
			EnQueue_link(fmale,dancer[i]);
	}

	while((!IsNullQueue_link(male)) && (!IsNullQueue_link(fmale)))
	{
		p = FrontQueue_link(fmale);
		printf("%s",p.name);
		p = FrontQueue_link(male);
		printf(" %s", p.name);
		
		DeQueue_link(male);
		DeQueue_link(fmale);
		
		putchar('\n');
	}
	putchar('\n');
	name = IsNullQueue_link(male)==0?male->f->data.name:fmale->f->data.name;
	printf("%s",name);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星辰微澜316

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值