在上篇博文中:【 c 】在單鏈表中插入乙個新節點的嘗試(一),我們最後提到了如果向單鏈表的開頭(起始位置)插入乙個節點,上篇博文中給出的程式顯然完成不了這任務。
這篇博文中,我們將解決這個問題,給出乙個在單鏈表中插入乙個新節點的通用程式,就是無論在**插入節點都可以。
下面我們來分析這個棘手的問題:
這篇博文中討論的案例在上篇博文中,也就是在乙個順序鍊錶中插入乙個節點。該鍊錶如下:
試圖將 3 插入到鍊錶中,如何做到?難點在**?
為了在鍊錶的起始位置插入乙個節點,函式必須修改根指標。但是,函式不能訪問變數root。
乙個稍微好點的解決辦法就是把乙個指向root的指標作為引數傳遞給函式。然後使用間接訪問操作,函式不僅可以獲得root(指向鍊錶第1個節點的指標,也就是根指標)的值,也可以向它儲存乙個新的指標值。這個引數的型別是什麼呢?
由於root是乙個指向node的指標,所以引數的型別固然是node **,也就是乙個指向node的指標的指標。
呼叫該函式的方式為:
result = sll_insert( &root, 3 );
下面給出程式:
//插入到乙個有序的單鏈表。函式的引數是乙個指向鍊錶根指標的指標以及需要插入的新值
#include #include #include "sll_node.h" //這個標頭檔案是前面自己建立的
#define false 0
#define true 1
int sll_insert( node **rootp, int new_value )
//為新節點分配記憶體,並把新值儲存到新節點中,如果記憶體分配失敗,函式返回false
new = ( node *)malloc( sizeof( node ) );
if( new == null )
new->value = new_value;
//把新節點插入到鍊錶中,並返回true
new->link = current; //新節點的指標指向當前節點
if( previous == null )
*rootp = new;
else
previous->link = new;
return true;
}
下面對上面的某些語句做出解釋:
previous = null;
我們需要這條語句,這樣我們就可以在以後檢查新值是否為鍊錶的第乙個節點。
current = *rootp;
這條語句對根指標引數執行間接訪問操作,得到的結果是root的值,也就是指向鍊錶第乙個節點的指標。
if( previous == null )
*rootp = new;
else
previous->link = new;
這條語句被新增到函式的最後。它用於檢查新值是否應該被新增到鍊錶的起始位置。如果是,我們使用間接訪問修改根指標,使它指向新節點。如果不是,修改前乙個節點的指標指向當前節點。
這個函式可以正確完成任務,而且在許多語言中,這是你能夠獲得的最佳方案。
在無頭單鏈表的乙個節點前插入乙個節點(不能遍歷)
例如 無頭鍊錶 a b c d 在節點c前面插入乙個節點 思路 乾坤大挪移 在c的後插入乙個節點,可以將c後面新插入的節點q的值與c的值交換 即可實現c節點之前插入節點的功能 void listentry listnode phead,linknode pos datatype value 若pos...
在無頭單鏈表的乙個非頭節點前插入乙個節點
思路 由於單鏈表的單向性,所以我們現在這個非頭結點的後面插入乙個節點,然後在交換這兩個節點就可以了。標頭檔案 鍊錶定義 include include include typedef int datatype typedef struct strnode node typedef struct st...
向有序環形單鏈表中插入新節點
乙個有序的環形單鏈表,從頭節點開始公升序,同時由最後乙個結點指回頭節點,給定乙個環形鍊錶的頭節點和乙個數值num,建立乙個數值為num的新節點,將該節點插入到環形單鏈表中,要求鍊錶始終有序 這道題就是簡單的遍歷環形單鏈表,然後插入新節點,只需要考慮一些特殊情況即可 鍊錶為空 新節點成環返回 鍊錶正常...