队列的链式存储结构
先上代码:
#ifndef _QUEUE_H_
#define _QUEUE_H_
#include <stdio.h>
#include <stdlib.h>
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode* next;
}QNode;
typedef struct QNode* QueuePtr;
typedef struct
{
QueuePtr fronter,rearer;
}LinkQueue;
void CreatQueue(LinkQueue* Q);
int EnQueue(LinkQueue* Q,QElemType e);
int DeQueue(LinkQueue* Q,QElemType* e);
int ClearQueue(LinkQueue* Q);
void TraveQueue(LinkQueue* Q);
#endif // _QUEUE_H_
#include "queue.h"
void CreatQueue(LinkQueue* Q)
{
QueuePtr q = (QueuePtr)malloc(sizeof(QNode));
q->data = 0;//存储列队长度
q->next = NULL;
Q->fronter = q;
Q->rearer = q;
}
int EnQueue(LinkQueue* Q,QElemType e)
{
QueuePtr q = (QueuePtr)malloc(sizeof(QNode));
q->data = e;
q->next = NULL;
Q->rearer->next = q;
Q->rearer = Q->rearer->next;
Q->fronter->data += 1;
return 0;
}
int DeQueue(LinkQueue* Q,QElemType* e)
{
QueuePtr p;
if(Q->fronter == Q->rearer)
return -1;
p = Q->fronter->next;
*e = p->data;
Q->fronter->next = p->next;
if(Q->rearer == p)//若队头是队尾
Q->rearer = Q->fronter;
free(p);
Q->fronter->data -= 1;
return 0;
}
int ClearQueue(LinkQueue* Q)
{
QueuePtr p,q;
Q->rearer = NULL;
p = Q->fronter;
while(p)
{
q = p->next;
free(p);
p = q;
}
Q->fronter = NULL;
printf("Queue is clear!\n");
return 0;
}
void TraveQueue(LinkQueue* Q)
{
int i = 0;
QueuePtr p;
p = Q->fronter->next;
while(p)
{
i++;
printf("the number is %d,the data is %d\n",i,p->data);
p = p->next;
}
printf("the Queue's length is %d\n",Q->fronter->data);
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "queue.h"
int main()
{
int i = 0;
LinkQueue Q;
srand(time(0));//初始化随机数种子
CreatQueue(&Q);
for(i = 0;i < 8;i++)
{
EnQueue(&Q,rand()%100 + 1);
}
TraveQueue(&Q);
EnQueue(&Q,rand()%100 + 1);
EnQueue(&Q,rand()%100 + 1);
TraveQueue(&Q);
DeQueue(&Q,&i);
printf("i = %d is out of the Queue\n",i);
DeQueue(&Q,&i);
printf("i = %d is out of the Queue\n",i);
TraveQueue(&Q);
ClearQueue(&Q);
return 0;
}
正文:
- 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
- 链表结构中有两个指针。
- 创建队列时,创建了一个头节点,其并不是队列元素。