C语言线性表之队列算法一:链式队列

     之前写过《C语言实现线性表之栈算法》,《C语言实现线性表之链表算法》《C语言实现线性表连续存储结构相关算法》三篇关于算法的文章,但这三篇文章中只有大段的代码,并没有相关的解说,对于当时的我来说,思路会比较清晰,但过一段时间后,这些个算法为什么这样实现,也许就想不起来了,所以本文增加一些解说性的文字,如果各位看官看的不爽,恳请不吝赐教。

一、定义

队列:无非就是一种先进先出的一种存储结构,可以用以下的示意图进行演示。

二、分类

1)动态队列:通常使用链表来实现
2)静态队列:使用数组来实现

三、动态队列的实现

第一部分:其本实现思路:动太队列的实现使用链表来实现,如下示意图:
其中Rear为队尾用于插入数据,而Front为队头,用于出队
第二部分:算法
  1)第一步:定义链表节点及队列,队列只需要包含一个头结一个尾即可。
1 typedef struct LinkList{
2     int data;
3     struct LinkList * next;
4 }NODE, * PNODE;
5 
6 typedef struct Queue{
7     PNODE front;
8     PNODE rear;
9 }QUEUE,* PQUEUE ;
View Code

  2)第二步:初始化,初始化时,我在此处并没有使用头结点,因为我觉点使用了头结点并非特别好(具体哪里不好我也说不清楚),此处初始化只需要将队头与队属置空即可

1 //初始化
2 bool init(PQUEUE pq){
3     pq->front=NULL;
4     pq->rear=pq->front;
5 }           
View Code

  3)第三步:入队,因为此处并没有使用头结点,所以每次入队元素的时候需要特别判断栈是否为空(暂时先不考虑判空算法),如果为空,需要特别处理一下(需要让队尾与队头指向同一个节点)

 1  bool inQueue(PQUEUE pq,int val){
 2     //创建新的节点 
 3     PNODE pnew=(PNODE)malloc(sizeof(NODE));
 4     if(NULL==pnew){
 5         printf("动态内存分配失败,元素入队失败!");
 6         return false;
 7     }
 8 
 9     pnew->data=val; 
10     pnew->next=NULL;
11 
12 
13     //判断是否为空    
14     if(isEmpty(pq)){
15         pq->rear=pnew;
16         pq->front=pq->rear; 
17     }
18     else{
19         pq->rear->next=pnew;
20         pq->rear=pnew;
21     }
22 
23 }
View Code

  4)第四步:出队,明显示需要判断队列是否为空

 1  int outQueue(PQUEUE pq){
 2     if(isEmpty(pq)){
 3         printf("队列已空,再无元素可供出队,程序将返回0!\n");
 4         return 0;
 5     }
 6     PNODE p=pq->front;
 7     int result=p->data;
 8     pq->front=pq->front->next;
 9     free(p);
10 }
View Code

  5)第五步:判断为空,因为没有使用头结点,所以我们只需要判断队尾或队头是否为空即可,如果使用了头结点,则需要判断队头的next指针域是否为空

1  bool isEmpty(PQUEUE pq){
2     if(pq->rear    ==NULL){
3         return true;
4     }
5     return false;
6 }
View Code

  6)第六步:输出

 1 void showElements(PQUEUE pq){
 2     if(isEmpty(pq)){
 3         printf("栈为空,无元素可供输出!\n");
 4         return;
 5     }
 6     PNODE p=pq->front;
 7     while(p!=NULL){
 8         printf("%d  ",p->data);
 9         p=p->next;
10     }
11     printf("\n");
12
View Code

  7)第七步:main方法

 1 int main(int argc, char *argv[])
 2 {
 3     QUEUE qu;
 4     init(&qu);
 5     showElements(&qu);
 6     outQueue(&qu);
 7     inQueue(&qu,1);
 8     inQueue(&qu,2);
 9     inQueue(&qu,3);
10     inQueue(&qu,4);
11     inQueue(&qu,5);
12     showElements(&qu);
13     outQueue(&qu);
14     showElements(&qu);
15     outQueue(&qu);
16     showElements(&qu);
17     return 0;
18 }
View Code

   结果:

       

 8) 程序下载(本程序中另附一份加入头结点的实现方式):点我

posted @ 2013-07-27 15:01  北风一叶  阅读(554)  评论(0编辑  收藏  举报