模擬實現鍊錶

2022-07-31 18:09:11 字數 4574 閱讀 7796

該鍊錶實現的功能:

1.指定位置之前插入元素

2.列印鍊錶

3.刪除指定元素

4.刪除所有出現的指定元素

5.查詢指定元素

6.對鍊錶進行氣泡排序

7.頭插

8.頭刪

9.尾插

10.尾刪

11.銷毀鍊錶

下面進行分布詳解:

plinknode buynode(datatype x) // 為新增節點開闢空間,並賦值

因為新增節點很多地方都用,所以將新增節點,封裝成乙個函式

注意:對開闢空間是否成功要做判斷。

1 plinknode buynode(datatype x) //

新增節點開闢空間

29 newnode->data =x;

10 newnode->next =null;

11return

newnode;

12 }

plinknode find(plinklist plist, datatype x)  

公用的查詢函式,

返回找到元素的位址,

未找到返回null

1 plinknode find(plinklist plist, datatype x) //

公用的查詢函式

211 cur = cur->next;12}

13return

null;

14 }

void insert(plinklist plist,plinknode pos,datatype x)

將指定元素插入到指定位置

分為兩種情況

(1):當鍊表只有乙個元素時進行頭插

(2):鏈中有多個元素

例如: 將2插入3之前表

void remove(plinklist plist,datatype x)

只刪除第乙個匹配到的元素。

三種情況:

1.鍊錶只有乙個元素,進行頭刪

2.刪除的是鍊錶最後乙個元素,進行尾刪

3.刪除的是中間節點

完整**:

linklist.h

1

#ifndef _link_list_

2#define _link_list_

3#define _crt_secure_no_warnings 1

4 #include5 #include6 #include7

enum select //

j將所有選項用列舉列出來8;

23 typedef int

datatype;

24 typedef struct linknode //

節點25

linknode, *plinknode;

29 typedef struct linklist //

將頭指標單獨封裝在乙個結構體中

30linklist, *plinklist;

33void init(plinklist plist);//

初始化鍊錶

34void printlist(plinklist plist);//

列印鍊錶

35void destroylist(plinklist plist);//

銷毀鍊錶

36void pushfront(plinklist plist, datatype x);//

頭插37

void pushback(plinklist plist, datatype x);//

尾插38

void popfront(plinklist plist); //

頭刪39

void popback(plinklist plist);//

尾刪40

void insert(plinklist plist, plinknode pos, datatype x);//

指定位置之前插入

41 plinknode find(plinklist plist, datatype x); //

公用的查詢函式

42void search(plinklist plist, datatype x);//

查詢指定元素

43void

exit(plinklist plist);

44void remove(plinklist plist, datatype x); //

刪除指定元素

45void removeall(plinklist plist, datatype x); //

刪除所有出現的元素

46void erase(plinklist plist, plinknode pos);//

刪除指定位置的元素

47void bubblesort(plinklist plist);//

對鍊錶進行氣泡排序

48#endif

//_link_list_

linklist.c

#include"

linklist.h

"plinknode buynode(datatype x)

//新增節點開闢空間

newnode->data =x;

newnode->next =null;

return

newnode;

}void init(plinklist plist)//

初始化鍊錶

void printlist(plinklist plist)//

列印鍊錶

printf(

"null\n");

}void destroylist(plinklist plist)//

銷毀鍊錶

plist->phead =null;

}void pushfront(plinklist plist, datatype x)//

頭插void pushback(plinklist plist, datatype x) //

尾插 plinknode prev =null;

while (cur!=null)

prev->next=newnode;

}void popfront(plinklist plist) //

頭刪

else

}void popback(plinklist plist)//

尾刪

else

if (cur->next == null) //

鍊錶中只有乙個元素

else

free

(cur);

prev->next =null;

}}void insert(plinklist plist, plinknode pos, datatype x)//

指定位置之前插入

else

if (pos ==null)

else

cur = cur->next;}}

}plinknode find(plinklist plist, datatype x)

//公用的查詢函式

cur = cur->next;

}return

null;

}void search(plinklist plist, datatype x)//

查詢指定元素

printf(

"該元素不存在\n");

}void remove(plinklist plist, datatype x) //

刪除指定元素

else

if (cur->next == null) //

cur現在指向最後乙個元素

else

if (cur !=null)

else

}void removeall(plinklist plist, datatype x) //

刪除所有出現的元素

if (cur == plist->phead) //

鍊錶只有乙個元素時

else

if (cur->next == null) //

cur現在指向最後乙個元素

else

}}void erase(plinklist plist, plinknode pos)//

刪除指定位置的元素

else

if (cur ==pos)

else

del =cur;

prev->next = cur->next;

free

(del);

}}void bubblesort(plinklist plist)//

對鍊錶進行氣泡排序}}

}

test.c

1 #include"

linklist.h"2

void

menu()314

void

test()

158283}

84}85int

main()

86

陣列模擬實現鍊錶

為什麼不寫成struct?因為寫法麻煩,效率低。體現在每次需要new乙個記憶體,new的過程非常耗時,可能1s的時間會畫在new上面 直接上 看著 解釋好了 const int n 1e5 5 int a n idx,head 事先申請一塊大小為 n 的int型別的記憶體 idx 模擬申請一塊記憶體...

c 利用模版模擬實現鍊錶list

最近在學習 資料結構與演算法分析c 描述第三版 時,書中的list在編譯時會報錯,我在這裡已經進行了修改,而且為了方便 把內部類放在類外部實現,經過了實際的測試。具體如下 include using namespace std template typename object class list ...

c 模擬實現帶頭迴圈雙向鍊錶

思路 通單鏈表相似,不過該鍊錶節點包含兩個指標域和乙個資料域,乙個指標域指向前乙個,乙個指標域指向後乙個,其他通單鏈表相似 test.h define crt secure no warnings 1 2 帶頭雙向迴圈鍊錶增刪查改實現 typedef int ltdatatype typedef s...