資料結構 基於鏈式儲存的佇列

2021-10-04 21:32:23 字數 2199 閱讀 1331

這是乙個基於帶頭結點單鏈表下實現的的鏈佇列,但是寫完我覺得**中存在如下問題(感覺不夠完美)

首先看定義:

#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...