c队列
#include <iostream>
#include <stdlib.h>
using namespace std;
/*定义链队列*/
#define qlize 5
typedef int NodeData;
typedef struct node
{
NodeData nodedata; //节点数据
struct node * next; //指向下一个节点的指针
}QueueNode;
typedef struct linkList
{
QueueNode * head; //队头指针
QueueNode * rear; //队尾指针
}LinkQueue;
/*初始化队列*/
void initQueue(LinkQueue * linkQueue)
{
linkQueue-> head=linkQueue-> rear=NULL;
}
/*判队空*/
int isEmptyQueue(LinkQueue * linkQueue)
{
return linkQueue-> head==NULL&&linkQueue-> rear==NULL;
}
/*入队*/
void inQueue(LinkQueue * linkQueue,NodeData nodeData)
{
//从队尾入队
QueueNode *inNode=(QueueNode *)malloc(sizeof(QueueNode));
inNode-> nodedata=nodeData;
inNode-> next=NULL;
//如果队为空
if(isEmptyQueue(linkQueue))
{
linkQueue-> head=inNode;
linkQueue-> rear=inNode;
}
else
{
QueueNode *rearNode=linkQueue-> rear;
rearNode-> next=inNode;
linkQueue-> rear=inNode;
}
}
/*出队*/
NodeData outQueue(LinkQueue * linkQueue)
{
//从队首出队
QueueNode *outNode;
NodeData nodeDate;
if(isEmptyQueue(linkQueue))
{
printf( "THE QUEUE LIST IS NULL ");
exit(0);
}
outNode=linkQueue-> head;
nodeDate=outNode-> nodedata;
linkQueue-> head=outNode-> next;
if(linkQueue-> rear==outNode)
{
linkQueue-> rear=NULL;
}
free(outNode);
return nodeDate;
}
/*打印队列*/
void printQueue(LinkQueue * linkQueue)
{
QueueNode *headNode=linkQueue-> head;
int i=1;
QueueNode *node=headNode;
printf( "the node %d is %d\n ",i++,node-> nodedata);
while(node=node-> next)
{
printf( "the node %d is %d\n ",i,node-> nodedata);
i++;
}
}
void main()
{
LinkQueue * linkQueue;
int inData; //入队数据
linkQueue=(LinkQueue *)malloc(sizeof(LinkQueue));
//入队
initQueue(linkQueue);
printf( "please input queue\n ");
for(int i=1;inData!=qlize;i++)//控制入队的循环不知道qlize应该用什么来代
{ //替,才能够完成任何数入队
cin> > inData;
inQueue(linkQueue,inData);
}
//打印入队后的队列
printQueue(linkQueue);
//出队
while(isEmptyQueue(linkQueue)!=1)
{
NodeData nodedata=outQueue(linkQueue);
printf( "out queue %d\n ",nodedata);
}
}
这个是一个正确的程序 但是我总是觉得他的控制入队列是是有问题的 比如有两个5时 到第一个5队列入队就结束了 我不知道怎么控制才能够解决这个问题,我用回车来控制时又不能够结束循环啊,大哥大姐们帮一下啊.
[解决办法]
1.设定计数器
for(int num=0;num <MAXNUM;num++){;}//MAXNUM 是常数
2.如果你一定要输入多个qLize的话,可以设定一个5的数目的上限。
int numofqLize=0;
for(;;)
{
cin> > inData;
if(inData==qLize)
numofqLize++;
if(numofqLize==MAXNUMOFQLIZE)//MAXNUMOFQLIZE是常数
break;
inQueue(linkQueue,inData);
}
P.S.提醒大家一下,刚才我直接复制、粘贴代码,结果出现了多余空格的错误,重新敲入代码后不再出现这个错误。
[解决办法]
补充一下,如果不设定qLize的上限也可以,
3.
int equaltoqLize=qLize+1;
for(;;)
{
cin> > inData;
if(inData==qLize)
equaltoqLize=qLize;
if((inData!=qLize)&&(equaltoqLize==qLize))//前一次出现qLize但这次不是qLize
break;
inQueue(linkQueue,inData);
}