概念:鍊錶是一種物理儲存上的非連續、非順序的儲存結構。資料的邏輯順序通過鍊錶中的指標鏈結實現的。
實際中煉表的結構非常多樣,以下情況組合起來就有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...