- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563419 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174249
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
; f. _# f( {* T/ F/ k) C0 z线性表顺序表示、链式表示实现方法及其异同点
2 n7 Y0 i( C6 M% U; Q线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。* Q7 @& X+ l; I8 \( D* O5 T
+ J( D- v5 l, f+ I
本文采用C++实现两种表示方法。
! B# n, [: e5 ~# B) h* o1 a) O% ]3 |. X% d
目录
! x" g5 ?) x$ X% V h/ { q
4 N* j1 t G( P$ w! m# ]3 u6 |顺序表示和链式表示的区别:/ P# r& j( C9 a5 s
+ T; }8 T% J9 T) a$ h7 t1 {: s
创建方式:
$ Z! t; w: {# V$ x) a) W E: y+ q. S
时间复杂度:; K( ]% d9 [/ N" s
& w. Y2 P: M" E g8 H
顺序表示和链式表示的相同点:
1 w0 t# w8 f/ m! K, w* D# C9 X+ ^8 Q1 ]! O& v7 ^& `+ f
删除内存空间:( ]( a0 n. W% b% |! K
; W7 D9 H# U- e; \& @% P5 D7 m, Y" d
代码实现:
% ~7 N- j- k4 d$ P7 t- M4 X7 E8 g7 w U" o
顺序表示方法:
: h$ h- y' V; ~9 Q4 y
& B/ ?8 ~7 f9 c$ E0 g0 L结构体定义
* \8 x9 Q ?0 n G8 S$ N
( Z; z% [8 h1 V X7 y: M/ L3 m初始化* J, p* w, U+ o B
1 K; c! c5 i# G/ ]( w增加元素
6 Q( c `, u* |& e7 d( d+ q2 u% x1 {# k0 _4 w0 p5 I
删除元素& i4 ]8 Q- F% ^8 X: D- _
4 s8 e6 d/ m) c. x销毁列表3 M. H2 V: B! [6 v; c7 a
; v8 H% J3 P* |1 v! \, e# X) _/ o
链式表示方法8 V$ z9 x( j+ R( D- Q
; i9 e3 y8 d: H* R结构体定义
: a i5 f, O. W& b
* _: u& w1 T$ L9 w初始化) p4 ~: B a) o) h
" e) t; C4 g m( _& C: i增加节点
* I8 a5 t' R# j; q! z) j/ X" V3 Y
删除节点3 }* o$ `9 H1 P' d1 a9 v/ H: f
& d9 A. a* G: V5 ?6 K9 e
显示链表, ^0 V: V+ M: ~
) C8 X) ]+ x3 N9 J
销毁链表
& @1 f: ^# s! i, [
; j# j2 w: m K, v- m4 M顺序表示和链式表示的区别:6 o7 h$ e5 s$ X4 U9 ]) P- e2 i
m) z z8 }5 S9 j
创建方式:
( Z% H0 b1 W' u$ D6 Z9 i7 X+ k; X9 a5 a: z: J9 n; l! u
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。8 b3 v- x1 g: y4 a* _% d& q
% {' P. @4 d/ R% O9 m(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
% j7 C G8 e' I; M- @4 H" H3 V4 R8 \
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。- o( r6 G2 M1 H$ M+ g
$ x$ {8 ~2 c% g- z时间复杂度: e9 J! Y9 s, i3 u
0 {$ y" v4 u8 z增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)( g m# l, D6 J# D0 L: D2 h; Y
+ b5 l! A, b. U& Z4 E
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
1 Q- C8 M2 U+ F3 ?# ^3 N3 t: _9 j
3 r6 e* [" z4 r' i8 PPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
+ c9 X2 }* A& x' m0 ^$ K/ b5 Y, @ o: x1 Q5 Q5 r8 W1 w" C4 D
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);, ?1 x- v! u" U2 d. X- Q
/ B d- p4 e2 {: g" U
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
/ @; }# K$ o; a
1 C' [+ o7 P" J1 }$ p! ?8 N顺序表示和链式表示的相同点:
' w( j1 Z8 J2 s8 c1 Y' B7 h& h$ s+ a% D& V% B" r
删除内存空间:
& t8 o _$ H8 r1 m1 D2 @% x
& c8 `- C* X4 t5 W; Z3 y内存空间的删除都需要对每一个存储单元单独释放空间。1 y% R: `! K! h8 o, O1 j+ Q
8 Q1 \+ u0 T5 X/ w: q代码实现:3 G# P5 v; z9 j7 Q$ O% i
d4 Q) u* j, O, N
顺序表示方法:8 b; u* Y8 K' i d9 _; [
! \9 ^( F* B% t: j a7 S
结构体定义
( ?7 j$ u( n* c0 z1 ?- [7 G% h0 p6 w1 P0 Z! c
typedef struct {
9 H: p5 {: A4 _5 g2 ` ElemType * elem;& V2 G; u& p9 n- g4 `4 g
int length; // 线性表的现有长度
+ H; V% l- @0 H# x& q2 I int listSize; // 线性表的最大长度+ |. S1 l# C( K) L- u
}SqList;
- S' z0 X2 n9 G- d; g: K) x
# {: H. G- V8 X c& B初始化9 T. b, H$ z0 U. F
, ^, A' C, r$ j% j+ Svoid InitList(SqList *L){, ?2 E1 p2 \ f' X N/ }4 T/ f
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
0 [/ i3 A5 v% M- _8 ^! { if(!L->elem) {( C- B8 |: j* H; P7 _; z9 C7 R* |
cout<<"申请空间失败!\n";, y3 G% d; {5 R6 L1 `/ m
DestoryList(L);
7 a/ Q$ U* A; Z }) @4 g s5 O7 o
L->length = 0;( _; f0 V! H0 @
L->listSize = LIST_INIT_SIZE;
& c" R5 N2 e$ f/ J3 I( s/ U cout<<"线性表初始化完成!\n";9 x- m% O4 O! r& P4 A% a3 |
}, r3 e9 w, R" @* c* `
8 U+ V6 G/ M3 [" `3 u, I @增加元素, p! `) J. R5 C# P" z' t# ?! z
* J' r7 V% o, w# k, }/ g4 Xvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
; ?9 d; [- k G* A% P7 I% B$ w if(L->length>=L->listSize){
5 U/ {! y/ O. T! U7 c3 `: X2 l L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));5 L0 M4 }, q1 ~0 O4 { \
if(!L->elem){7 h, {; U8 F# j6 M1 W
cout<<"增加空间失败!"<<endl;2 ]8 k3 f4 @# M# c0 l% H. p/ b3 u
DestoryList(L);
( O$ \1 {# }' c6 r J$ a% z7 h }
& T' x1 r" b) D# G% U }( q8 q5 p+ |: \- p8 L- x
* (L->elem+L->length) = e;
2 Q1 B: w2 F. m' W L->length ++;
2 l% i6 k1 W! |. _3 ]}. S, U, O* b; g6 \7 g- O7 z
- U1 H' O( X' V7 v9 a1 mvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
/ w2 G$ z: r# d' `6 k int i;% e9 Y4 E' v# ^
L->length++;9 S% H" Q, s2 W0 C
for(i=L->length;i>=e_where;i--){
& i4 U; d* E! C, R% m. r) H: m P if(L->length>L->listSize){
5 k; R# R0 u' x# ]( d$ U L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
% i; D: L, D" Q6 F8 F if(!L->elem){9 B0 W% C; N4 h$ a5 ^% O. v& R2 y
cout<<"增加空间失败!"<<endl;
: ~1 N2 h) U! }* k DestoryList(L);
1 c$ q- s+ M, T7 O, r }
0 |7 s$ l& ]. U* A, O9 ^6 c( E4 b }
. y: G; i. o$ B' s6 m' M# v *(L->elem+i+1) = *(L->elem+i); " I: l' O f- W" |
}
$ Z' O' L9 ?) V/ k/ t! B" p' p *(L->elem+e_where)=e;1 f, ?7 P7 R4 k" \) J; D! a: \
cout<<"增加后的线性表如下:"<<endl;
/ C6 `- z d* [3 H7 A$ ?$ M) F ListShow(L);
& ^5 z& e: S8 ?& ?7 k! C1 ?0 u$ M} 9 j: S: ]1 K" ~& z
7 {' [4 U! Q3 Rvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素8 `$ S6 T6 F# Y: f1 O
int i;
, K) N& k; ]) n& y9 A) o3 p L->length++;0 v, D; E* E2 f! h2 M8 v/ q# Y
for(i=L->length;i>e_where;i--){( c' }+ ?& W2 D' f4 N0 R
if(L->length>L->listSize){
# L9 ]: R# d# R& F3 r2 z L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
6 `3 e: N( J( c J7 D' H% [! t if(!L->elem){) P! \$ k8 Q5 k" A- f) B( l
cout<<"增加空间失败!"<<endl;. z5 x1 v% ?8 [$ R9 N
DestoryList(L); " Y i3 I. B4 o
}2 q& ^3 y/ R. I* `0 M% U
}$ j- {: t! H& k. Q& q' W' o
*(L->elem+i+1) = *(L->elem+i);
, o; _7 e* E" \8 v }
8 t! s4 m. v: ^3 N: V: ? *(L->elem+e_where+1)=e;$ i% }7 o' i) j( I8 i
cout<<"增加后的线性表如下:"<<endl;
! \: M0 q0 }0 l+ ^5 _ ListShow(L);/ Q' H. P) U- P: E% X. ]$ S; u
}
5 N" [8 O6 a( d' O- d* `
4 w; P' S6 v1 ^* L# Z- z删除元素# b" ~$ }8 d, g8 H/ i5 S
# j# ]1 ^0 ^' K8 {" v) y! Ovoid ListDelete(SqList *L, int e_where){ //删除某位置元素
& B/ p b$ k" g0 L5 [ L->length--;9 S0 j( _! m# M/ M/ K2 r
for(int i=e_where;i<=L->length;i++){
: i' t3 `; S$ q2 [5 } *(L->elem+i-1)=*(L->elem+i);
9 x+ {0 z, k% r8 R6 T, t7 X }
7 U1 y1 | t( n' w cout<<"删除后的线性表如下:"<<endl;
1 q. y5 ]. _9 K# E, j- a ListShow(L);0 J4 |. \) v0 O) b' T
}
8 P# b" w' |! v0 u* O
4 o( z* Y4 o! P) _# n% w3 X- p销毁列表
3 r* p# E3 X9 z) g; ]9 I
1 ~7 X+ G ^* F/ ^: \' \3 H' ^( kvoid DestoryList(SqList *L){8 d; b& T, O0 v' |! }$ V# d
int i=0;# Q/ E" n2 @/ f% N/ L
for(i=0;i<L->listSize;i++){
0 c% F/ j% D8 [# e9 l free(L->elem);% |, K" I) x( A) K4 @* j
L->elem++;
; m" O$ Y5 `$ ^0 i" H: w0 T! E }% |. p9 t; X: N
exit(0); & }. L f- Z0 J& x) t: m+ b" O) {) Y
}6 x# {1 s) w/ D5 |0 g
, Q/ ] N6 h: O2 B5 D
链式表示方法% Y' F# n) E; W* E7 U2 t0 p
- ]+ A# ?7 @& W! E% z( z4 s- Q* }结构体定义
9 H# o! {9 U9 U! }
6 I; X3 \) }* q( S1 Ftypedef struct L_Node{6 H" Y& v% A' i9 ?: @, N; k
ElemType data;: |; ^$ {/ Z6 z. G& f3 `
struct L_Node *next;# O5 f. r. k* h1 w
//struct L_Node *last; //增加可变成双向节点
7 Z( n& e1 u5 E9 w, V/ ]+ J+ J# O: @}LNode;1 ]% I" i+ d7 X b+ f8 r- b
) i6 o8 k$ A4 j9 R/ V初始化0 `; R) p4 l: |
3 B5 q) i# G9 ]9 Y* D3 Ovoid LinearNode::InitLNode(){8 w; t: v; F' e' ?7 \& U: t
HeadList = (LNode *)malloc(sizeof(LNode));/ _# J% w1 `9 Z5 W! R, X
if(!HeadList){
" ^+ N# K D: ~7 v cout << "初始化链表失败!" << endl;
9 C4 X0 \2 ~# n exit(0);
5 y. E S/ T, |/ | | } ) A/ U1 w! X( g( m
EndList=HeadList;7 L0 g5 X+ B& t
HeadList->next = NULL;
. S# P' _- P# u& A+ R- g cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
4 C* y; \8 V/ F, d4 _; k Length = 0;
9 g2 Y) A+ V+ ^, Z; }/ n e_where= 0;
- Z R* }# U4 ^}' D2 t2 F2 B* R- `+ T8 \
6 [4 |7 W( H& f% R) t
增加节点
0 P; R$ v K9 m9 ]
7 n' R9 w/ x/ F) j5 g% qvoid LinearNode::AddNodeHead(ElemType num){ //头插法 / [$ {& \; n2 h: J4 c
node = (LNode *)malloc(sizeof(LNode));2 U+ ]0 b2 t b% G* K/ R
if(!node){% w- f) \" J; G
cout << "新建节点失败!" << endl;
8 \$ L& }3 [" D3 N* C+ X8 i return;
( Z8 i6 ]$ B8 r& G! P }
5 h+ `/ `. C7 P V7 A4 Q node->data = num;
B0 F K: c6 D. v cout << node->data <<" ";
! x' o( G; F- l, R# f9 {5 i if(NULL==HeadList->next){# F$ h6 v+ x4 c! e, o% v% S
node->next = NULL;
3 f7 D5 Q0 \$ d* z! d' n+ E& d HeadList->next = node;7 x; D! W4 s: A; E" T
EndList=node;( c( A S# j' c% I
}: Z. z. `! e$ C c8 ?9 B8 M0 y9 B
else{; `( o$ |- v/ A* U7 [4 S; V
node->next = HeadList->next;9 D# `& t0 w: T+ [3 x
HeadList->next=node;. J" {! ?3 h: Y9 e! T: f0 p
}5 h, c( ]* v1 a& r2 d5 b q9 w
Length++;
0 X4 p6 h& c; p- }7 A+ m}
0 U( e- T: O7 o6 T1 {$ c d, X1 }
: D0 H4 M1 s3 \; q! Evoid LinearNode::AddNodeEnd(ElemType num){ //尾插法
9 y# h+ D3 U" ?6 V: D node = (LNode *)malloc(sizeof(LNode));
w8 t& O* G$ j3 j, V if(!node){5 a4 E1 x! Y9 D+ d
cout << "新建节点失败!" << endl;
: T3 o) J8 ^+ ]+ O0 ] return;
! C% u. ], L) x M }
7 o* h4 j4 j, l: t7 |, b X node->data = num;
% I* f3 g6 f8 ~. ?- a' R: I cout << node->data <<" ";* i. L0 P# V3 a, Z6 Y; }8 S
node->next = NULL;
; O, n: c; L0 v EndList->next = node;
5 l3 N1 t' |0 }% k% S5 r) b EndList = node;* j5 O! Z& d) U# @4 t. F
Length++; % ?$ S8 \" n. Z9 {
}4 v0 I; Z/ J& m9 ~" j9 l- R* R" @% ?
2 R% R5 ~. x% A* b& E5 e0 f2 d
删除节点
4 m' @: T6 _5 n* E, V5 z/ t4 U- d9 T: J& U9 y9 X
void LinearNode: eleteNode(ElemType elem){0 c" C# W B: r$ W0 r$ R: C
if(NULL==(HeadList->next)){
2 a; g- {7 X/ k* f& L1 P/ v) Y0 k& @9 ] cout<< "无节点"<<endl;( S/ t$ K( l. I5 ]
return; ' i, @4 n& j. @- o( {1 J0 o1 O! O
}
+ D m) P1 {$ ~) d7 o; ?* b. V/ A9 S Node_cur = HeadList;' d: e4 o* r- I2 K/ J: A' @2 z
while(NULL!=Node_cur->next){# t( @# I" ]) F8 s4 m/ F
Node_temp = Node_cur->next;
$ c- A! h/ @% p$ e if(elem == Node_temp->data){4 j" K, I8 Y! Y( V
Node_cur->next=Node_temp->next;
& h/ j) G8 m" q. u0 [+ o( G free(Node_temp);# P( T+ g/ M; p; C
}# Z% C! V2 [8 a1 c- U8 C. i3 v( u
if(NULL!=Node_cur->next)
# I1 X3 D3 ?( n. J: G/ w. y Node_cur=Node_cur->next;: r4 S" r- `0 _1 r( m/ \' i, a% l
}; j3 _6 @3 F& ?; X: F8 F! t
cout<< elem <<" 元素已删除!"<<endl;
: j: e/ G0 ? p% d0 o}
( `, Z- N; Z. i( w% r: ?1 D8 }+ Q- @ O4 D& T
显示链表# Q4 s( p( x0 ~0 i$ R4 K+ z2 L. |
+ L. D3 M: r1 ^) m( { Avoid LinearNode::ShowLNode(){! S4 ?" @2 U! U; p) q4 q
if(NULL==(HeadList->next)){6 I( @6 V# o/ j" V
cout<< "无节点"<<endl;
) I- [ }: E* {$ X2 ]: W. W return;
! v/ M _% i, ^$ a }: u" l i; e+ M% Y/ X
Node_cur = HeadList->next;
# l$ F" d0 B, J4 } while(NULL!=(Node_cur->next)){
) z- z& F$ n! W+ F9 ?3 I cout<< Node_cur->data << " ";$ A3 Z, C8 v* w" Y" ]7 P9 ~6 P* b3 p7 s
Node_cur = Node_cur->next;
4 v0 m* |% a; ?- g7 x } S: L7 c5 X/ q$ C& {
cout<< Node_cur->data << " ";
; p& Y- v) w4 ` cout<<"链表中的数据已显示!!"<<endl;' N" S( k; E% l. X
} P, ~/ _8 S2 G7 u+ u/ I4 f' W9 e
/ G7 u% K) J1 x/ `. D
销毁链表
( i2 P4 D( v$ N, n( p
) s% i; u! ^! f" Evoid LinearNode: estoryLNode(){" V$ |& o7 v1 b: }# X3 x* M+ e
Node_cur = HeadList->next;
3 C, L$ U" f. L8 G1 Q8 w while(NULL!=(Node_cur->next)){: K r: k- c/ x8 j
Node_temp = Node_cur->next;+ S$ [5 r. R& O0 B0 O
free(Node_cur);
: ~; u* l1 R+ f% M, W2 t# G" { Node_cur = Node_temp;
5 v# z2 t4 J8 }4 j, X7 z }7 Z* V$ C) G& g" R/ P; Y! {
free(Node_temp); W) f" C+ _ D+ {5 z2 m, v
cout << "数据节点已完全释放!"<<endl;
* w, n p' k ?9 v: R8 }0 y free(HeadList); // 释放头节点 5 M# e6 T8 k% r/ k1 j
cout << "头节点已释放!"<<endl; - i3 ?9 m+ _8 R
————————————————
$ E1 z! U5 K4 R9 E4 i版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 H% d' R9 o4 A+ p原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
9 W( w. h( {8 t- J7 O K
i3 u4 s! Y& W5 B n" s8 W# q2 ^5 I- Z, L
|
zan
|