《c和指標》第12章-使用結構和指標
針對插入到乙個有序的單鏈表的小程式所做的除錯:
原理都是儲存乙個指向鍊錶當前節點之前的那個節點的指標。
第一次:函式的引數是指向節點的指標
問題:當插入到鍊錶的起始位置時,需要修改根指標,但此時函式中的根指標只是原指標的乙份拷貝,無法修改。可以通過將根指標宣告為全域性變數來修改它,但這樣一來,這個函式只對這個鍊錶起作用。
第二次:函式的引數是指向節點的指標的指標
優點:將指向鍊錶當前節點之前的節點指標初始化為null, 通過判斷該指標是否為null來完善插入到鍊錶起始位置的**,這次程式可以修改指向起始節點的指標。
問題:必須將插入到鍊錶起始位置作為一種特殊情況。
第三次:把關注點放在需要修改的節點的next欄位
分析如下:
typedef struct node
struct node *next; //注意這裡next部分放在前面
int data;
}node;
需要修改的是某個節點的next段,因此要先儲存它,然後指標指向下乙個節點。
node **linkp;
node *current;
linkp=¤t->next;
current=*linkp;
這段**中,*linkp是前乙個節點的next欄位內容,即下個節點的位址。當需要插入新節點時,只需將新節點的next指向current,然後將*linkp修改為這個新節點的位址。與之前的用乙個previous指標儲存之前節點的指標相比,優點就在於,不需要將起始位置作為特殊情況判斷,因為*linkp本身就是指向第乙個節點的指標,可以直接修改,而previous初始為null,無法取得previous->next.
以下為函式**:
int sll_insert(node **rootp,int value)
總結:寫出乙個正確的程式不難,寫出乙個好的程式才需要實力。反覆除錯,精益求精。
3 兩個有序單鏈表合併為乙個有序的單鏈表
單鏈表的基本操作 包括 鍊錶的建立 頭插法,尾插法 鍊錶的遍歷,兩個單調遞增的鍊錶合併為乙個單調遞增的鍊錶,兩個單調遞增的鍊錶合併為乙個單調遞減的鍊錶 include include using namespace std 定義單鏈表的接點 typedef struct nodenodes 將兩個單...
將兩個單鏈表合併成乙個有序單鏈表
3.10 4.將兩個單鏈表合併成乙個有序單鏈表 由於以前初學c 時所寫的 不堪入目,不符合規範性,完整性和魯棒性,於是今日重寫其核心演算法以警示自己。node merge node p1head,node p2head else return pmergedhead 思路 因為鍊錶可以由結點輕鬆構造...
單鏈表 兩個有序鍊錶合併為乙個有序
1 new乙個新的鍊錶,定義結點用來遍歷兩個待排序的鍊錶 2 兩個待排序的鍊錶,哪個頭結點小,哪個作為新鍊錶的頭結點 3 對兩個鍊錶的結點進行比較,讓新鍊錶的next指向較小的結點,更新新鍊錶的尾巴,繼續比較直至某個鍊錶遍歷結束。4 遍歷結束,如果哪個鍊錶沒遍歷完,將剩下的幾點串在新鍊錶的後面,即當...