單鏈表的建立有兩種方式:頭插法和尾插法。
這兩種方法最大的區別在於對輸入資料的儲存方式不同,頭插是逆序,尾插是順序,尾插較於符合大多數人的習慣。但理解頭插法對於理解單鏈表的插入和刪除操作會有很大的幫助。
不論是哪種方法,了解其建立原理理清思路是十分重要的一步,**其次。
對於乙個單鏈表來說,分為有頭節點的單鏈表和無頭節點的單鏈表,頭結點中不含資料域,頭指標指向頭結點;而無頭節點的單鏈表中第乙個節點的資料域可以是鍊錶長度也可以是資料。
下面先介紹帶有頭結點的單鏈表兩種建立方式。
1.準備工作:定義乙個結構體型別重新命名為node(方便引用,此處也可不用typedef語句)
typedef struct n
node;
2.頭插和尾插的原理大體上都是三步:為新節點分配空間---->鏈結新節點---->給新節點輸入資料
區別在於鏈結新節點這一步。
顧名思義,尾插則是將新節點鏈結到鍊錶的尾部;
頭插則是將新節點鏈結到鍊錶的頭結點的後面,即不斷的在頭節點和第乙個節點之間插入新節點,每插入乙個新節點,新節點就變為第乙個節點,(可理解為插隊)以此迴圈。
這裡先定義三個node 型指標變數,並建立乙個頭節點。
node *head,*current,*tail;
current=(node*)malloc(sizeof(node));//頭節點建立
head:頭指標,指向頭結點的指標變數;
current:指向新節點的指標變數;
tail:尾指標,隨鍊錶節點的增加指向鍊錶的最後乙個節點的指標變數,只在尾插法中用到尾指標。
3.根據三步原理逐步寫出相應**
a:為新節點分配空間;
current=(node*)malloc(sizeof(node));
tail->next=current;//原煉表尾節點指標域指向新節點
tail=current;//尾指標指向新鏈結的新節點,新節點變鍊錶的尾節點(尾指標始終指向尾節點)
頭插法關鍵**:
current->next=head->next;//新節點的指標域指向*頭結點的指標域原來指向的節點(即第乙個節點)*
head->next=current;//頭節點的指標域指向新節點,新節點變為第乙個節點。
因在原建立的鍊錶中頭節點之後的所有節點均通過head->next指向第乙個節點來鏈結,故
若先讓頭節點的指標域(head->next)指向新節點,則原指向關係已丟失,原有頭節點之後的節點將無法定址。
c.給新節點輸入資料;
scanf("%d",¤t->a);
接下來給出兩種方法帶頭節點單鏈表建立的具體**,均用函式實現,函式返回值為node 指標型別,返回鍊錶的頭指標,函式形參為空,以使用者輸入非整形資料為結束鍊錶建立標誌。(也可將函式形參定義為鍊錶的指定長度)
尾插法完整**
node *create_tail(void)//有頭結點
tail->next=null;//尾節點指標域指向null,結束鍊錶建立
return head;//返回煉表頭指標
}//尾插法//順序
頭插法完整**
node *create_head(void)
return head;//返回頭指標
}//頭插法//逆序
看完後希望能對你有幫助~ 頭插法和尾插法建立單鏈表
頭插法和尾插法建立單鏈表 include using namespace std typedef int elemtype typedef struct lnode linklist 頭插法建表 從尾部乙個乙個往前插入 void createlisthead linklist l,elemtype ...
頭插法與尾插法建立單鏈表
單鏈表的建立一般主流分為兩種建立方式 頭插法和尾插法。頭插法1 建立頭節點,維護head指標 引用 來指向頭節點 2 newnode表示待插入節點,維護newnode指向新節點 3 case1 當鍊表為空時,即首次插入新節點,將head.next指向新插入節點,即head.next newnode ...
頭插法和尾插法建立單鏈表
頭插法建立單鏈表 include include typedef struct lnodenode,linklist linklist headinsert linklist 頭插法建立單鏈表 void output linklist 遍歷輸出 int main void 頭插法建立單鏈表 link...