本程序适用于:
icoding的数据结构并没有一个测试代码,其都是直接编写一个函数的形式,因此很难知道自己的实际输出是什么。针对部分题目,我编写了一系列测试代码以供大家进行数据输出的测试。
bool init_queue(LinkQueue *LQ) { //TODO } bool enter_queue(LinkQueue *LQ, ElemType x) { //TODO } bool leave_queue(LinkQueue *LQ, ElemType *x) { //TODO }
请将您的函数代码复制到上述函数中,然后修改main函数的相关内容,完成测试样例的输入
题目原文:
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),请完成下列任务:
1: 队列初始化,成功返回真,否则返回假:
bool init_queue(LinkQueue *LQ);
2: 入队列,成功返回真,否则返回假:
bool enter_queue(LinkQueue *LQ, ElemType x);
3: 出队列,成功返回真,且*x为出队的值,否则返回假
bool leave_queue(LinkQueue *LQ, ElemType *x);
相关定义如下:
typedef struct _QueueNode { ElemType data; // 数据域 struct _QueueNode *next; // 指针域 }LinkQueueNode, *LinkQueue;
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include<stdlib.h>
typedef int ElemType ;
typedef struct _QueueNode {
ElemType data; // 数据域
struct _QueueNode *next; // 指针域
}LinkQueueNode, *LinkQueue;
//打印循环队列
void print_queue(LinkQueue Q) {
LinkQueueNode *p = Q->next->next;
if(p==NULL){
printf("空队列\n");
return;
}
printf("<<[出队|Front]<< ");
if(Q == Q->next) {
printf("···队中无元素···");
}
while (p!= Q->next) {//Q->next是头结点
if(p->next==Q->next) printf("%d", p->data);
else printf("%d <- ", p->data);
p = p->next;
}
printf(" <<[Rear|入队]<<\n");
printf("\n");
}
//--------以上为辅助函数---------
bool init_queue(LinkQueue *LQ)
{
//TODO
}
bool enter_queue(LinkQueue *LQ, ElemType x)
{
//TODO
}
bool leave_queue(LinkQueue *LQ, ElemType *x)
{
//TODO
}
int main(){
//------以 下 内 容 可 以 编 辑 -------
ElemType val[]={1,2,3,4,5};//队列元素
bool print_init=true;//是否打印初始化队列(用来第一个函数的测试)
bool test_enter=true;//测试入队,true:测试,false:不测试
bool print_enter_by_order=false;
//是否逐次打印队列(即每入队一个就输出一个队列),在数据量大的时候建议关闭
//***false表示直接输出最终队列,不输出过程量。***
bool test_leave=true;//测试出队,true:测试,false:不测试
int leave_times=0;
//测试出队的次数,输入0为逐次全部出队(即后续程序会把leave_times设置为队列长度)
//输入其他数字需要大于等于1而小于等于元素个数
//------以 上 内 容 可 以 编 辑 -------
printf("icoding\n循环链表表示队列\n");
printf("*提示* 队列为循环队列,LQ指向队尾节点,链表应该设置虚拟头节点(不存储值)!\n");
int len=sizeof(val)/sizeof(ElemType);
if(len==0){
printf("队列元素个数为0(数组为空),无法初始化队列!\n程序自动终止,请修改\n");
return 0;
}
printf(">>>>>初始化队列\n");
LinkQueue LQ;
bool init_bool=init_queue(&LQ);
if(init_bool==false)
{
printf("初始化队列失败!返回false\n程序自动终止,请修改源代码\n");
return 0;
}else{
printf("<<初始化队列成功!%s\n",(print_init==true)?"\n···打印初始队列···":"");
if(print_init==true)
{
print_queue(LQ);
}
}
if(test_enter){
printf("\n----------\n>>测试入队,共需要入队%d个元素\n",len);
bool enter_bool=true;
for(int i=0;i<len;i++){
ElemType tmp=val[i];
enter_bool=enter_queue(&LQ,tmp);
if(enter_bool==false)
{
printf("%d(下标为%d)的数据入队失败!返回false\n程序自动终止,请修改源代码\n",tmp,i);
return 0;
}
if(print_enter_by_order==true)
{
if(i==0){
printf("···打印入队信息···\n");
}
if(i!=len-1){
printf("第%d次 入队数据:%d\n",i+1,tmp);
print_queue(LQ);
}
else if(i==len-1){
printf("第%d次 入队数据:%d [*最终队列*]\n",i+1,tmp);
print_queue(LQ);
printf("<<入队完成,上方最后一个为最终队列\n");
}
}
}
if(print_enter_by_order==false)
{
printf("<<入队完成\n···打印最终队列···\n");
print_queue(LQ);
}
}else{
printf("您没有测试入队,若需要请修改main函数的test_enter 值\n");
}
if(test_leave&&test_enter){
printf("\n-----------\n>>测试出队\n");
ElemType s=-12345678;
if(leave_times>len)
{
printf("*提示* 您设置出队次数(%d)超过队列元素个数(%d),出队次数更改为队列元素个数(%d)\n",leave_times,len,len);
leave_times=len;
}
else if(leave_times==0){
printf("*提示* 您设置为逐个全部出队,应该出队%d次\n",len);
leave_times=len;
}
else{
printf("*提示* 您设置出队次数为%d\n",leave_times);
}
printf("···打印出队信息···\n");
bool leave_bool=true;
for(int i=0;i<leave_times;i++){
leave_bool=leave_queue(&LQ,&s);
if(leave_bool==false)
{
printf("第%d次出队失败! 应该出队元素为%d 函数返回false\n程序自动终止,请修改源代码\n",i+1,val[i]);
return 0;
}else{
printf("第%d次\t实际出队:%d\t正确应为:%d\t[%s]\n",i+1,s,val[i],val[i]==s?"正确":"错误");
if (s==-12345678)
{
printf("出队未-12345678的错误的原因可能是您将出队元素的值赋给x\n");
}
}
print_queue(LQ);
}
}else if(test_leave&&(!test_enter)){
printf("您没有测试入队,因此即便您选择测试出队也不能运行,因为没有元素入队,请修改main函数的test_enter 值\n");
}
else{
printf(" 您没有测试出队,若需要请修改main函数的test_leave 值\n");
}
printf("\n----测试结束----\n");
return 0;
}
如果不对内置的测试函数修改,那么正确的输出将是