單鏈表的基本操作及各操作對應典題

2021-09-10 23:53:26 字數 3101 閱讀 6104

在單鏈表中,我們假定每乙個節點(結構體)用linklist表示,乙個節點包含乙個儲存元素的資料域(用名字為data的一維陣列表示)和儲存後繼元素位置的指標域(用next表示)。節點宣告如下

typedef struct node

linklist; //節點

1.建立單鏈表

(1)頭插法建立單鏈表:從乙個空表開始讀取陣列中的元素,生成新節點,將讀取的資料放到新節點的資料域中,然後將新節點插入到當前鍊錶的頭結點之前,直到資料讀取結束為止。因為新資料總是被插入到舊資料的前面,因此頭插法會導致列印出來的資料與輸入的資料順序恰好相反完成建表之後將鍊錶之中的資料依次列印,例程如下:

void creat_list(linklist **head)		//頭插法建表 } 	

void print(linklist head) //列印鍊錶中的資料

}

(2)尾插法建表:與頭插法相反,尾插法將新資料插入到原有資料之後,因此避免了頭插法的缺陷,採用尾插法建立的鍊錶,輸出資料的順序與輸入的順序相同,輸出鍊錶資料部分與頭插法一樣,例程如下:

void creat_list(linklist *head)

r -> next = null; //尾節點指標域置空 }

void print(linklist head) //列印鍊錶中的資料

}

2.查詢鍊錶中元素值演算法:從鍊錶第乙個有資料的節點開始向後遍歷整個鍊錶,直到有乙個資料域的值與所找的值相等為止。

int find(linklist head, int e)

3.插入節點的操作:

對應的語句為:s -> next = p -> next;p -> = s;注意:這兩條語句順序不可以顛倒,如果先執行第二句會導致指向b節點的指標就不存在了,在執行第一句的話相當於執行的是「s -> next = s;」。例如:在有序單鏈表(從小到大排列),向單鏈表中插入乙個資料元素為x的節點,使得在插入之後鍊錶依然保持有序。演算法:從第乙個有資料的節點開始向後遍歷鍊錶並進行資料比較,找到合適的位置進行插入操作。例程如下:

void insert(linklist *head, int x)		//遞增鍊錶插入 

s -> next = pre -> next; //插入節點操作

pre -> next = s;

}

4.刪除節點的操作:先在單鏈表中找到要刪除的節點的前驅節點(第i - 1個節點),再刪除其後的節點。注:對於單鏈表,刪除操作一定要有前驅節點

例題:(1)設計演算法刪除單鏈表中第乙個值為x的節點。演算法如下:

int delete(linklist *head, int x)

if(p)

else

return 0;

}

(2)有乙個帶頭結點的單鏈表,設計演算法刪除其中第1.3.5…即奇數號的節點,演算法為:用s遍歷鍊錶中為奇數號的節點,用pre指向其前驅節點,以完成刪除操作。時間複雜度o(n),空間複雜度o(1)。

void delete_jishu(linklist *head)

}

(3)刪除並釋放帶有頭結點的鍊錶中的所有節點,用兩個結構指標來遍歷鍊錶,並進行同步後移和釋放節點操作。例程如下:

void delete_all(linklist *head)

free(pre); //最後釋放pre節點

puts("刪除成功");

}

(4)設計乙個帶頭結點鍊錶中值大於或等於min、小於或等於max之間的節點,(若存在這樣的節點)釋放被刪除節點的空間,這裡給出min和max。演算法:用p從第乙個有資料的節點開始向後遍歷整個鍊錶,若節點p滿足刪除條件,則進行刪除操作並將p下移乙個節點。例程如下:

void delete_data(linklist *head, int min, int max)

else}}

所有**如下:(由於順序問題,直接一起執行有的函式會出錯 )

#include#include#define maxsize 10

typedef struct node

linklist; //節點

typedef struct node *linklist; //結構指標

void creat_list(linklist *head)

r -> next = null; //尾節點指標域置空 }

void print(linklist head) //列印鍊錶中的資料

//printf("鍊錶中此時沒有資料");

puts("");

}int find(linklist head, int e)

void insert(linklist *head, int x) //遞增鍊錶插入

s -> next = pre -> next; //插入節點操作

pre -> next = s;

}int delete(linklist *head, int x)

if(p)

else

return 0;

}void delete_jishu(linklist *head) }

void delete_all(linklist *head)

free(pre); //最後釋放pre節點

puts("刪除成功");

}void delete_data(linklist *head, int min, int max)

else

}}int main()

單鏈表的建立及基本操作

鍊錶作為資料結構中最容易理解的結構,我們需要對它的基本操作非常熟悉 結點結構 typedef struct node node,snode 基本操作 初始化 初始化 snode init 建立鍊錶 頭插法建立單鏈表 snode create1 int n return head 尾插法建立單鏈表 s...

單鏈表基本操作

include include include include includeusing namespace std typedef struct node node,plinklist plinklist createfromhead node pstnode node malloc sizeof...

單鏈表基本操作

單鏈表的初始化,建立,插入,查詢,刪除。author wang yong date 2010.8.19 include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist...