- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564709 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174636
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
- K2 S1 Q( I% K5 m0 b* d* }
线性表顺序表示、链式表示实现方法及其异同点
c$ g1 d9 n. o0 X% o" m$ _线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
& F3 v# N) M6 c l9 d& j
1 I8 u7 [& p) L) I! u% Y本文采用C++实现两种表示方法。4 X( Q" n# s, Z. l- F
4 u: g& c8 U. P) {目录8 n6 a/ `; b; w$ c+ N4 D
; T6 l! F8 `1 B+ _3 T9 s$ r顺序表示和链式表示的区别:
5 }$ I, w/ M/ c% w) c/ K. i3 i/ U: p3 {8 n
创建方式:
% R* E: U5 [7 c4 P, i
6 A- f" j2 U5 K( Z6 {时间复杂度:
H6 s( G s/ S3 }! b5 ?" C+ ~
/ L6 [( d" }6 h8 C$ w! h- @$ R顺序表示和链式表示的相同点:
2 j! a4 ]" _8 t% X4 F( e. _* Q% h$ N% }) _
删除内存空间:
' w' E6 [) I: f9 H; m# s8 g$ ?( o0 ]8 l. V" b& f' \! N! Z
代码实现:) g0 t/ H0 b: s
6 b+ c% ~7 _3 G4 x& C# n顺序表示方法:
' c8 |% d& Z9 f6 H m$ c; B
5 D8 T6 G+ I/ B& }3 f结构体定义
8 l$ q4 g5 H# l' {0 M. ^& s: u( E& X- R8 m9 ]' Q' u/ w$ Q; ^; k* W
初始化
+ g) e* }7 B2 r' ^7 t/ {* B$ s/ j% P, [
增加元素
' J$ W$ b, b. m# |/ A" v; r/ L( e8 e6 c* s
删除元素
2 M+ ^9 }. k. ^
3 ]7 D; K% Q( f销毁列表
8 R0 q' F q6 h/ u
8 x6 Y+ ]: _$ x$ k8 S. C链式表示方法 `/ U) I* d6 T/ ~5 R4 c1 v5 P: o
; o( T0 A& [% S
结构体定义0 s0 t7 q [$ u
/ h) G, V3 p. I0 U
初始化1 E" F. c( d9 t" g& B
* `$ I" \8 X p! i增加节点
/ J8 j+ W& @) \7 {4 g k K# y: F
( r( r5 M2 `9 c7 H5 y6 Q0 q" |删除节点7 ^0 J9 s/ x3 N# d' L% D; S
" H" v$ {* H3 G7 a显示链表
1 k8 E' L' y( ^& F6 D+ X# t* P# e4 o% x9 Z
销毁链表
: _: z2 |# S. r) L1 F1 c: l3 U8 t2 f/ D& M o0 W/ v
顺序表示和链式表示的区别:/ O7 ]$ [. [& ^( R, Z
" T( X) u& l- L+ S! @# a+ \8 R创建方式:5 s/ R) Y# x; a: s* Y2 w% A% j
, G4 v4 m) L6 o# r% A9 X( {顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。- K- |6 @6 P$ L9 |; d
3 X0 C: o8 F2 S, T8 y' _6 t
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552); E" j( P9 a% F/ z
6 S& M+ r! p9 x2 }
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
$ D0 Z# ]' w: Q2 q% ]) F. }# r' @4 }9 g! E; |
时间复杂度:
2 V$ @' x2 G* b6 D3 i& X3 |( e% w: s+ C6 k+ t# H8 @! z
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
( C; ]# q# ?: {+ S* v4 q7 K- ?
" p Z. p! X- r% P. r增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作) [, } Y, {! W9 y
- E" v' r" b1 R
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
" Q" a5 w3 m/ G; a; w. `* e4 ?, Z* _4 P0 \, z4 q; p4 B- R
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
3 a T5 t- U9 }5 i$ q: d
! ?" i& U' Q5 C查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
; E; g7 k' C9 l, x; }! w- G4 J- [+ U) a5 @6 R6 l
顺序表示和链式表示的相同点:
# \" p m8 f# d) r0 z/ V
8 i: ^6 ?3 H& ~. R' O. ]; V' Z删除内存空间:
+ y8 v0 A, n) a+ @' U: S z1 H" q9 }+ T' M, q
内存空间的删除都需要对每一个存储单元单独释放空间。4 o: y# w0 @ T" U/ z
1 G1 L# H2 E) W$ @0 f代码实现:' e' e$ S C6 S0 F4 K
) L$ H- k% M& ]* Z* a4 T
顺序表示方法:
$ n5 h. [2 N- M
% X. t( V1 [* P3 l+ I! I; G结构体定义- o3 ^& B4 `0 E5 G, D% i3 N7 e/ f4 a
4 v. s+ s1 d4 i8 D
typedef struct {
- g9 x, j) G+ `# b5 W. [: N N9 F. y ElemType * elem;- ^1 t! C1 f% Z; \
int length; // 线性表的现有长度
% n, X$ W$ }& b1 p int listSize; // 线性表的最大长度$ s, B) [. }/ v2 }
}SqList;. D2 X& C& u( b$ f
* j7 z, ~* Z3 o7 [( _+ X初始化
* c- H' {' K. S( ~# @
; k$ ]& z# m& {- V! q; B7 f/ Qvoid InitList(SqList *L){
/ _+ W# y2 t( ] L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
- x# T0 J$ S1 E( V% w$ Y if(!L->elem) {' _, w+ x, C2 W& I* h) [
cout<<"申请空间失败!\n";# F. o) E0 M* d {: D
DestoryList(L);
4 Z2 H" w( p2 r8 [+ X. r5 m6 Y+ d& { }
' |( g9 c+ G3 {$ a, y# M1 \ T L->length = 0;& O9 W. S) L' k; y2 ^
L->listSize = LIST_INIT_SIZE;
. |+ y( m% c: f2 ` cout<<"线性表初始化完成!\n";
' @% h0 b/ O7 a}: j; v$ F% K L M( {- o1 O
# _( h) k4 V' o7 N3 k增加元素9 ~$ r6 s' w$ j
1 o+ g4 r4 P3 f6 Lvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素" n9 }/ Q' ~' P
if(L->length>=L->listSize){+ F! ^& n: { x6 K @% K/ F, I
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
m2 _6 l5 @1 \! R! o6 ]6 i if(!L->elem){
+ T0 g* _, }9 k" W, c cout<<"增加空间失败!"<<endl;, u: E0 u, y: b! S. R* U
DestoryList(L);
$ X/ Q X/ s* o, H* O" `, v }5 ~, U ^* |# B" T, X' ?4 D
}
5 ^9 h2 R$ j Z4 W5 c * (L->elem+L->length) = e;
2 s* _/ ~& q2 H) S0 O1 ]4 F L->length ++;
$ I# P' G9 y9 ^& l, K, ]}5 ?3 q, Z' V$ d( Q
$ p' f" Q1 V' z. U6 C
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素% [5 B1 [+ t; L
int i;4 S8 s% v* a" D6 ^* Q
L->length++;( m2 U" i1 K( G- `$ V; Q
for(i=L->length;i>=e_where;i--){
\ K8 F: w b, Y9 e) B, b if(L->length>L->listSize){9 j( r' P4 x" x# T. n
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
6 X3 h$ }' ~3 z$ a7 K" e+ c2 F9 h if(!L->elem){
1 |; H; ]9 t. l" [* K! d cout<<"增加空间失败!"<<endl;! X5 T7 y `3 x; w- w
DestoryList(L); 6 c6 d% I* X% g. M( e: T
}0 [1 z, R. z2 I+ ^7 R; ^
}9 O, T' h3 s) G$ o; g; ]/ b4 E
*(L->elem+i+1) = *(L->elem+i); * T. G: v- B# E6 N4 m: B
}6 Q2 z, F6 Y' \* q b+ [
*(L->elem+e_where)=e;3 G$ A! k( F2 m$ G8 A, p
cout<<"增加后的线性表如下:"<<endl; ; f' {. u2 l( t9 V4 X( O
ListShow(L);
4 s- ~5 M; \% ?3 o} " V" D0 v( o+ M7 G. {' G
" A+ F; x: f0 z) Fvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
- k! J" l, b4 @1 ^3 \: ~ int i;7 ~; Y- W0 G1 o5 Z0 ]7 n
L->length++;
* z& v: {- a) H' c, m0 A for(i=L->length;i>e_where;i--){
- l4 I9 Y4 H. i) {4 H# G6 c if(L->length>L->listSize){( n8 o+ b+ q8 c/ c
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
5 H( V2 |2 L1 r+ B0 S if(!L->elem){
- g' _" v% A( j cout<<"增加空间失败!"<<endl;
) Q7 O5 S. ]) o' r, X3 j DestoryList(L);
; s [8 g! Z. A7 k }) f- |0 e$ m& n; O F
}- @4 @2 U. m- u5 I' J
*(L->elem+i+1) = *(L->elem+i);
: Y2 S0 r: @- W+ m, } }0 ]- B) a' S8 o& P
*(L->elem+e_where+1)=e;+ [( c4 `- E9 y, j' m; D: w9 S
cout<<"增加后的线性表如下:"<<endl;
[! z1 A1 w. o/ {/ N* n( W ListShow(L);
A* X' t. P+ J6 N+ M}
8 b/ h, P3 D9 z3 @7 H" r' M
8 l$ }9 h+ F" G& F) p删除元素
' w1 v5 i" {6 D/ W+ v1 f, Z
/ u8 |2 }& `% P& x4 Zvoid ListDelete(SqList *L, int e_where){ //删除某位置元素 5 W" m1 v( z+ }! C1 k9 o9 \
L->length--;
& ^" C' n0 c- p2 p. f e for(int i=e_where;i<=L->length;i++){
# s6 D& I) U9 K2 V& S8 ?) I9 ^ *(L->elem+i-1)=*(L->elem+i);' [9 h; R- w Z3 Y+ }& R$ s* x
}5 V" s5 A$ d! O0 R, l1 `
cout<<"删除后的线性表如下:"<<endl;
' \9 ~) a0 E/ Z! L ListShow(L);
+ Z U1 o3 \% p+ Z4 l( J" s, b}
, W, c: f6 U; C& H
" K! g& J. K q6 \8 Y销毁列表
- I6 r& o6 o7 T/ z8 ]* S: x- Y3 X) }3 W8 c
void DestoryList(SqList *L){
/ m& k9 U+ [3 W int i=0;1 U; K2 }. ?4 P) i0 V# S4 P8 x7 W
for(i=0;i<L->listSize;i++){6 \( E' ]6 |0 q; Q0 Q% l8 X
free(L->elem);4 f# h3 j2 p) f3 Z/ W7 r& }
L->elem++;+ w) d; G; {! f9 l& z+ O
}1 Q/ M, P6 U# r7 F
exit(0); 4 a6 H' K* p: r- P: {- K4 A$ G
}
2 J7 [; u8 T* J, {' p: n6 n5 a. y" [ B& _5 I" }
链式表示方法4 W- f9 K' G. q+ r
1 k. ~4 }4 ~/ L8 H# C
结构体定义9 q; o- N- V& i# P
/ y& @) e o) y9 n8 Etypedef struct L_Node{- t9 K' O. A" u' g* A
ElemType data;
4 r9 H3 B$ |5 N& O1 x8 x struct L_Node *next;/ w+ Q/ ?7 x/ C G2 y
//struct L_Node *last; //增加可变成双向节点
8 K p6 U A1 f$ o! g# F" q5 n}LNode;+ d& w" }& s1 L2 ^
" d1 P H! S+ J9 Y# w3 O
初始化
' a3 B7 ^: Z8 f( O7 f
# A, V' w) Z2 a9 Nvoid LinearNode::InitLNode(){
+ d+ Q6 c$ p, V$ M7 X HeadList = (LNode *)malloc(sizeof(LNode));" h$ I4 Z" |2 A1 }/ l- |
if(!HeadList){# J1 y: ?1 h* ?3 i
cout << "初始化链表失败!" << endl; 5 v- n$ |5 S9 P: n3 K
exit(0);
! P, J* ^! L* @# S1 @& b) {, _4 n9 S }
: `/ v3 E/ q1 w. ?& y7 L, q5 c EndList=HeadList;/ J' a( D# ]5 G; h: [; U$ ~3 ?
HeadList->next = NULL;
: Z) _4 u: K$ _' n6 Y6 m4 X9 _ cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;+ M: V3 f& O5 @+ J2 \3 P
Length = 0;
! z+ P! c# n8 \9 A4 g: [ e_where= 0;& _7 ?9 l& p0 i9 N
}6 X7 C4 E- v) W+ Q
5 W% w, s: t/ E6 X+ _' L
增加节点
7 G* d$ [! A6 W# r) P. ?$ H
& e* H! D7 i' ^8 nvoid LinearNode::AddNodeHead(ElemType num){ //头插法
; y6 @& ]3 @7 Q% h node = (LNode *)malloc(sizeof(LNode));7 O0 w" f1 D7 ~3 M+ R/ c
if(!node){
- |3 H |4 z" x* K- d0 d cout << "新建节点失败!" << endl;
" E! H1 O u9 _) q# R2 I# G: C, F return; 7 x; J: ?% G; q N: J
}
9 m# \/ ~, ]6 A/ w C node->data = num;
' A! e$ m/ K/ e! p y cout << node->data <<" ";4 A1 W+ Z# m' J4 W
if(NULL==HeadList->next){
% L& B: ?, p |; h3 ~1 D! ?) @* A node->next = NULL;* K3 a" m3 Z8 F4 O2 }6 U
HeadList->next = node;
: O2 i1 b! ?7 H- Q. ~; \; k. U EndList=node;" r" ^ y5 Z" ?+ T
}: i7 {/ s" W; C8 B) w
else{, L' ~" w+ x6 f2 l/ f4 N
node->next = HeadList->next;
' V; H6 j" x2 ^ HeadList->next=node;, G) J2 |' c" S" C: p: S
}
! p- N, K8 E& M) E6 j Length++;
- ^# x1 Z- `1 K2 ]7 h+ a}
B D. x" m, ?& H3 t& U) b- o8 |' i$ H% ] e
void LinearNode::AddNodeEnd(ElemType num){ //尾插法 & {+ G* c1 E* }$ M/ B- i+ T; j+ r! K
node = (LNode *)malloc(sizeof(LNode));) d% h. j* e: o" O* P2 Z" [
if(!node){6 p6 x* D% m: @- `$ ?
cout << "新建节点失败!" << endl; & b( T' T7 W {% Z0 e' _7 b- l; B
return;
- ]0 S# F* v+ b! q% L } 2 |- [; |& w: E7 D
node->data = num;4 t7 c7 c: C" y4 J! I H$ K- U
cout << node->data <<" ";
7 \1 q( k1 Z" X* o- B, r6 s- k# N node->next = NULL;
6 M( ?, u; w7 b7 k6 M- o+ K EndList->next = node;
) e; C8 F" l* M; b EndList = node;% P6 G' a; \' ]) d8 \: _
Length++;
) v3 M+ N& k) n" K; A% X/ o}; |' t* Y! A: C9 u3 H. u
' I" F& ?$ U, S8 g5 q6 A# C2 p删除节点
" c/ g6 C# Q/ @& z, q3 A/ y2 E9 r6 k# s0 @9 i
void LinearNode: eleteNode(ElemType elem){
# Y% H+ a: f8 e2 z; p$ [ if(NULL==(HeadList->next)){
+ Y A( |( `5 y7 d' h cout<< "无节点"<<endl;
4 R* R/ b7 \ i5 F5 O% b. ^5 d return; 9 `- y. o( W/ R
}
/ D4 ^; i/ A/ W+ L/ s2 l6 w Node_cur = HeadList;
: b! V: \: y* g0 I& b4 |# X while(NULL!=Node_cur->next){5 ]0 o$ C' F. z w
Node_temp = Node_cur->next;
0 F% [4 _6 q1 } if(elem == Node_temp->data){
9 Z+ s# e$ D. j! ]6 [, a' H( @ Node_cur->next=Node_temp->next;
7 P' C3 A# |. P0 F free(Node_temp);" G. f c, ]/ ^& e
}
, O6 O8 P- x( h5 M8 C( ? if(NULL!=Node_cur->next)
) p# O/ O! b" J3 ]+ g" Z4 w6 } Node_cur=Node_cur->next;
6 ]5 C5 m4 ?& I: m$ T, M }
+ C0 d! n/ k* G0 u cout<< elem <<" 元素已删除!"<<endl;
5 }& E# p9 U: Q. D" _}
- v# ?) u. t/ n6 u" k, B$ A0 T8 }: N
/ p- p# t- f/ [! G7 t# m& E3 t/ K* F显示链表
* x- y( T+ Z$ `' X: J' r
; d3 F8 @6 i! F5 l7 Vvoid LinearNode::ShowLNode(){
" F! h8 i" a2 W" C+ C9 F3 T if(NULL==(HeadList->next)){
* n5 h% k* H& L" O* f4 A! x. S2 A cout<< "无节点"<<endl;7 o* H2 j" d3 M Y6 _( D/ E
return;
$ ]% e$ R% F0 L. ?# B% Z9 k: q }% ^6 p% N) U! }- h8 Y& e
Node_cur = HeadList->next; + e- {$ [- \) c- G6 O! ?& T
while(NULL!=(Node_cur->next)){& h: s* l3 Z' a
cout<< Node_cur->data << " ";* o1 X5 y+ \ L8 J6 {+ J/ t
Node_cur = Node_cur->next;/ P5 q6 _; W3 _! r; W5 X5 X' f" o, B
}
& G- {& m, G, t! J# t( x: u cout<< Node_cur->data << " ";
3 b# D. ^8 O. G7 t! \% b# H cout<<"链表中的数据已显示!!"<<endl;" }" j" W J4 i% {8 u' U
}
/ r6 N; {- @; R# L$ A
7 M2 Y( J9 U0 U8 p5 L7 l3 r+ x销毁链表$ D6 v2 x, q0 D/ }1 Y
; A$ [3 z' e1 jvoid LinearNode: estoryLNode(){6 Z# S. B4 t' ]0 }8 h
Node_cur = HeadList->next;
8 Q _1 g- J" f) ~& _ while(NULL!=(Node_cur->next)){
' Y) j) a: ?- p3 F Node_temp = Node_cur->next;% {5 M; E: @. d. u; P; c
free(Node_cur);5 h! L- D3 n6 I
Node_cur = Node_temp;0 d% i0 `: o% {$ ~
}
/ t2 F7 l9 a4 w E5 w free(Node_temp);; P$ }6 |( Q9 [- {3 \, n
cout << "数据节点已完全释放!"<<endl; # z7 h8 {2 \ u- Y
free(HeadList); // 释放头节点 ) [% {8 `8 p2 F) J: q. ~4 d& U
cout << "头节点已释放!"<<endl; : G% M" v! Z" C# E' B w
————————————————
7 w+ B2 L/ { s# t! y! k版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 B$ Y# S6 C4 P A$ t+ N
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
$ w1 H& z+ A, s; Y5 h; R2 k% `( Y8 f( G: o# Y) E2 [/ w
2 M% j. v& x& t* d9 B |
zan
|