- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565654 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174919
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
: A N' F* o! L! m8 x线性表顺序表示、链式表示实现方法及其异同点
, Y" ?! b& [; l/ S5 {$ ]# S线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。! H4 }5 Q5 H% N" u P+ [+ @ w% k
" K* n+ w- v" U4 l: l) x本文采用C++实现两种表示方法。! p1 M. d: V& j) d: F( J$ c: ^# u
+ j- j5 U& a1 [4 C0 C
目录
1 a, G7 }0 G3 O, D( `
9 {/ k1 y4 \- `顺序表示和链式表示的区别:) X, t( Z9 I" s6 d& S U
$ g: K# m# W6 b创建方式:! z) z& ^, x+ z/ M0 x7 x% R" Z# d/ c5 s
; H; h- z7 f, [% u' A8 d. U! C8 F2 z
时间复杂度:3 o* G& ~; X; \- H3 L: _7 ` E& d
$ d/ n0 Y/ P0 \/ \
顺序表示和链式表示的相同点:
K9 `3 s* D8 c4 ~" d7 G: J. r' k
删除内存空间:
: e/ }5 A) R2 ~* `3 T, x; _5 Y, o/ H0 C# O; l0 M+ q
代码实现:
+ q8 J! {% h3 U- W* m& R3 h
6 V& p5 k* s4 y+ z6 ?$ Z* G顺序表示方法:7 \ B6 p2 e+ q$ b' P& }. L
; u: w* j- Z! P结构体定义5 w) G* j- t& t* @: ?4 `
* A; \+ L1 o/ b5 a" a初始化- L1 [0 H, X8 y. d* Y0 {# R
) m! ~3 ?0 U2 ]6 d* _增加元素) `. }4 l( j* W
2 Q9 @ u( L8 a
删除元素
9 |4 w/ z7 O% @$ x f2 d
: \ t5 M& b6 @! ]# }7 h8 w( f销毁列表+ q: `1 f6 [! Y9 h5 T# s3 Y7 L
" K( v" n* \5 F: x" C) P8 Y链式表示方法
' d1 ^7 r3 Y, r3 r& @
$ ^, t( {+ |" Z& @结构体定义
* _4 _ |$ C3 O. S* y: f' i4 \
3 y& ^/ f/ E+ D; J4 l+ s" M初始化2 e* f0 E" j6 e
3 [8 U8 K) v8 O* k K0 r2 P. O增加节点4 d; k- `6 u+ k9 D' O3 W1 d' p9 o( I
& p* n% l* o% }删除节点
+ T: e& T) \) w% c; s. x, h* ?4 ^3 u0 F/ q4 O) W m
显示链表
6 ~& X2 |0 ~0 z; e8 L4 }8 b0 q
+ G U- ?) a" @* s- Z销毁链表
8 l2 F) |. o/ s6 N$ }, \3 Q! q8 ~0 r
顺序表示和链式表示的区别:% r+ l5 d* @* @* R5 \: g
$ M8 a6 b9 D" y7 `( ]创建方式: x7 u( A) [, J) i
. q( e, m" _4 Q n ~
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。+ R0 G+ K7 f k- \
- N6 u, p4 b: T+ `, @/ N& J+ H& ?
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552): A) T0 n& H* i( t T
/ I3 Q9 ~0 o* t* Q/ p6 ~+ r8 B0 Q链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。" r; {8 y1 a2 B# M& z. m8 `
/ j" V: J. a/ Y$ X0 X4 Y7 [时间复杂度:
' G5 j, p0 t$ n/ o5 x9 q# ^/ d$ Q2 k$ t
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)% e% B" S2 Q( H) V
3 t! c6 _# o' o1 b( g. a增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)* T) o) {; f; D7 Y" M2 c6 M
/ M8 c/ L# Z" S8 Q) C! aPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
; ]' z/ M5 O& P( B
7 e0 O2 F+ B" V. Z' d0 A& L1 U修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
% A9 J/ o P9 }; g
2 @6 d: d+ i) Q+ V查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
$ E) e/ O( Z8 V' Z4 C8 e; E; n' P3 i! D: s, K3 J
顺序表示和链式表示的相同点:
" g y( G/ t' w3 I& P$ |$ {# j5 q
0 ^, h1 v8 _, H删除内存空间:
& g6 Y/ a" M# k5 \6 ?4 x# [% U- _( u3 N. m1 G- w( T$ n3 T" ^' [9 K
内存空间的删除都需要对每一个存储单元单独释放空间。1 M4 A; t' v( b3 S8 S
/ V2 L+ R0 k6 k8 ~2 l8 F+ K' B代码实现:
9 A5 C9 v. ?8 X7 {1 p" P+ g3 K
8 ~; M2 @" w" D8 C; J顺序表示方法: r3 Y. a5 z" B) G7 B+ ^ f
8 t- c: d( y% J' u
结构体定义
3 i, ]# v9 M; x
# {4 m) `. u5 y" J; jtypedef struct {
1 o+ t" [9 {4 j' h, N1 n ElemType * elem;' ?* t6 k P( v/ w3 V- v
int length; // 线性表的现有长度
% o0 d- s: ^7 Z' ` n8 e int listSize; // 线性表的最大长度
% \+ J- z( J& Q}SqList;, ~0 Z6 M0 `: @
- O0 s4 B, c/ T* L
初始化
/ F( @ i, B9 q7 E& }' T/ U* h- e( U7 X
void InitList(SqList *L){- a, e- S; j) D
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
* Y4 S- X( z1 ?, @7 J8 j0 y$ c4 u- c if(!L->elem) {5 C+ Y& Z% ^2 G) T7 _3 T8 v5 F
cout<<"申请空间失败!\n";
, Q+ |) |6 {1 E3 J3 E- I" Q6 Y DestoryList(L);" O% R; w, N7 M' f
}
! g* S- X, ?* ]) ~2 h L->length = 0;- R/ b- L8 z; a$ K) J
L->listSize = LIST_INIT_SIZE;
, w0 m4 X% a! w. {# ] cout<<"线性表初始化完成!\n";, D5 N: l# _6 t& n; j6 D* N
}# G1 k. ]+ a& A0 Q( M
- ^" T: a' x* X* E
增加元素* L* W [( b$ j2 M
$ A* J3 Q. ^6 M& ?void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素# l# m4 Z; u# H6 a7 l
if(L->length>=L->listSize){- x9 i2 z$ Y" ?6 K# V3 n& \4 c
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
4 s$ u4 J1 {4 f1 @6 V# B" q if(!L->elem){
3 C0 N% r! X" R1 {$ c, d cout<<"增加空间失败!"<<endl;
5 C$ Q) u. R) x. h DestoryList(L);
Y. M+ B1 x& l( {0 @, I* g. S }$ K% c3 Z2 u& {8 z8 }5 m
}
! I' _, f4 B g * (L->elem+L->length) = e;
2 ~. U; w. p. j9 M L->length ++; , i7 G ]0 W; Y P0 f$ p7 h
}
3 D7 Q# a$ f1 A5 b7 o. R, @
9 b2 c# Q. Y9 F2 j% Ovoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
/ z: P, H8 ^1 R! ? int i;
* c7 _/ A! p5 B- o& j7 C* E; B L->length++;
3 g6 L: n6 z R" L& j o for(i=L->length;i>=e_where;i--){
# u7 R: g/ p+ ` y$ n% n if(L->length>L->listSize){
# R) i$ K! G% X/ P L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
3 \% N, }; Q9 I! I if(!L->elem){
) v' p. n& z" v0 y cout<<"增加空间失败!"<<endl;
9 [1 x% R6 X- E1 X. ]% R6 L5 l DestoryList(L);
$ Z' v3 V2 X% D' w }
4 v2 p4 u7 n6 G% h5 n P+ y+ M }
u# {$ }0 T! p; t *(L->elem+i+1) = *(L->elem+i); 0 O' J# {& J% ^; Y2 m! J5 L
}
; [" n2 _' E* o, t! |+ d *(L->elem+e_where)=e;" Z( c' L& V- v1 @4 U
cout<<"增加后的线性表如下:"<<endl;
+ O& ]9 O& u/ J* _' [: @* P ListShow(L);/ [, R2 C0 X) N. R( }/ J
} + V5 V+ x+ S5 j z% C- d# n7 \
7 Z! t2 N2 L4 } Q& D/ g# U% ~( x+ k7 I/ B
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
$ G$ ~$ o* n* @) }7 @0 \5 q int i;
4 B Z) T( i% E$ a# h L->length++;
, w/ |0 f1 F; U' ^ for(i=L->length;i>e_where;i--){; J$ n$ W! Q5 j7 v2 R
if(L->length>L->listSize){/ j2 ?9 P) [$ {4 x
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
$ C3 n9 Z: k# w if(!L->elem){
. R8 s! O( Y2 L, y) R, `" g cout<<"增加空间失败!"<<endl;
2 s- W' _) H7 n DestoryList(L); ( ]& a) t/ T+ }6 b* w) y
}
5 U; C* E' }( ^# D5 E, S3 x" d }
. `/ d" K1 [4 @( R' n+ i, p *(L->elem+i+1) = *(L->elem+i); 4 ]6 j3 Q0 `; J4 Q% S( [
}
4 C& R# ]" `; K *(L->elem+e_where+1)=e;2 l6 z8 Z6 N4 [
cout<<"增加后的线性表如下:"<<endl;
' y1 Q* W; E* t) g3 `: ^ ListShow(L);
0 J5 I% M2 @) L( h# y}; N6 r5 {; W. {6 W2 b
b5 j: ]2 b; Z; t( n, P+ z8 ?
删除元素% Y J6 E5 i" J% a& C
7 `" Y8 G# a Z+ hvoid ListDelete(SqList *L, int e_where){ //删除某位置元素
o1 `" Y8 [: m# L L->length--;
4 n$ \. n2 j, y) s/ ^) e for(int i=e_where;i<=L->length;i++){
) i4 I/ D6 c! o5 |5 F *(L->elem+i-1)=*(L->elem+i);6 x& G1 z1 o$ z4 W3 p& G8 ?! K# a
}* m; p9 V' G1 ^7 T& G
cout<<"删除后的线性表如下:"<<endl;
) D" _6 N- X' v( N; n. X9 ? ListShow(L);' y5 `7 F2 A+ S+ z1 x0 k4 ^7 Y% e! H
}
. \/ e7 a! V' O$ j0 {% [" R6 J% ?+ @3 U. c5 v! J2 j
销毁列表
( E5 r" C9 T6 G8 T4 Q, ]' ^% L3 q6 T
void DestoryList(SqList *L){4 r& m2 a" }# [, i% L
int i=0;
/ q/ ?5 P; j# k" Q! ] P7 A for(i=0;i<L->listSize;i++){
3 o# s( m# W. A* t2 p free(L->elem);
7 i3 @: V' `! S, q+ `- m4 y L->elem++;
+ N& b* U: d( w4 `! O }
( ~: d8 W% k+ x3 b6 b exit(0); " ?, g! l8 e- J9 u
}
* Z# f" A. n' `% E6 v. A. i Y
# f, N! E5 |9 D+ L4 \- P链式表示方法) U( z- O8 h; b( f
+ q4 }) [$ [+ e/ E" z
结构体定义
2 u D% ^- n$ o" X7 ~9 t3 B* E5 Q, S/ g% M8 n
typedef struct L_Node{3 q( \) R3 H; Q, t O; m# I
ElemType data;( L0 [. T5 a6 F2 E4 |- a
struct L_Node *next;
5 {- O K- W6 e //struct L_Node *last; //增加可变成双向节点
, W) f! v2 ]* M/ T}LNode;9 V( U. n4 J3 K3 d0 i
5 q" x( O* |6 q" Y8 G3 s$ P
初始化- Y4 { y6 o7 q: x
8 D6 s/ f7 b0 p3 m" ~2 d
void LinearNode::InitLNode(){4 Y1 r4 n! W. E( g
HeadList = (LNode *)malloc(sizeof(LNode));
( C O9 S7 \0 k if(!HeadList){. p3 K: f; R5 l: h
cout << "初始化链表失败!" << endl; 0 `1 M$ k7 e9 e- }9 D
exit(0); % k C4 x% s- N9 S6 p' B5 F2 R( ]
} 2 F% r' r1 b; k' { z
EndList=HeadList;
* p! _2 D* ?0 M( k. l- e HeadList->next = NULL;6 r9 M5 x, J$ c' F9 F6 \' I% K& ~$ h
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;* H/ \4 c: r- n3 V9 k2 z
Length = 0;
4 o( [1 y9 w- `4 I4 l e_where= 0;
$ O# ?, } z( m2 f" A6 j# ~}$ r& u6 y* y& O+ _3 a7 v: a
. ]. r! @4 j) M. I. _- @5 F7 o增加节点$ X4 s6 p8 |3 k! P% X
& P7 X% X' a1 |% m* Q9 i" w
void LinearNode::AddNodeHead(ElemType num){ //头插法 2 v' Y6 F: a1 I2 ~
node = (LNode *)malloc(sizeof(LNode));
8 z6 D/ S; h# |" u' U2 q _ if(!node){
+ Z; V! F$ [8 w H1 c% | cout << "新建节点失败!" << endl; 6 z e4 F7 q- ~+ o& {- f" {" g3 c2 V
return;
0 z4 S) [4 Z6 T/ z$ T }
b; S: p. I6 k1 U node->data = num;
& Q/ v# A9 d$ u) m5 } M8 Z( a cout << node->data <<" ";% y+ l. U3 K7 p0 n, z# O
if(NULL==HeadList->next){# d4 p' n' `4 z
node->next = NULL;
) ]# G3 Z8 Q, L; @) o! m HeadList->next = node;5 m# D- w2 ~( q* b* C P4 U% c
EndList=node;/ i8 R1 U8 R' b
}* C: X( b; }$ W6 r& P% R4 P8 G: y1 p* n$ l* K
else{4 J# ?6 ~6 Z/ S
node->next = HeadList->next;
+ b: N/ h2 v$ t7 Y. c HeadList->next=node; V! l5 M6 O7 j R
}8 [% l$ e; p; f
Length++;
; I7 L# P0 S( S* G}
3 f+ U6 b! } ~7 R0 y% M3 g+ u" R) U) J/ Z
void LinearNode::AddNodeEnd(ElemType num){ //尾插法 ' o! F$ p; S" h+ U1 `7 e/ {6 T
node = (LNode *)malloc(sizeof(LNode));
5 m( }: n3 x. J# |) h T if(!node){
9 f+ B/ B( J; B6 r cout << "新建节点失败!" << endl; 0 T; i, @2 B& b' ]2 z' m! w* V
return; # n, u) j8 j8 S* w
} 6 ]# c6 x1 w2 X6 F( S) O) g# |
node->data = num;, B6 M! P1 d9 C0 o d# \- p
cout << node->data <<" ";5 s( }/ s! Z4 x* `; z1 S/ ?6 o+ Z
node->next = NULL;
2 c* @% W# d) B) t EndList->next = node;
) r; W% w' p- K9 G1 I3 Z8 v EndList = node;' P: n- ]& q0 D1 u
Length++; - P: O. A* r, s) u4 w' a4 n$ v
}
; M( e o" ?$ {0 N
3 q- e( Q' U- S删除节点: | K% q% _2 l3 Z% Y
# \. x& z7 j# U' Q; O9 W
void LinearNode: eleteNode(ElemType elem){4 S ]0 I8 n( q! B8 | O& n3 |3 B
if(NULL==(HeadList->next)){$ g. Z% a) Q# R" P; |
cout<< "无节点"<<endl;
0 s% d8 Z; ^3 w" m! ?; k& E return;
# W+ ~7 c( E6 e* ^- a: ?3 d7 _% u3 } }
) a8 j& ]1 j* F. N3 V& q) {! ` Node_cur = HeadList;
4 z4 P9 `8 q" ~3 i3 u while(NULL!=Node_cur->next){1 \, V/ J$ ~+ D: X6 V" w0 |
Node_temp = Node_cur->next; 4 q: N" W+ I, l/ O! v
if(elem == Node_temp->data){
. S5 o! o- D- p& S. g Node_cur->next=Node_temp->next;
* G+ t1 C4 Y) p! H free(Node_temp);. R& L5 z* ^4 q+ D/ h$ ?: d0 p
}
9 b" U/ I1 w. J2 }: W if(NULL!=Node_cur->next)6 i- f4 @% C) |
Node_cur=Node_cur->next;6 F" x1 x: A* X/ X
}( W+ I! v+ f, w1 u% p) W) Z8 r, O0 b5 G
cout<< elem <<" 元素已删除!"<<endl;
7 h# }* `- t) N" @0 }: t: }} ; m' z, o' M# e1 B8 z
5 O- y# O6 M7 { N9 }4 G. Y% t显示链表1 `8 S: c: t% a, C6 h6 v, v
# t5 j* W& G8 r
void LinearNode::ShowLNode(){4 @7 D2 I2 ]+ d7 {+ F
if(NULL==(HeadList->next)){; y( \/ }& \; B/ u
cout<< "无节点"<<endl;
, s7 f, x+ B0 C return;
6 u8 g$ S4 l# n( B8 H. {( E }
% K$ G! `+ I& n7 Z( M; d Node_cur = HeadList->next; : v! N1 [( Z4 f+ z
while(NULL!=(Node_cur->next)){" A$ r0 a( D2 t9 K* O$ _' z8 p5 N
cout<< Node_cur->data << " ";
& N2 g; E: j, e4 G1 n% F( O3 S0 r Node_cur = Node_cur->next;8 ?6 c! W4 M& o
}
* |$ |( w/ e1 ~. w7 [' ~* [% e# w cout<< Node_cur->data << " ";9 g% [% b/ m6 v/ Q! n. A& z6 V- z
cout<<"链表中的数据已显示!!"<<endl;7 s" d1 n& Q F
}
! y! F3 e4 m( E! V, v. x6 y3 }2 s3 z$ j
销毁链表' R% [! M7 i- |2 N% A- Z( n$ Y
# n6 f2 ~' }2 T4 A" G
void LinearNode: estoryLNode(){4 B S S! B8 k y
Node_cur = HeadList->next; " v/ |1 |* Q) |) Y! ~. `
while(NULL!=(Node_cur->next)){# Z' W; Y2 e7 u" M9 n
Node_temp = Node_cur->next;4 t4 O0 o- L" V \5 R& O
free(Node_cur);
. h6 r$ _- H. l. I Node_cur = Node_temp;: `& u" f, T4 F% s4 X
}
: }- ` ~1 `& a5 [/ n8 x5 v5 c free(Node_temp);
/ E( T" c+ N& [- n cout << "数据节点已完全释放!"<<endl;
& ?, ?# r& U, v. p free(HeadList); // 释放头节点
- z8 F" e. Z& ]6 B cout << "头节点已释放!"<<endl;
1 V8 O5 I% U, O( c* Z————————————————
8 d* @7 j% k. t h. ~$ F' r版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 l* Y& T! O& \
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286- x+ t$ ]; \7 p5 ]8 w( W. j# g+ P& p
9 p. T) E8 Y& b* G/ x$ C( G$ k% z/ X
) T. U6 y1 J5 m! ]' { |
zan
|