C语言线性表之队列算法一:链式队列
之前写过《C语言实现线性表之栈算法》,《C语言实现线性表之链表算法》《C语言实现线性表连续存储结构相关算法》三篇关于算法的文章,但这三篇文章中只有大段的代码,并没有相关的解说,对于当时的我来说,思路会比较清晰,但过一段时间后,这些个算法为什么这样实现,也许就想不起来了,所以本文增加一些解说性的文字,如果各位看官看的不爽,恳请不吝赐教。
一、定义
队列:无非就是一种先进先出的一种存储结构,可以用以下的示意图进行演示。
二、分类
1)动态队列:通常使用链表来实现
2)静态队列:使用数组来实现
三、动态队列的实现
第一部分:其本实现思路:动太队列的实现使用链表来实现,如下示意图:
其中Rear为队尾用于插入数据,而Front为队头,用于出队
第二部分:算法
1)第一步:定义链表节点及队列,队列只需要包含一个头结一个尾即可。
View Code
View Code
View Code
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 ;
2)第二步:初始化,初始化时,我在此处并没有使用头结点,因为我觉点使用了头结点并非特别好(具体哪里不好我也说不清楚),此处初始化只需要将队头与队属置空即可
1 //初始化 2 bool init(PQUEUE pq){ 3 pq->front=NULL; 4 pq->rear=pq->front; 5 }
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 }
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 }
5)第五步:判断为空,因为没有使用头结点,所以我们只需要判断队尾或队头是否为空即可,如果使用了头结点,则需要判断队头的next指针域是否为空
1 bool isEmpty(PQUEUE pq){ 2 if(pq->rear ==NULL){ 3 return true; 4 } 5 return false; 6 }
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 }
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 }
结果:
8) 程序下载(本程序中另附一份加入头结点的实现方式):点我