這是乙個基於帶頭結點單鏈表下實現的的鏈佇列,但是寫完我覺得**中存在如下問題(感覺不夠完美)
首先看定義:
#define elemtype int
typedef struct linknode linknode;
typedef struct linkqueue;
初始時隊首指標和隊尾指標都指向頭結點
帶頭結點的鏈佇列中隊首指標指向頭結點,隊首元素應該時q.front->next
所以初始化操作這樣寫:
// 佇列帶頭結點初始化
void initqueue(linkqueue &q)
這樣就產生了兩種判斷隊列為空的方法
// 判斷佇列是否為空
bool queueisempty(linkqueue q)
因為刪除的時候需要呼叫判空函式,可以這樣寫
bool queuepop(linkqueue &q)
if(q.front->next == q.rear)
linknode *tmp = q.front->next; // 等待出隊元素
q.front->next = q.front->next->next; // // 從佇列中刪除出隊元素
free(tmp); // 釋放空間
return true;
}
上面**段中第二個if判斷必不可少,如果缺了,那麼q.front和q.rear就不會相等了,這樣的話即使佇列已經為空,但是佇列判空函式依然會判斷非空。但是由於多了這個if我總感覺不夠完美。如果判空函式採用第二種方法只根據q.front->next == null來判斷,就可以刪除這個if,但是這樣q.rear就有可能成為野指標,同樣感覺存在安全隱患。
完整**:
// 基於帶頭結點單鏈表
#include #include #define elemtype int
typedef struct linknode linknode;
typedef struct linkqueue;
// 前置函式宣告
bool queueisempty(linkqueue q);
// 佇列帶頭結點初始化
void initqueue(linkqueue &q)
bool queuepush(linkqueue &q, elemtype e)
newnode->data = e;
newnode->next = null; // 新入隊元素後面為空
q.rear->next = newnode; // 插入到隊尾
q.rear = newnode; // 修改隊尾指標指向新的隊尾元素
return true;
}bool queuepop(linkqueue &q)
if(q.front->next == q.rear)
linknode *tmp = q.front->next; // 等待出隊元素
q.front->next = q.front->next->next; // // 從佇列中刪除出隊元素
free(tmp); // 釋放空間
return true;
}// 獲取隊首元素
elemtype getfront(linkqueue q)
return q.front->next->data;
}// 判斷佇列是否為空
bool queueisempty(linkqueue q)
int queuesize(linkqueue q)
return length;
}bool queuedestroy(linkqueue &q) // 銷毀佇列
q.front = q.rear = null;
return true;
}int main()
printf("length = %d\n", queuesize(q));
for(int i = 0; i < 10; i++)
printf("length = %d\n", queuesize(q));
getfront(q);
return 0;
}
資料結構 佇列(鏈式儲存)
資料結構和演算法 摘要 前一篇部落格主要討論迴圈佇列,但是迴圈佇列都是事先申請好空間,使用期間是不能釋放的。但是鏈佇列,每次都可以進行申請和釋放結點。再無法預估佇列長度的時候,我們可以考慮用鏈佇列。1 設計佇列資料結構 結點結構 typedef struct queue node queue nod...
資料結構 佇列的鏈式儲存
佇列的順序儲存 佇列的鏈式儲存 佇列的應用 列印楊輝三角 include include typedef struct nodenode,nodep typedef struct baglinklist linklistp void initialquene linklistp q intpushq...
資料結構 佇列 順序儲存結構佇列 鏈式儲存結構佇列
佇列是一種只允許在一端進行插入操作,而在另外一端進行刪除操作的線性表,特徵是先進先出,包括 順序儲存結 構佇列 鏈式儲存結構佇列。重點說明 迴圈佇列和鏈隊。在佇列中front為隊頭指標 rear為隊尾指標 佇列 佇列空的條件 rear front 佇列滿的條件 rear 1 queuesize fr...