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