return僅僅能夠返回一個值,單向循環鏈表來實現隊列的時候能夠僅僅保留一個指針,由於保留rear指針能夠非常方便的表示出front指針,所以保留rear指針。
另外因為鏈表的第一個結點處理比較特殊,所以在初始化的時候須要單獨處理。鏈表實現的隊列思想也是第一個單元作為頭結點,不存放數據,rear指針指向的總是尾結點(在循環鏈表中也就是頭結點的上一個結點)。
2.實現方法
用帶表頭的單向循環鏈表來實現
#include <stdio.h>
#include <malloc.h>
#define NULL 0
typedef struct sq
{
int data;
struct sq *next;
}ElemSN;
ElemSN * in_quence(ElemSN *rear, int val) /*入隊函數*/
{
ElemSN *p;
p = (ElemSN *)malloc(sizeof(ElemSN));
p->data = val;
p->next = rear->next;
rear->next = p;
rear = rear->next;
return rear;
}
int out_quence(ElemSN *rear)
{
ElemSN *p = rear->next; /*rear的下一個結點是頭結點*/
int dat;
p = p->next; /*p此時才指向第一個有數據的結點(表頭結點的下一個結點)*/
dat = p->data;
rear->next->next = p->next; /*等價於head->next = p->next,由於rear的下一個結點是頭結點*/
free(p);
return dat;
}
void print_quence(ElemSN *rear)
{
ElemSN *p = rear->next;
p = p->next; /*指向第一個有數據的單元*/
do
{
printf("%d ", p->data);
p = p->next;
}while(p != rear->next);
}
ElemSN * clear_quence(ElemSN *rear)
{
ElemSN *p, *q;
p = rear->next;
while(p != p->next)
{
q = p->next;
p->next = q->next;
free(q);
}
return p;
}
int main()
{
ElemSN *rear, *s;
int dat[6] = {1, 2, 3, 4, 5, 6};
int i;
rear = (ElemSN *)malloc(sizeof(ElemSN)); /*表頭的創建*/
rear->data = NULL;
rear->next = rear;
for(i = 0; i < 6; i++)
{
rear = in_quence(rear, dat[i]);
print_quence(rear);
printf("\n");
}
printf("%d is out quence.\n", out_quence(rear)); /*出隊一個元素*/
print_quence(rear);
printf("\n");
rear = clear_quence(rear);
return 0;
}
程序執行截圖:

注意:使用不帶表頭的循環鏈表也是能夠實現的,可是對於隊列為空時rear指針的值為多少,第一個結點怎樣插入,以及隊列中僅僅有一個元素的時候出隊的操作都是須要特殊處理的。這里就不再詳細實現了,由於帶表頭的鏈表相對於不帶表頭的鏈表操作上有相當多的方便之處。
