DS之單鏈表

2021-07-02 03:43:00 字數 3160 閱讀 8183

單鏈表概述

線性表的順序表的優點是隨機訪問表中的任意元素,但是它的缺點也是明顯的,那就是在進行基本操作中的向順序表中插入和刪除資料元素時需要移動大量的元素。因此產生線性表的另一種鏈式儲存結構,也就是單鏈表。它沒有順序表的弱點,但是也失去了順序表的優點。

線性表的鏈式儲存結構的特點是用一組任意的儲存單元線性表的資料元素(這組儲存單元可以是連續的,也可以是不連續的)。因此,為了表示每個資料元素ai與其直接後繼資料元素ai+1之間的邏輯關係,對資料元素ai來說,除了儲存其本身的資訊之外,還需要儲存乙個指示其直接後繼的資訊(即直接後繼的村相互位置)。這兩部分資訊組成資料元素ai的儲存映像,稱為結點。它包括兩個域:其中儲存資料元素資訊的域稱為資料域,儲存直接後繼儲存位置的域稱為指標域。指標域儲存的資訊稱為指標或鏈。n個結點的鏈結成乙個鍊錶,即為線性表的鏈式儲存結構。又由於此鍊錶的每個結點中只包含乙個指標域,故又稱為線性鍊錶或單鏈表。

下面示例

線性表(

zhao

,qian

,sun, li,

zhou,wu

,zheng

,wang

)線性鍊錶

頭指標

h31儲存位址資料域指標域

1li43

7qian

1313sun1

19wang

null 25

wu37

31zhao737

zheng

1943

zhou

2整個鍊錶的訪問必須從頭指標開始進行,頭指標指示鍊錶中的第乙個結點(即第乙個資料元素的儲存映像)的儲存位置。同時由於最後乙個資料元素沒有直接後繼,則線性鍊錶中最後乙個結點的指標為「null」。

用線性鍊錶表示線性表時,資料元素之間的邏輯關係是由結點中的指標指示的。換句話說,指標為資料元素之間的邏輯關係的映像,則邏輯上相鄰的兩個資料元素其儲存的物理位置不要求緊鄰,這種儲存結構為非順序儲存映像或鏈式映像。

通常我們把鍊錶畫成用箭頭相連線的結點的序列,結點之間的箭頭表示鏈域中的指標。因此上述的示例的線性鍊錶的邏輯狀態為:

單鏈表的儲存結構為:

typedef struct lnode//重新定義結構型別為lnode

lnode,*linklist//定義的lnode型別的變數linklist

有時我們在單鏈表中的第乙個頭結點之前附設乙個結點,稱為頭結點。因此帶頭結點的單鏈表表示為:

單鏈表的基本操作:

0基本操作前的準備

#include using namespace std;

#include #include #define true 1

#define false 0

#define ok 1

#define error 0

#define overflow -2

typedef int elemtype;

typedef int status;

typedef struct lnode//重新定義結構型別為lnode

lnode,*linklist;//定義的lnode型別的變數linklist

1初始化鍊錶

//1初始化鍊錶

status initlist(linklist &l)

l->next=null;

return ok;

}

2銷毀鍊錶

//2銷毀鍊錶

status destorylist(linklist &l)

return ok;

}

3清空鍊錶

//3清空鍊錶

status clearlist(linklist &l)

l->next=null;

return ok;

}

4判斷鍊錶是否為空

//4判斷鍊錶是否為空

status listempty(linklist l)

else

}

5返回鍊錶的長度

status listlength (linklist l)

return i;

}

6返回線性表第i個資料元素的值

//6返回線性表第i個資料元素的值

status getelem_l(linklist l,int i,elemtype &e)//l為帶頭結點的單鏈表的頭指標

if(!p||j>i)

e=p->data; //取第i個元素

return ok;

}

7向鍊錶插入資料元素

//7向鍊錶插入資料元素

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

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

linklist s=(linklist)malloc(sizeof(lnode)); //生成新結點

s->data=e;

s->next=p->next; //插入l中

p->next=s;

return ok;

}

8刪除鍊錶中的元素

//8刪除鍊錶中的元素

status listdelete_l(linklist &l,int i,elemtype &e)

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

//刪除位置不合理

linklist q=p->next;

p->next=q->next;//刪除並釋放結點

e=q->data;

free(q);

return ok;

}

DS單鏈表 類實現

用c 語言和類實現單鏈表,含頭結點 屬性包括 data資料域 next指標域 操作包括 插入 刪除 查詢 注意 單鏈表不是陣列,所以位置從1開始對應首結點,頭結點不放資料 n 第1行先輸入n表示有n個資料,接著輸入n個資料 第2行輸入要插入的位置和新資料 第3行輸入要插入的位置和新資料 第4行輸入要...

DS單鏈表 結點交換

題目 問題 b ds單鏈表 結點交換 時間限制 1 sec 記憶體限制 128 mb 提交 555 解決 385 提交 狀態 討論版 題目描述 用c 實現含頭結點的單鏈表,然後實現單鏈表的兩個結點交換位置。注意不能簡單交換兩個結點包含資料,必須通過修改指標來實現兩個結點的位置交換 交換函式定義可以參...

單鏈表之排序單鏈表

package list public class sortedsinglylist extends singlylist 將values陣列中的所有物件按值大小插入 public sortedsinglylist t values 過載深拷貝,由單鏈表構建排序單鏈表 public sortedsi...