單鏈表的儲存結構及操作

2021-10-22 23:52:23 字數 2096 閱讀 1619

在討論單鏈表(帶頭節點,不帶頭節點類似,這裡不再贅述)之前我們已經學習過線性表的順序儲存結構,我們知道它是有缺點的,最大的缺點就是插入和刪除元素時需要移動大量元素、並且需要預先分配儲存空間,但是優點是訪問方便。

線性表的鏈式儲存結構特點是用一組任意的儲存單元儲存線性表的資料元素,這組儲存單元可以是連續的,也可以是不連續的。其儲存結構如下:

/*線性表的鏈式儲存結構*/

typedef int elemtype;

typedef struct node

;typedef struct node* linklist;

單鏈表建立

單鏈表的建立過程就是乙個動態生成鍊錶的過程,按照插入方式可分為頭插法和尾插法,頭插法**實現如下:

linklist createlisthead(int n)

return l;

}

**中始終讓新節點放在第乙個節點的位置,即頭插法。我們也可以把新的節點放在最後面,即尾插法,**實現如下:

/*建立含有n個元素的帶有頭結點的單鏈表(尾插法)*/

linklist createlisttail(int n)

r->next = null;

return l;

}

**中用變數r來記錄每次上次插入後鍊錶的尾端位置,最後插入結束後將r的指標域置空。

單鏈表刪除

完成了單鏈表的建立,如果我們不想使用這個鍊錶了,想銷毀它,也就是在記憶體中釋放它,實現**如下:

/*置空鍊錶l*/

status clearlist(linklist l)

l->next = null;

return ok;

}

單鏈表元素獲取

實現獲取單鏈表第i個元素的實現**如下:

/*用e返回鍊錶l中第i元素的值*/

status getelem(linklist l, int i, elemtype*e)

if (!p || j > i)

*e = p->data;

return ok;

}

單鏈表的插入

單鏈表的插入只需要改變插入位置前後節點的關係即可。實現**如下:

/*在單鏈表l中第i個位置插入新的資料元素e*/

status listinsert(linklist l, int i, elemtype e)

if (!p || j > i)

s = (linklist)malloc(sizeof(node));

s->data = e;

s->next = p->next;

p->next = s;

return ok;

}

單鏈表的刪除

單鏈表刪除節點,其實就是修改待刪除節點的前後兩個節點的next指標域。實現**如下:

status listdelete(linklist l, int i, elemtype *e)

if (!(p->next) || j > i)

q = p->next;

p->next = q->next;

*e = q->data;

free(q);

return ok;

}

分析上述插入和刪除的**,可以發現它們其實就是由兩部分組成,第一部分是遍歷查詢第i個節點,第二部分就是插入或者刪除。從整個演算法來說,我們可以推算出它們的時間複雜度都是o(n)。如果我們不知道第i個元素的位置,單鏈表資料結構在插入和刪除操作上,與線性表的順序儲存結構相比是沒有太大的優勢的,但如果,我們希望從第i個位置插入10個元素,對於順序儲存結構來說嗎,每一次插入都要移動n-i個元素,每次都是o(n),而單鏈表只需要在第一次時,找到第i個位置的節點,此時為o(n),接下來只是簡單的賦值移動指標而已,時間複雜度都是o(1),對於插入刪除資料越頻繁的操作,單鏈表的效率優勢就越明顯。

單鏈表及雙鏈表操作

0.刪除 單鏈表 若要刪除乙個節點p,需知道前乙個節點的位置 node searchpr node h,int k return null 沒有值為k的節點,返回空 void deletnode node h,int k 0.1.節點定義 typedef struct nodenode 1.鍊錶建立...

單鏈表的建立及操作

1 單鏈表的結構體演算法 typedef char elemtype typedef struct node lnode,linklist lnode為結點型別,linklist為指向結點的指標型別 2 建立單鏈表 1 頭插法 從表尾到表頭逆向建立 演算法思路 1 首先建立乙個頭結點h,並使頭結點的...

單鏈表的結構及其操作

單鏈表的結構及其操作 內容 單鏈表及其操作 include include typedef int elemtype typedef struct lnode lnode,linklist 單鏈表的基本操作 lnode initlist 初始化單鏈表 lnode getnode linklist l...