資料結構 線性表中的單鏈表

2021-10-03 21:10:45 字數 4322 閱讀 4919

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

實際中煉表的結構非常多樣,以下情況組合起來就有8種鍊錶結構:

單向、雙向

帶頭、不帶頭

迴圈、非迴圈

優缺點:

優點:1.任意位置插入刪除時間複雜度為o(1)

2.沒有增容問題,插入乙個開闢乙個空間。

缺點:

以節點為單位儲存,不支援隨機訪問,查詢較為麻煩。

鍊錶和順序表之間優缺點剛好對應互補。

資料結構:

主要由資料域和指標域組成:

我們主要來看一下筆試面試**現概率最高的無頭單向非迴圈鍊錶:結構簡單,一般不會單獨用來存資料。實際中更多是作為其他資料結構的子結

構,如雜湊桶、圖的鄰接表等等。

**實現

單向不帶頭非迴圈

定義:

typedef

int sltdatatype;

typedef

struct slistnode

slistnode;

typedef

struct slist //頭指標

slist;

基本操作的實現:

尾插:1.先申請乙個新節點,並初始化內部成員資料域data和指標域_next;

2.判斷鍊錶是否為空,為空則直接插入head指標後面,不為空則迴圈遍歷找到鍊錶的尾部插入

**如下:

void

slistpushback

(slist* plt, sltdatatype x)

//尾插

else

cur->_next = newnode;

}}

尾刪:

1.當鍊表為空,直接返回

2.當有乙個節點時,則直接釋放節點,把指向節點的指標置空

3.有多個節點時,需要向後遍歷,要找到最後要釋放的節點和它的前乙個節點(防止釋放尾節點後,指向尾節點的指標成為野指標)。

**如下:

void

slistpopback

(slist* plt)

//尾刪

else

if(cur->_next ==

null

)//有乙個節點

else

//有多個節點

free

(cur->_next)

; cur->_next =

null;}

}

頭插:

1.先申請乙個新節點newnode,並初始化內部成員資料域data和指標域_next;

2.判斷鍊錶是否為空,為空則直接插入head指標後面

3.不為空,則要newnode->next = head;讓head 指標指向新結點newnode;

**如下:

void

slistpushfront

(slist* plt, sltdatatype x)

//頭插

else

}

頭刪:將頭指標指向第乙個節點的下個節點,釋放第乙個節點,第乙個節點對應的指標置空。

void

slistpopfront

(slist* plt)

//頭刪

下附完成**:

slist.h

#pragma once

#include

#include

#include

#include

// 單向 不帶頭 不迴圈

typedef

int sltdatatype;

typedef

struct slistnode

slistnode;

typedef

struct slist //頭指標

slist;

void

slistinit

(slist* plt)

;void

slistpushback

(slist* plt, sltdatatype x)

;//尾插

void

slistpushfront

(slist* plt, sltdatatype x)

;//頭插

void

slistpopback

(slist* plt)

;//尾刪

void

slistpopfront

(slist* plt)

;//頭刪

void

slistdestory

(slist* plt)

;slistnode*

slistfind

(slist* plt, sltdatatype x)

;//通過值來查詢

void

slistinsertafter

(slistnode* pos, sltdatatype x)

;//任意位置後面插

void

slisteraseafter

(slist* plt,slistnode* pos)

;//任意位置後面刪

void

testslist1()

;

slist.c

#define _crt_secure_no_warnings

#include

"slist.h"

void

slistinit

(slist* plt)

void

slistpushback

(slist* plt, sltdatatype x)

//尾插

else

cur->_next = newnode;}}

void

slistpushfront

(slist* plt, sltdatatype x)

//頭插

else

}void

slistpopback

(slist* plt)

//尾刪

else

if(cur->_next ==

null

)//有乙個節點

else

//有多個節點

free

(cur->_next)

; cur->_next =

null;}

}void

slistpopfront

(slist* plt)

//頭刪

slistnode*

slistfind

(slist* plt, sltdatatype x)

//通過值來查詢

cur = cur->_next;

}return

null;}

//void slistdestory(slist* plt);

void

slistprint

(slist* plt)

;printf

("null\n");

}void

slistinsertafter

(slistnode* pos, sltdatatype x)

//任意位置後面插

void

slisteraseafter

(slist* plt,slistnode* pos)

//任意位置後面刪

prev->_next = cur->_next;

free

(cur)

; cur =

null;}

void

slistdestory

(slist* plt)

plt->_head =

null;}

void

testslist1()

test.c

#define _crt_secure_no_warnings

#include

"slist.h"

intmain()

資料結構 線性表之單鏈表

線性表 亦作順序表 是最基本 最簡單 也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的。線性表有兩種儲存結構 順序儲存結構,即儲存單元在一段連續的位址上儲存,常見的陣列就是順序儲存結構的線性表 鏈式儲存結構,即儲存單元...

資料結構C C 線性表和單鏈表

在vs2005下面測試通過.最基本的 code include stdafx.h include include stdio.h include using namespace std typedef int type typedef struct lnodelnode,linklist linkl...

資料結構專題 線性表之單鏈表

對比了好幾本書,比較少涉及單鏈表的賦值,為了親自跑出其他功能,花了不少時間,畢竟是打基礎嘛,相信以後會越來熟練 你為什麼那麼熟練,明明是我先 話不多說,下面是 及實驗結果。include include define elementtype int define maxsize 1000 defin...