1. 程式人生 > 實用技巧 >資料結構_線性表之連結串列(1)

資料結構_線性表之連結串列(1)

這是連結串列的第一篇。連結串列方便插入刪除,但是不是隨機存取。實際應用中,用於頻繁的增加刪除操作。

1.基礎知識。

單鏈表:

<1>帶頭結點單鏈表

L為頭指標,指向第一個結點,當有頭結點時,第一個結點為頭結點;當沒有頭結點時,第一個結點為儲存第一個元素的a1結點

<2>不帶頭結點的單鏈表

兩者區別:通常使用有頭結點的連結串列,因為有頭結點比較方便。因為對於類似頭插法這樣的操作,需要對第一個儲存元素的結點進行操作時,很明顯帶有頭結點的頭指標可以保持不變,因為元素操作都在頭結點與a1結點之間完成;而對於沒有頭結點的連結串列,需要頻繁改變頭指標的位置,才能保持頭指標始終指向第一個結點。

2.基本操作

<1>頭插法建立單鏈表:總是在頭部操作,進行插值

程式碼:

 typedef struct Node{
      int data;
      struct Node *next;
 }Node;
//頭插法建立單鏈表,插入的元素總在頭結點之後
Node *CreateList_L(LinkList &L,int n){//前提L已經初始化完成 
    Node *p;    int num;//p儲存結點,num儲存資料
    L = (Node*)malloc(sizeof(Node));//建立頭結點
    L->next = NULL;
    
for(int i=0;i<n;i++){ p = (Node*)malloc(sizeof(Node));//建立新的結點 cin>>num; p->data = num;//存入結點資料域 p->next = L->next;//p指向下一個 L->next = p;//再將p給單鏈表L的表頭 } return L; //返回值為Node*型 }

<2>尾插法建立單鏈表:總是在尾部操作,進行插值

尾插法需要增加一個尾指標,尾指標總是用於指向最後一個尾結點

第一步:

第二步:

以此類推,每一次r都往後移動。

程式碼:

 typedef struct Node{
      int data;
      struct Node *next;
 }Node;
//尾插法建立單鏈表,插入的元素總在最後一個位置
Node *CreateList_L(LinkList &L,int n){//前提L已經初始化完成 
    Node *p,*r;    int num;//p儲存結點,num儲存資料,r用於指向最後一個結點
    L = (Node*)malloc(sizeof(Node));//建立頭結點
    L->next = NULL;
    for(int i=0;i<n;i++){
        p = (Node*)malloc(sizeof(Node));//建立新的結點
        cin>>num;
        p->data = num;//存入結點資料域
        r->next = p;//p指向下一個 
        r = p;//r指標後移,指向尾結點
    }
     r->next = NULL;//插入操作結束時,尾結點置空
    return L; //返回值為Node*型
}