單向動態鍊錶

2022-04-28 19:12:12 字數 3484 閱讀 4585

#include #include #define ok 1

#define error 0

#define true 1

#define false 0

typedef int status;

typedef int elemtype;

typedef struct lnode

lnode,*linklist;

圖示:當鍊表為空時的插入情況

圖示:當鍊表非空時的插入情況

* 從表頭到表尾逆向建立鍊錶,包含n個節點

* 需傳入表頭指標的指標,因為需要對表頭指標進行重定向

* 但凡其傳入的引數需要改變原值的都需要傳入其指標,包括指標本身

* 在p節點後插入in節點方法:in先和p指向相同的後繼元,p再指向in

*/void createlist(linklist * l, int n)

}圖示:鍊錶為空,p一開始就指向null,不滿足直接退出

圖示:鍊錶非空,while退出條件是ji,退出時,p剛好指向第i個節點

圖示:鍊錶非空,但i的位置為處沒有節點,while退出條件是pnull,不滿足

* 從鍊錶中獲取第 i 個元素的資料。

* 思路:可以從第乙個元素開始p和j同步走,如果j=i滿足退出,則p指向第i個節點

* 若是空表,則一開始p就為空了,直接返回error

* 若不是空表,但p到達了null,說明i不滿足,也直接返回error

*/status getelem(linklist l, int i, elemtype *e)

if(!p || j>i)

return error; /* 若p到達null,則必然沒找到 */

*e = p->data;

return ok;

}圖示:鍊錶為空時插入到第乙個

圖示:鍊錶非空時,先將p索引到i-1下,然後在i-1後插入

圖示:鍊錶非空時,插入位置剛好在表尾巴

圖示:鍊錶非空時,插入位置超過了表尾

* 在第i個位置前插入e

* 思路: 在第i個位置前插入,則插入後將取代i的位置,原來i的位置變成i+1

* 需先找打i-1的位置,同樣讓p和j同步,j=i-1時則p剛好指向i-1的位置

*/status listinsert(linklist l, int i, elemtype e)

if(!p || j>i-1) /* i小於1或者大於表長加1*/

return error;

s = (linklist)malloc(sizeof(lnode));

s->data = e;

s->next = p->next; /* s先和p指向相同的後繼元 */

p->next = s; /* p再指向s */

return ok;

}圖示:鍊錶為空時沒有元素可刪除,顯然不符合

圖示:鍊錶不為空時,p剛好索引到i-1,while退出條件是j==i-1正常刪除

圖示:鍊錶不為空時,p剛好索引到i-1,while退出條件是p->next == null,則i處於null位置或更後面,i位置錯誤,不符合

圖示:刪除步驟

/**

* 刪除第i個位置的元素

* 思路:先索引到第i-1,這時p指向i-1,然後讓q指向i臨時儲存起來

* 然後斷開i,即前乙個不再指向它,而是指向它的後乙個,最後將q釋放

*/status listdelete(linklist l, int i, elemtype * e)

if(!(p->next) || j>i-1) /* 刪除位置不合理 */

return error;

q = p->next; /* 先讓q指向p的後繼元即要刪除的位置,儲存起來 */

p->next = q->next; /* 將刪除的位置斷鏈,即前乙個不再指向它,而是指向它的後乙個 */

*e = q->data;

free(q);

return ok;

}

圖示:初始條件pa,pb指標其第乙個節點,lc和pc指向la頭結點,比較 pa->data <= pb->data,滿足則pc鏈結向pa的那個節點,同時pc移到pa位置處,pa指向下乙個節點

圖示:比較 pa->data <= pb->data,不滿足則pc鏈結向pb的那個節點,同時pc移到pb位置處,pb指向下乙個節點

/**

* 歸併遞增鍊錶la和lb得到同樣遞增鍊錶lc

* 思路:用三個指標pa,pb,pc,初始條件pa,pb指標其第乙個節點,lc和pc指向la頭結點

* 讓pa,pb指向剩餘鍊錶的首部,pc總是指向lc的最後乙個節點

*/void mergelist(linklist la, linklist lb, linklist * lc)

else

}pc->next = pa ? pa : pb; /* 插入剩餘段 */

free(lb); /* 釋放lb的頭結點 */

}

void printlist(linklist l)

printf("\n");

}

單向動態鍊錶

什麼是鍊錶 鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。相比於線性表順序結構,操...

鍊錶 1 之單向動態鍊錶

題目 多函式程式設計 struct word char c 20 struct word next 函式1 一輸入一串單詞字串,假設每個單詞長度不超過19個字元,用空格隔開,把每個單詞資料存在乙個單向動態鍊錶 簡稱單詞鍊錶 裡的乙個節點。struct word create word list 生成...

Python 實現單向動態鍊錶

鍊錶顧名思義就是 鏈 鍊錶是一種動態資料結構,他的特點是用一組任意的儲存單元存放資料元素。鍊錶中每乙個元素成為 結點 每乙個結點都是由資料域和指標域組成的。跟陣列不同鍊錶不用預先定義大小,而且硬體支援的話可以無限擴充套件。陣列需要預先定義大小,無法適應資料動態地增減,資料小於定義的長度會浪費記憶體,...