- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566758 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175250
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
7 D8 b8 U4 m' z: p
线性表顺序表示、链式表示实现方法及其异同点
0 Y" c5 l# A J) m* g9 M线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
1 ?( U7 G$ F$ z! z2 p+ b
* A' O5 w% T5 G) o& P本文采用C++实现两种表示方法。5 E2 ^1 d/ v: e7 X" Q$ B
5 \4 f7 h- s: M, F/ W7 g
目录
% _5 r& D; O# j6 p
g) h& [; o& l( O! K3 O顺序表示和链式表示的区别:
1 |; k) ^" F2 }# O6 L6 ^5 W$ I/ i5 M5 O A' @; I, C
创建方式:
9 x# k/ p' J2 K9 I) u$ C# [0 k6 \# w. J% I/ g" b0 W
时间复杂度:
8 W% ~- ]/ Y3 r. }' s7 j: g3 V$ U( r
) @# b+ A. N5 N3 |+ `2 E) v顺序表示和链式表示的相同点:! T% `1 [$ y1 l3 l
' u# N! n% w$ w删除内存空间:
% C$ F& F T5 K% F- d$ A7 z. B% M5 Y/ A+ v
代码实现:
6 S( |1 V& |/ g; {$ D
+ a8 o+ U- ~& i. k顺序表示方法:
) _' Y1 r9 U+ N2 i6 G& |# T( B$ ^# P8 R9 r: Y9 X J
结构体定义" e, F- b- b4 u q$ e1 ^
6 n/ M, C! m1 f" w- p, e& l初始化3 F0 a, V9 R" H! P$ N
6 a- g" k; ^; w增加元素
2 c `* @( f8 {% w8 U7 X9 \. ?: {5 R0 G
删除元素
3 t- Q4 R7 n3 u4 \' h/ c5 i: Z* G Y0 @! T9 |8 Z: p# J1 t
销毁列表
+ r& d- l! K. z
) c; [$ T( h) Q: Q链式表示方法" _2 Z, Z- F- G; l% ]* Z6 s
9 }$ E& l" W4 }; k2 w! ?
结构体定义" I0 m. h* ` N+ n1 {$ J( S
& E: C) K5 ^$ P; z) {3 ]初始化+ G5 h4 ~- o! E
8 c& s5 l6 s4 T9 o% y增加节点
& ~$ D; ~* y7 l9 d# Y6 w' L# q6 F
删除节点
9 `3 `; T, D( i9 e" z4 R
: H) i" C- U0 Y5 B显示链表6 D: M) i3 n ^! X
4 a, V4 [8 p* K销毁链表
; B) u# i5 x2 Q/ O4 ^! V E$ d( q, J6 m v5 H4 |$ }& n
顺序表示和链式表示的区别:
; D1 ~4 A% d/ _$ D
' z! R$ A* W/ x: g V: d创建方式:
# p/ X) m, L; L0 v
! a. t8 o0 L' J顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
( V4 z/ A! x+ N1 _2 d6 o. y4 D+ T% b
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)( R1 W( z* H+ t0 X- H# i* i
8 k9 \7 d% `; P7 f$ l9 T: d; ^
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。' B. u* u4 m4 f
! h, j5 W/ m8 _0 ]* v) |时间复杂度:
; j. r0 a: ]4 |' M% {$ C9 @5 c& O
/ F6 c7 p9 Q# m增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
3 N2 n8 n$ t z. U! ~; c
: J$ p A* `+ g增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作); o. N9 _: A6 g3 k( \% B6 X
2 b2 d" A0 C! `6 ]( X, S' S* s5 F
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
* X4 p! F4 ^: j& k* Y4 e; Y* \: y0 D8 R& j0 N, v' g0 \7 Y
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);0 b- @5 P2 u! g! f3 p
; \' v% ]' j6 A- {8 ~: Q- X: v查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
! `$ b' h6 I6 _" V7 p8 q8 f6 Y4 w% b4 h0 q2 L. Z5 P" h8 ~ [. H0 w
顺序表示和链式表示的相同点:( F* I. B+ h5 P o9 |5 P
* H# M# o8 j+ d+ i, ~8 u删除内存空间:
# f) O. ^. [% A% `1 k3 i: W& {/ e; j+ q/ U% M, U* ~& D
内存空间的删除都需要对每一个存储单元单独释放空间。
9 q& f, n) Q5 _) ?
& p& g8 {: B$ [$ r: G代码实现:3 Q; r4 O, z/ X7 s5 M% ?
$ S! H- \+ x8 G0 m& x5 _ [* m
顺序表示方法:
5 d. k2 g, O$ Z0 Q" g# Q" B8 R E5 v6 S( Q4 z4 k
结构体定义6 q3 ?1 F9 u: A: s1 }2 H8 ~
, v' [. x5 O0 ?( G/ H1 ]typedef struct {2 t3 r5 A# V9 K& e5 T" U3 D
ElemType * elem;
: F; ~/ q+ z. G$ \ int length; // 线性表的现有长度 ! Z) ]. ?4 |# b& `
int listSize; // 线性表的最大长度& z. C- ]3 l- S) S5 p! Y; N
}SqList;
3 r# D) q& u' h7 [5 u: ^: J! k' B2 E& _
初始化 V# f9 K3 H9 b1 O& F0 @
J. Q. h% A# z6 Z, A/ Fvoid InitList(SqList *L){7 o. Z1 Z3 \. P0 a! ~2 K! o" M. [
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;3 ]) Q9 u8 F* N1 l8 Z9 f$ g
if(!L->elem) {
% q! b% j7 m9 p( z( J' ]4 {% E- s cout<<"申请空间失败!\n";2 |* |: Q" [8 `, p& @7 ? b( |! Z& R. G
DestoryList(L);1 b. d4 P$ [& c* H7 V+ ]1 g- _ l
}
: V+ I- V9 q: r2 E2 Y; h2 C L->length = 0;- i- a# }) n- a+ L7 |
L->listSize = LIST_INIT_SIZE;9 s7 {" A( s: R/ e Y5 ?2 K
cout<<"线性表初始化完成!\n";
! [1 o0 j) N+ g J9 M3 {}
, Y J% J% R1 M/ n" [3 i+ J' T# W: B+ `& n; z4 \% M
增加元素) z5 x9 F. O3 v K; j
+ N0 R9 h8 h: B' Y) s, ]
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素' F, v' x0 `: q) S7 y5 R/ `
if(L->length>=L->listSize){
5 S. ~ y: d/ p. [: x6 a) v5 u L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));+ J, r( w* e1 N1 l M; a# J9 W
if(!L->elem){
* p& g/ `* u' ?4 t cout<<"增加空间失败!"<<endl;
3 z+ w$ E! }& ^. O DestoryList(L);/ |! D2 o5 C) X. F$ i8 }/ Y' G
}3 P+ U% k! O s
}* O" K+ m* A) l/ i/ k
* (L->elem+L->length) = e;0 R8 k/ v' Z W6 F9 a( W$ N
L->length ++; . y& Y( v9 c+ o1 v3 ~6 s
}$ y0 Q y- `' V1 T5 }
; y4 w8 K5 `* l Y) @* m9 bvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素/ y. ~4 H: C3 {6 d; m
int i;' V; b( p5 k' G3 V" [6 I% N
L->length++;' g4 L2 z# T$ X$ X
for(i=L->length;i>=e_where;i--){
, e& L0 a+ g! a v$ o0 k- g2 d if(L->length>L->listSize){
8 \' E6 P( r% r) L+ W K, K [ L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
2 \' ^/ I; l; Z) p% K a if(!L->elem){$ J+ q4 {" m; z- u3 K/ y
cout<<"增加空间失败!"<<endl;2 H: P7 a. u- w8 H5 G
DestoryList(L);
1 k% _! J6 h: z/ Y( s6 R" p) [9 Q }
% [* Z) R0 l9 {( u' b) v1 z }
1 }' z2 |& u, h *(L->elem+i+1) = *(L->elem+i);
# S* n8 t F3 L, F# Q }
1 z! R* d; c) x. @) J *(L->elem+e_where)=e;
& I. y0 X" X! E! c* U cout<<"增加后的线性表如下:"<<endl;
- d* ]' _) _. K y ListShow(L);) q% g- P* F: u' a
}
L5 E! y4 A, A( F( X/ u& w9 y1 i
' ^1 Z. F+ y0 Y5 H) Dvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
' l7 g$ G# D, {1 Z int i;
% Q% Y! c% H+ w& M% T8 { L->length++;
- g, `1 H: L( D) u3 M" h for(i=L->length;i>e_where;i--){# z9 C% D/ M# @9 W' s+ i
if(L->length>L->listSize){% A2 H* T |; M+ W V
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
, H5 [, x# ~) X7 \8 w& G if(!L->elem){
5 ]0 H8 k' E3 \# u$ D cout<<"增加空间失败!"<<endl;
' M7 X0 M+ J- D% o0 e DestoryList(L);
8 e& M/ n+ \$ t& D }
( G0 D' D0 R1 x1 G; t4 M+ y }
, X( u% c/ T' }& ]1 h0 j8 g7 Z( |2 V *(L->elem+i+1) = *(L->elem+i);
3 D1 n, H5 Y0 U; X, ?0 s7 L }
1 Y. W8 I& y* t+ Y *(L->elem+e_where+1)=e;
7 s; p% x* {& c1 l cout<<"增加后的线性表如下:"<<endl;
+ R/ n4 a# M( V) d ListShow(L);
) `0 p# d2 X7 w0 P1 m- i& D/ ^}$ z! {' }- {* ? x
0 y* O: Q; ~" D& h7 y/ e删除元素9 W' J* m5 [" J' Z
9 x1 I) C& H Cvoid ListDelete(SqList *L, int e_where){ //删除某位置元素 + H/ r( G" Q8 H* A/ {
L->length--;8 s3 m# [! d+ P$ x$ r. `% `# G
for(int i=e_where;i<=L->length;i++){: s6 N, i% W& \5 g
*(L->elem+i-1)=*(L->elem+i);9 W. }; V0 G& W" }4 a
}
_. m( B& P6 D/ d% y1 `* v; [ cout<<"删除后的线性表如下:"<<endl;
2 i7 A4 D, }! l3 Y8 O6 o5 e ListShow(L);
; \- j6 J' `. h _}
# Z) @- r- S$ a' a$ u# U- a" {8 C3 ]/ ]4 c% |/ N
销毁列表4 U. v6 H1 X, R1 a
5 P7 F9 @0 _ ~# b _! p- x
void DestoryList(SqList *L){
* u5 H' c8 @5 A0 A& U! n# ~ int i=0; b$ H3 ]+ w. r3 o' F7 B6 p" v; b
for(i=0;i<L->listSize;i++){
0 w0 _% |6 C' g8 t: {/ N6 R free(L->elem);# V) m: z. O% ]
L->elem++;$ o7 c- s, H" h/ W3 P
}. d- E& ?5 M7 w- t: J: c
exit(0); + R! r1 Y' T6 A+ ~, r( F
}
. o$ I, t8 v% \2 ?) N- }
: Z# k$ F& }* I% F* V链式表示方法
, c+ h7 E3 @4 u$ k" U9 Z. a# H1 ~$ m/ v( L; Y
结构体定义
* d9 Y u, e1 ^1 u4 h5 p' m8 T3 f3 \ C, i% }4 K" n; E! b9 h& ~
typedef struct L_Node{
5 O; O* e, {" Z7 N0 e ElemType data;
. t0 E- K! d% z. Y `# ^4 F struct L_Node *next;. _$ f& o# y/ o5 Z
//struct L_Node *last; //增加可变成双向节点 * f! Q* w8 Q5 {2 x7 U1 f
}LNode;
$ a- z: W/ W K$ H9 e5 M6 p9 J6 m6 e q4 }& k" C
初始化- \+ Y7 ]8 e' N% r6 j/ J+ z
9 W9 w0 Z$ K& }- J6 evoid LinearNode::InitLNode(){
( W m: K+ L; ]1 R HeadList = (LNode *)malloc(sizeof(LNode));
3 D( B7 e0 B, l! ^ if(!HeadList){# M/ ]7 m7 q; K& f, S
cout << "初始化链表失败!" << endl;
& v. T( s) M y/ i exit(0);
9 }/ p/ ~# W" Q& F$ w$ d* _5 L } % U1 h" h; ]# |' X
EndList=HeadList;7 c" t3 M9 e# b
HeadList->next = NULL;
, ]9 V n; \7 A y cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
n) L4 r5 W% f4 m4 v) W Length = 0;2 a4 j4 w; L* R& O% P/ A4 D. g* t
e_where= 0;
9 I1 g2 ?. D0 e ]}+ n5 @% Q, W5 A/ m0 l6 U
2 C6 m7 J% f7 N% L2 F2 f增加节点2 F0 \; O# t& z M) p3 b
% f1 Y5 z h9 k+ s
void LinearNode::AddNodeHead(ElemType num){ //头插法 1 w1 c3 F' K4 ~$ b) Z- q: P
node = (LNode *)malloc(sizeof(LNode));, Q+ n/ x/ X$ e1 _9 V: [6 w
if(!node){
( A' l% j3 k6 V' H: O$ q cout << "新建节点失败!" << endl;
: U% K* ^% F& P) \7 g/ D$ [ return;
, l( W1 _5 U- V0 t }
4 p. L+ O# v: A4 ?; B) f% ]$ j node->data = num;
( k, Q! U/ x0 P+ a cout << node->data <<" ";- T0 \3 t- p! w/ n! I/ e( G
if(NULL==HeadList->next){5 t: f' A; t2 `5 T) y$ j- S) h
node->next = NULL;( H7 b# c1 c' w$ V) |: F
HeadList->next = node;
0 G3 N0 G1 U( G7 K. [; k# a# i' H EndList=node;
* W; A& x+ {% f# k' N' }; b }9 O# e6 k n; { x) G1 E% G
else{1 a) x' J0 k0 _2 e
node->next = HeadList->next;! A# W+ A2 a( n& _
HeadList->next=node;6 A; ?# p5 T4 \3 |9 y
}
- ?6 ~$ U( G: W% K# q2 G) j Length++; ; B# G8 Q3 r& ]) Z5 m& \1 O
}/ r& ?" u+ S; B/ ?+ k4 }# K2 e0 r
2 I5 H; B# R4 t/ q8 F4 ]$ Nvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法 " r4 w8 r+ Y$ O; g+ B1 |9 \$ ?
node = (LNode *)malloc(sizeof(LNode));
' u. F, P, B: z if(!node){
) P9 `- S9 T, l+ r$ V/ _' W. N cout << "新建节点失败!" << endl; 7 e& l, H b# O, R
return;
7 L& B* O; O! p0 z% z }
K2 q) |2 t j+ X G0 y0 y/ X node->data = num;
3 C" U$ d X5 v cout << node->data <<" ";2 z; P; B& {1 i: h B
node->next = NULL;
, h% u" b: {9 @+ C& ]' q/ V: V. P EndList->next = node;
7 |4 d; R. h) g! w3 G EndList = node;
7 \5 C' P5 @7 J4 `! Z; [4 O Length++; ' G& H8 I, k# l4 \4 t
}
0 a2 T7 I( J; `, M+ m0 g3 Z, A2 s" T$ i% q" |
删除节点
" x4 O' j6 t6 Y4 {; s7 z6 i/ A( G) d6 z. U9 s, L% K8 d0 W
void LinearNode: eleteNode(ElemType elem){- s s4 ?/ n: K6 T- H h
if(NULL==(HeadList->next)){
: C4 F* Z! x" x9 I/ l: o* z# Z cout<< "无节点"<<endl;
2 a% w' i* I+ }$ n! `2 @ return;
! H7 l5 V$ T, u9 c' A5 R1 w- E }! H0 o4 H' h+ L6 N0 b8 w' F
Node_cur = HeadList;$ ^; W; |7 R b8 r/ Y7 y6 e
while(NULL!=Node_cur->next){1 @) j% D/ X0 i0 u. m5 Z
Node_temp = Node_cur->next; 5 e9 V# G9 j8 H5 }, V. q* c
if(elem == Node_temp->data){
8 b! S' n5 H% {$ B) N" {; h# Y Node_cur->next=Node_temp->next;. M* {* N6 Z4 J. O& @: ~ W$ k
free(Node_temp);
. `) |4 B* |4 U4 _7 s }+ c; Y9 L w L: [ h! B3 C
if(NULL!=Node_cur->next). `" _8 \' E" c" r" z: v
Node_cur=Node_cur->next;
) o* T! |$ g6 H* Y3 l: R- f }
' k4 R1 [+ D1 f& E& L cout<< elem <<" 元素已删除!"<<endl;
+ ~. `- U! ~6 l}
6 X% k5 k! i# T. k( K% O( m# |! k8 k M- I
显示链表3 H, S8 V+ d6 f/ h/ a1 @
. B, _4 U$ k" y) B7 t
void LinearNode::ShowLNode(){
; H* X# l, t( e3 {5 K/ i if(NULL==(HeadList->next)){' U2 P5 A4 Z5 U6 U
cout<< "无节点"<<endl;
4 I! \( T- f# u- }" u) B return;
% M) r% T: O' ~3 ]' g) c7 i. n }
5 f& Q8 Q6 `' u Node_cur = HeadList->next; 2 ?9 g% D) R4 j4 O9 |
while(NULL!=(Node_cur->next)){
. s7 p- l: l! W7 x" m1 {# ]! h cout<< Node_cur->data << " ";
. j `% j# v( z( ^, r- x1 R4 @, ^ Node_cur = Node_cur->next;
5 a4 ?& v) h+ G( M }
' Q) J" r4 F3 F/ t7 Y1 V. n& E cout<< Node_cur->data << " ";
3 o: e2 r) x( C. I. G) E cout<<"链表中的数据已显示!!"<<endl;
7 t7 y( E1 t* k, N}
' e0 O; J U7 l
A7 t9 S- P& l4 M& ~" \$ B销毁链表9 V% V5 b) h- ?! Q
- Q m) \8 l: r9 e( o1 f; x7 w
void LinearNode: estoryLNode(){! \+ I7 q1 k, B. k. A
Node_cur = HeadList->next; ' A6 }5 ^! s- G
while(NULL!=(Node_cur->next)){
2 J1 Q! x6 x l6 R1 H Node_temp = Node_cur->next;: d& g3 ~8 \0 A8 W& z' S+ F
free(Node_cur);
0 G! X$ O# ?% j; ?7 O: g Node_cur = Node_temp;' |3 a! I! j0 S4 j9 M" j0 @4 D
}
, u7 H; l: S( R ^. U; V free(Node_temp);
, @; i. |" m0 ~( x cout << "数据节点已完全释放!"<<endl;
. S3 \0 W' t$ f ?1 J; A, F free(HeadList); // 释放头节点
) A* X6 {; q" X# n+ d" s( r- x cout << "头节点已释放!"<<endl;
* T. ]; m4 s, V+ L2 H————————————————9 z& E! ]8 w. d8 W6 k
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 B, Z0 S+ K3 G# E- W( b; j8 M9 |原文链接:https://blog.csdn.net/Baimax1/article/details/106036286$ W6 O. O- D$ H9 S) m
% V0 g( G) I" T" _
, l" ^7 @' q. M& h2 Y |
zan
|