該鍊錶實現的功能:
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...