資料結構 鍊錶基本操作(增 刪 查 改)

2021-09-25 05:51:30 字數 3538 閱讀 6423

鍊錶是一種物理儲存結構上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。

根據鍊錶是否是單向的、是否帶頭結點、是否迴圈可以將量表分為 8 種不同的結構。但是這裡我們只研究最簡單的不帶頭結點的單向不迴圈鍊錶,以及最難的帶頭結點的雙向迴圈鍊錶

1. 不帶頭的單向不迴圈鍊錶,結構簡單,一般不會單獨用來存資料。實際中更多是作為其他資料結構的子結構,如雜湊桶、圖的鄰接表等等。另外這種結構在筆試面試的重點和常考點。

2. 帶頭雙向迴圈鍊錶:結構最複雜,一般用在單獨儲存資料。實際中使用的鍊錶資料結構,都是帶頭雙向迴圈鍊錶。另外這個結構雖然結構複雜,但是使用**實現以後會發現結構會帶來很多優勢,實現反而簡單了。

slist.h

#pragma once

#include#include#include#includetypedef int slistdatatype;

// 鍊錶中的乙個節點

typedef struct node node;

// single list

typedef struct slist slist;

// 初始化 / 銷毀

void slistinit(slist *slist);

void slistdestory(slist *slist);

// 增 / 刪 / 查 / 改

// 頭插

void slistpushfront(slist *slist, slistdatatype data);

// 尾插

void slistpushback(slist *slist, slistdatatype data);

// 頭刪

void slistpopfront(slist *slist);

// 尾刪

void slistpopback(slist *slist);

// 查詢,只能遍歷查詢 時間複雜度o(n)

node *slistfind(slist *slist, slistdatatype data);

// 在 pos 結點的後面插入乙個節點

void slistinsertafter(slist *slist, node *pos, slistdatatype data);

// 在 pos 結點的後面刪除乙個節點

void slisteraseafter(slist *slist, node *pos);

// 刪除第乙個結點值為 data 的結點

void slistremove(slist *slist, slistdatatype data);

// 刪除所有值為 data 的結點

void slistremoveall(slist *slist, slistdatatype data);

//// 測試專用列印函式

//void slistprint(slist *slist);

slist.c

#include"slist.h"

// 單鏈表初始化

void slistinit(slist *slist)

// 單鏈表頭插

// 注意問題:

// 1.鍊錶為空 first --> null

// 2.鍊錶不為空 first -- > 1 -- > 2 --> 3 --> 4 --> null

//經過思考,鍊錶為空和不為空的情形是一樣的,所以不需要做特殊處理

void slistpushfront(slist *slist, slistdatatype data)

// 尾插

void slistpushback(slist *slist, slistdatatype data)

else

// 迴圈結束,此時 current->next 一定是 null,也就是鍊錶最後乙個節點

current->next = node;

}}// 頭刪

void slistpopfront(slist *slist)

// 尾刪

void slistpopback(slist *slist)

// 有兩個即兩個結點以上的情況

// 找到倒數第二個結點,做記錄

node *current;

for(current = slist->first; current->next->next != null; current = current->next);

free(current->next);

current->next = null;

}// 查詢

node *slistfind(slist *slist, slistdatatype data)

}return null;

}// 在 pos 結點的後面插入乙個結點

void slistinsertafter(slist *slist, node *pos, slistdatatype data)

// 在 pos 結點的後面刪除乙個結點

void slisteraseafter(slist *slist, node *pos)

// 刪除第乙個結點值為 data 的結點

void slistremove(slist *slist, slistdatatype data)

// 第二種情況:鍊錶中有結點

// 判斷鍊錶中的第乙個結點的值是不是 data

// 鍊錶中的乙個結點的值是 data

if(slist->first->value == data)

// 鍊錶中的第乙個結點的值不是 data

else

current = current->next;}}

}// 刪除所有值為 data 的結點

void slistremoveall(slist *slist, slistdatatype data)

node* current = slist->first;

while(current->next != null)

else

}// 除了第乙個結點沒有檢查,其他的結點都已經檢查並刪除了

if(slist->first->value == data)

}// 銷毀

void slistdestory(slist *slist)}/

// 這是乙個測試專用的列印函式

/void slistprint(slist *slist)

printf("\n");

}

main.c

#include"slist.h"

int main()

資料結構 順序表 增刪查改

include include include include list.h 函式名 createlist 函式功能 建立線性表 引數 無 list createlist void return plist 函式名 destroylist 函式功能 銷毀線性表 函式返回值 無。void destro...

C語言 資料結構 鍊錶的增刪查改

分別用函式實現了鍊錶的 1 增加 頭插法,尾插法,有序插入 2 刪除 3 修改 4 查詢 define crt secure no warnings include include typedef struct student stu,pstu 列印 void list print pstu phe...

資料結構 實現帶頭雙向迴圈鍊錶增刪查改

初始化 listnode listinit clear鍊錶 void listclear listnode phead 摧毀鍊錶 void listdestroy listnode pphead 動態申請乙個節點 並返回指標 listnode buylistnode ltdatatype x 列印 ...