您的位置:首页 > 其它

链队列——队列的链式表示与实现

2013-07-27 19:27 381 查看
//链队列——队列的链式表示与实现
#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR -1
#define OVERFLOW 0

typedef struct QNode{
int data;
struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;//整个队列结构体

int InitQueue(LinkQueue &Q){
//构造一个空队列
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//QueuePtr是结构体指针,长度是sizeof(QNode)
if(!Q.front) exit(OVERFLOW);
Q.front->next = NULL;//Q.front和Q.rear是同一地址,所以Q.rear->next也为空
return OK;
}

//如果主函数中写为InitQueue(&Q),则可用以下形式
//int InitQueue(LinkQueue *Q){
//	//构造一个空队列
//	(*Q).front = (*Q).rear = (QueuePtr)malloc(sizeof(QNode));//QueuePtr是结构体指针,长度是sizeof(QNode)
//	if(!(*Q).front) exit(OVERFLOW);                          //其中 (*Q).front为简便起见也可以写为Q->front
//    (*Q).front->next = NULL;
//}

int EnQueue(LinkQueue &Q,int num){   //跟上面对照,&Q,这种写法,是引用
//插入元素e为Q的新的队尾元素
QueuePtr p;
int e;
for(int i=0;i<num;i++)
{
scanf("%d",&e);

p = (QueuePtr)malloc(sizeof(QNode));//定义结点用p来定义,因为QueuePtr含有数据和指针,然后把指针和rear,front进行处理。
if(!p) exit(OVERFLOW);              //注:rear和front也是结构体指针,也包含data和next
p->data = e;
p->next = NULL;
/*
if(Q.rear==NULL)
Q.rear = Q.front->next = p;//其中的if可以不加,因为刚开始时 Q.front = Q.rear,它们是同一地址。所以当给Q.rear->next赋值时,Q.front->next自动有值了
else
{
Q.rear->next = p;
Q.rear = p;
}
*/
Q.rear->next = p;
Q.rear = p;

}
return OK;
}

int DeQueue(LinkQueue &Q,int &e){
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK
QueuePtr p;
//Q.front->next = Q.rear;
if(Q.front == Q.rear) return ERROR;
p = Q.front->next;
e = p->data;
//printf("%d",e);
//getchar();
Q.front->next = p->next;
if(Q.rear == p ) Q.rear = Q.front;
free(p);

return OK;
}

void print(LinkQueue &Q){//将线性表中的值打印出来
QueuePtr p;
p =	Q.front->next;
while(p != NULL)
{
printf("%d\n",p->data);
p = p->next;
}

}

int DestroyQueue(LinkQueue &Q){
while(Q.front)
{
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return OK;
}

int main()
{
int num = 3;
int e;
LinkQueue Q;
InitQueue(Q);
EnQueue(Q,num);

/*for(int i=0;i<num;i++)
{
DeQueue(Q,e);
printf("%d\n",e);
}*/
print(Q);
DestroyQueue(Q);
system("pause");
return OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: