佇列的鍊錶實現和佇列的陣列實現相比區別還是很大的.
首先我們需要2個指標front
和rear
, 分別指向頭節點和尾節點.
這兩個指標不屬於節點本身的資料, 因此我們把這個兩個指標單獨定義成乙個結構體.
因此, 佇列的鍊錶實現一共需要2個結構體, 乙個儲存佇列資料本身, 乙個儲存頭和尾指標.
在createqueue()
初始化函式中, 讓front
指標指向null
, 通過front指標已經足夠
判斷隊列為空的情況, 注意這裡不能初始化rear
指標也等於null
, 否則再指向入隊操作
時就會出現問題.
在入隊函式add()
中, 首先根據front
指標是否等於null
來判斷佇列是否是初次插入元素.
在出隊函式del()
中, 先判斷佇列是否為空.
c語言完整**實現如下:
#include #include struct queue ;
struct queuepointer ;
typedef struct queue node;
typedef struct queue* link;
typedef struct queuepointer pnode;
typedef struct queuepointer* pointer;
// 函式宣告
pointer createqueue (pointer p);
void add (pointer p, int x);
int del (pointer p);
void print (pointer p);
int main ()
print(qptr2);
del(qptr2);
del(qptr2);
del(qptr2);
print(qptr2);
/*複雜測試結束*/
/* 對頭隊尾指向同乙個節點測試開始 */
pointer qptr3 = createqueue(qptr);
add(qptr3, 666);
del(qptr3);
add(qptr3, 999);
print(qptr3);
/* 對頭隊尾指向同乙個節點測試結束 */
return 0;
}// 建立空佇列
pointer createqueue (pointer p)
// 入隊
void add (pointer p, int x)
p->rear->next = tmp;
p->rear = tmp;
}// 出隊
// 返回頭結點元素的值
int del (pointer p)
link tmp = p->front;
int tmpvalue = p->front->data;
p->front = p->front->next;
free(tmp);
return tmpvalue;
}// 列印
void print (pointer p) else
printf("p->front->data = %d\n", p->front->data);
printf("p->rear->data = %d\n", p->rear->data);
printf("佇列的總長度為: %d\n", length);
}printf("\n\n");
}
佇列 鍊錶實現
1 rlc分割.cpp 定義控制台應用程式的入口點。2 3 4 include stdafx.h 5 include6 7 typedef char elemtype 8 9 typedef struct qnode qnode queueptr 13 14 typedef structlinkqu...
佇列(鍊錶實現)
鍊錶佇列 front 為隊頭指標 煉表頭節點 rear 為隊尾指標 include includetypedef struct list tlist t 要改變乙個變數的值,需要傳入變數的位址作引數 要改變乙個指標的值,需要傳入該指標的位址作引數 即指標的指標 void insertqueue li...
佇列(鍊錶實現)
1.思路 定義結構體node表示煉表裡的節點,結構體linklist表示鍊錶,選用兩個首尾指標進行基本操作。2.include using namespace std struct node struct linklist void create linklist list node tmp nod...