- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558560 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172941
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
* U# d9 V7 A& l/ f
线性表顺序表示、链式表示实现方法及其异同点
( m" ^; h# i$ _+ w$ p线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。% g$ D3 z* F4 }* m; W$ @
# A+ E2 B! [5 x9 G
本文采用C++实现两种表示方法。
; I4 P& P, I* z& j/ P8 [: h2 z4 C D6 |! x
目录
- k) u" k+ y6 G- F+ k9 D7 D, g) J4 ^. m. T" |
顺序表示和链式表示的区别:# d1 B5 `1 l2 e& l( d0 `0 d; f
1 L; ], }# \5 _ p" l创建方式:+ k" M2 z, m$ h5 U3 a( `
: Y& k, O. Z& X7 P8 o+ w% H时间复杂度:6 u$ _8 d) R' \/ M) d4 ~1 x4 ?
+ z1 }% s3 O& Z
顺序表示和链式表示的相同点:* q1 [: v8 ?6 D
$ H% i) _2 N6 } W& h! k9 |3 r
删除内存空间:, t) F2 g& |" e
$ A# }8 g- G5 w. \, V
代码实现:( T( G: y" }" a! \
; |& ]0 r. \ P2 @7 v顺序表示方法:: s+ X" A* T8 N/ Z$ V, Z8 v0 i
! D5 ^8 c6 W. {( x' k" e: t j
结构体定义
9 _6 b# A1 o1 B/ Q% Q/ Q: U; H$ t# U, f- e3 }5 {
初始化
0 L& r- g6 T6 V! k' E- s- n2 y* H Q8 ?* o/ T
增加元素
2 }5 s2 Y4 L7 H
. S R; c. t R* U5 m删除元素
# y& X) u8 s' j- ~# T# E' r1 F) e3 g( D) n6 X. {; F
销毁列表
4 V& X; s2 Z3 K* B5 y+ b, U" B" C o; {" K
链式表示方法
# N z$ X* u8 D$ x; a5 {5 R: p5 o/ [1 k
结构体定义2 t/ c* l) I; W) l" g) Y
* M- p7 V1 r% x初始化
# S+ Z3 r) H/ s
( y* ~# c( I2 C% D" g增加节点
& ]4 N) i- J, o- l
) x+ }! R% A) A* `删除节点
. K, p, W2 R; ?, \" N, N8 T- n5 O
显示链表* s$ _+ b( K" b/ T1 D0 g$ k/ `5 q
5 X5 Z5 I) f9 G. K1 P* o! @1 n
销毁链表) p) p# ?/ }1 b8 m
6 e8 } p1 g7 y顺序表示和链式表示的区别:
$ |* a _# I- ]6 r" [/ S" L2 N" B l! ]
( @ I" X0 _9 ` h: k创建方式:
+ Z$ E6 ?4 L4 h# ?0 t: I6 D; H" S3 W3 n6 j' b; U; N
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。" G. Q6 a t. x/ d; }& H& {- F
9 m! e3 V }0 r' k(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)( ^- I" r7 u9 h4 Z; m, ]/ ~
8 Y& E. q& J b2 o" @
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。/ ~3 n1 J; A7 f# o/ y$ U
% M- R0 s/ e1 O+ ~0 X9 ~0 R时间复杂度:( I! {6 U6 Z' G# ?* t
9 q: j/ X( ?9 @0 \2 X
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
! t% `3 ~9 D5 ~+ w+ b; u) j& }6 j5 K1 v! u! ^, ]" V# y
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
7 f. E, N. O; v. v/ }5 G0 J a3 M: Z9 w
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。5 p; l1 [9 C1 ]. j+ b; L& t2 V
. v/ b6 o. C6 j/ `! s/ {& g M
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
5 r4 o; N/ X$ e( Z
" B, H c( f1 q! D5 y0 C% s查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
% W$ |0 a, L9 H1 c# f- Z( h! i' t. F6 J- W8 ]' Y/ b
顺序表示和链式表示的相同点:) X1 h: e' N% n5 Y$ H5 m# K
2 K# f" m; m7 v* T9 v
删除内存空间:" t! c; _ b; L
& [1 d7 P2 d" u( y1 s7 K+ Y+ F
内存空间的删除都需要对每一个存储单元单独释放空间。
% e: h% I- [# f& J3 N7 u
- x9 R( z( I1 { a代码实现:) v* t& M6 [: J* o& s7 s
* o3 s. G: `; Z. s顺序表示方法:
+ c+ h; ]" q/ z! ]5 L6 T; @! t. u$ r% i6 q+ f O9 N& j! g
结构体定义
; P H* i0 P q, [# f1 P
* n0 ]' X% J0 gtypedef struct {5 \5 a3 [/ S% M4 E2 K! B y
ElemType * elem;# e$ v4 O Z' c8 Y- M! a. r: U7 `, O
int length; // 线性表的现有长度 % a# Q6 w' }9 o3 z8 V- y+ R1 h
int listSize; // 线性表的最大长度
$ A3 [0 T3 v% } }$ M}SqList;" ]) m& H5 D: C) z7 K# a% d V1 W5 ~
' @% i( v" j* R. M, }初始化$ M2 @" @* ?, M% T) ^
# V# l$ N% L1 y w) M) _8 @
void InitList(SqList *L){
8 _, N/ h# P/ A( Q6 t2 z L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;. p9 Y/ x# ]) |4 E9 y% ?
if(!L->elem) {
3 T! M0 `$ A/ N. e# l& R. \ cout<<"申请空间失败!\n";( G( ~; i( J( `: R
DestoryList(L);& A# X+ n f: F- O$ M, i
}2 @) f7 ~& t& Y3 w, t
L->length = 0;
7 S7 g/ L6 G3 p L->listSize = LIST_INIT_SIZE;
, Z Q: z: T! B9 I" I cout<<"线性表初始化完成!\n";+ b3 h$ { @* e; U& f$ Y6 R
}
' o2 m% a% a4 w, ~$ ~/ U* m# f; o$ Z2 }, b
增加元素
. c+ R+ w. t0 R* |: o3 m6 k
( n9 O3 c( f( N: uvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
, H3 ^- R8 P3 ^4 b, I" V if(L->length>=L->listSize){
0 A) N& J$ l1 l' q9 c; j7 } L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));% {3 ^8 V6 M e* I0 P3 }
if(!L->elem){
8 _# ]) g! P; Q2 b6 L cout<<"增加空间失败!"<<endl;- E0 P& q+ z7 B/ k4 j- C
DestoryList(L);
- I( X4 z5 x& o# d8 [0 C* w }1 f% A5 S5 ?% Z# J5 s
}$ v) w0 V- `. f0 X( S( R( N
* (L->elem+L->length) = e;, x+ @6 e. q; H; H, Z2 ]- I% S: C
L->length ++;
) D- r5 i& R! a, D8 U6 [+ q! p}
1 R# x: Y, U5 k1 y0 V( Q, Y$ e# |" l
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素8 _/ D! j6 i, {3 o0 z
int i;8 F+ \: @/ W1 e7 a1 t7 ]
L->length++;
. {$ z0 s0 R7 Y8 O( b7 I for(i=L->length;i>=e_where;i--){8 _3 \" ?! T E! I
if(L->length>L->listSize){
~' G; _' i% X# S7 B/ L9 ], m( \ L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));$ Q2 S- C S `
if(!L->elem){
" Y3 V) i! H2 W, v- R$ G4 \ cout<<"增加空间失败!"<<endl;
0 {, r* s2 M( r DestoryList(L);
7 D: i m: h+ q- U9 H0 X }
, t# g6 R4 _2 O2 n) s) B }& H: W% s" z" K' X1 Q! |! e
*(L->elem+i+1) = *(L->elem+i); & h* y7 W$ `& N2 e5 \1 o
}" P+ t; J0 ]1 e, n; y
*(L->elem+e_where)=e;- h$ R: U- G t9 f( C
cout<<"增加后的线性表如下:"<<endl;
! ?& e$ @% Y6 t5 S( g+ _4 t- ?# U ListShow(L);% ~( z% |9 C3 G N" a( |
} $ m$ t# N, E2 \4 e& }' z' o
T+ g0 P! x- O9 D# b6 l
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素3 `8 o7 N! ?1 X) b
int i;3 a! @, D1 r, h3 A2 `% f. w
L->length++;# J. b- d) }7 | y6 J/ o
for(i=L->length;i>e_where;i--){. z9 Y) T0 x" e0 j8 M6 e
if(L->length>L->listSize){
+ K" N% {; Z/ B5 \2 Z6 | L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
* E& q3 R# W! k if(!L->elem){
% u0 D6 X% Z$ J& t8 m0 N T cout<<"增加空间失败!"<<endl;
1 y% K5 ^$ t9 y! z DestoryList(L); 5 }+ v/ v$ Q4 T+ o/ F
}
2 }6 f3 R* v8 u1 C7 g1 v9 u }6 d" @5 T! y; k
*(L->elem+i+1) = *(L->elem+i);
l5 r4 @( u z& a }* [! `4 L- }9 b2 v2 o$ D
*(L->elem+e_where+1)=e;
$ p4 ^5 W$ h3 A ^0 z, x, ~ cout<<"增加后的线性表如下:"<<endl;
; ^/ t, P# ~ h9 ] ListShow(L);
2 }9 _, ~5 v3 }9 Q6 U}. D" u7 a/ s2 t7 y3 u! M
# m! @- |. S, k3 O, v
删除元素
; s" x( W9 m* W* M; A
t3 Y0 o+ x: p: w7 A! nvoid ListDelete(SqList *L, int e_where){ //删除某位置元素 2 x6 }7 b+ h! |4 e+ ~4 m
L->length--;# l1 {% o8 r2 p6 Z2 B8 p
for(int i=e_where;i<=L->length;i++){+ z5 ^8 N% S& L6 m6 H" _! B
*(L->elem+i-1)=*(L->elem+i);0 x( @# A, g* r1 v5 }0 L2 X4 T+ ~
}/ c) }5 I B6 S) r
cout<<"删除后的线性表如下:"<<endl; 4 i% w3 P) j% y1 R. D! z- G
ListShow(L);
, ?/ i2 V" U2 h4 w7 R2 a6 X}# w9 l9 b3 I1 C8 b% S0 o
, X# N& G. _1 R3 _
销毁列表
- K* \9 x1 i# \, d' [/ ^: x% v/ o! F
2 P. n% M9 s8 v2 i) fvoid DestoryList(SqList *L){$ Y& D4 }4 B& P8 X+ j9 H
int i=0;+ a% z% _2 u- ~. B. Z& \
for(i=0;i<L->listSize;i++){
9 e8 Z3 ~: q( ] free(L->elem);
- Q1 |5 K$ b o9 q3 E& p L->elem++;
4 l6 U" w; x& h& l/ @; P }3 f4 X1 {9 L( g1 t' I
exit(0);
7 W/ c% K% w3 ~- v- q1 g+ c; Q: M9 h}6 ^+ u5 U4 _8 B+ O- c, i- ` @7 k8 i, j
3 y9 _4 b j- O( r- Z9 e
链式表示方法
. c3 D$ m+ ?1 U( [7 Q+ A" o, n( m( S9 [: r; d# E: d% v2 d- H: n
结构体定义$ E* k/ H7 ^, N. E
+ O( U* a" E0 n( J* e* ctypedef struct L_Node{
% ?' O% `; u, V7 B0 l/ c; H8 s a ElemType data;
' ~% E u ~) ~. |' m5 a8 D$ X* }$ q struct L_Node *next;" G$ }$ S& s/ S% K ~
//struct L_Node *last; //增加可变成双向节点 ; n7 w8 j$ o! _1 T
}LNode;/ o' h2 G* V* d# i1 A
. y7 l5 _. p! L9 O
初始化
7 P2 c: H& L) E$ v- n$ f8 K ]
void LinearNode::InitLNode(){
/ d% ]4 n) b+ s, r3 h+ Y; V HeadList = (LNode *)malloc(sizeof(LNode));
# c* T& q4 ^/ [1 s3 E( W* } if(!HeadList){8 }8 G0 }$ @: t: n. E1 A6 A
cout << "初始化链表失败!" << endl;
4 [2 a7 d, T9 _ exit(0); ( J6 q! l/ Z; g
} / I& S' w5 F! k- K
EndList=HeadList;
# b9 R3 ]2 C4 K0 n5 l! }1 {, ~ HeadList->next = NULL;2 x0 Q; n$ n5 H# w3 T
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;- u$ ]# n- A0 r9 Z
Length = 0;
& V V# M/ ]) J+ \. C8 d e_where= 0;( Y; I7 Q, T w
} n$ c% o0 U6 O8 i( \; V' N% u8 Y/ }, ]
" R2 S0 `; y5 |! f* r6 L0 ?增加节点
9 w( P6 T) q. |( E$ {8 W6 W" h, ]: t' \
void LinearNode::AddNodeHead(ElemType num){ //头插法 ' @& x8 f, c: m. ~3 X8 ]! n
node = (LNode *)malloc(sizeof(LNode));( j6 s5 M& Z' n4 b B
if(!node){; o. b, i% b9 m$ T' e" N- |2 Q
cout << "新建节点失败!" << endl; & ]9 l5 F$ `' _2 H- m
return;
* Y; ^4 L% R+ h, ?$ m9 E$ ? }
# x& a% S0 L, c5 e+ H node->data = num;
+ n0 c6 m u1 g+ `- l; g cout << node->data <<" ";
8 i% d0 w! x1 {; I- r if(NULL==HeadList->next){& h2 l( O& L. S0 G2 d0 A" V. T% _
node->next = NULL;4 F, \ F3 G; ]6 M8 `
HeadList->next = node;. m7 _6 K, O) Q
EndList=node;
J1 D5 Z) B% y: ~ }- O1 T e( _, U# u6 C9 t
else{5 k% _) d7 X- c* Q+ y* h, z) C
node->next = HeadList->next;
5 c u0 Y3 A8 |; _' H! O V HeadList->next=node;0 g ]/ J+ w0 |- P% H* Z; ^
}4 i: S0 }# O* U3 q
Length++;
4 W4 P6 T) d0 W# m9 Y! ^}& \9 g0 e T% A
4 ^5 g& H B- L/ |
void LinearNode::AddNodeEnd(ElemType num){ //尾插法
7 z# y( C0 k8 ` node = (LNode *)malloc(sizeof(LNode));" t5 |) {# a8 E+ y L
if(!node){0 c: j& Z2 _' N! t* g# o; k
cout << "新建节点失败!" << endl; & m) _# g( n8 ^! k
return; % H z6 r, g) S8 [$ g: `) w- w
} 6 z& s: C* D8 R" G4 W* g
node->data = num;) T8 w" H) a( l) Q
cout << node->data <<" ";% ] B, \! c6 [! K3 E+ t# [) Q$ V
node->next = NULL;
7 B, d8 k& K7 u% B. v' s* p+ _ e EndList->next = node;4 ?8 ?0 }9 K& _9 J% q
EndList = node;7 w* b2 M- X, ?) Z
Length++;
' U2 C3 k& r) P6 K4 v' {, g}
2 g# `6 i' I) p. E8 q
1 {: H3 ]" k- A. g+ A# m删除节点( w/ t; x" L5 l4 ]
+ @1 |0 J7 A2 j5 a9 J) I
void LinearNode: eleteNode(ElemType elem){" v8 S# I' E E" }- ]& P
if(NULL==(HeadList->next)){! w0 u8 E `* m- C& l; g; D! J
cout<< "无节点"<<endl;
! H# T* t: G7 @' T return;
! m# O2 F6 l* D' `- f: t+ M }: Z$ x' l. N7 F
Node_cur = HeadList;
& R- r L4 G1 G! X+ `; l while(NULL!=Node_cur->next){8 }8 e R0 g) \5 I$ \
Node_temp = Node_cur->next;
- R* _& m) s* Y. Y if(elem == Node_temp->data){
" `. e7 f1 Y1 [1 K b Node_cur->next=Node_temp->next;# s* L5 [, U& Z' N( D/ s) e9 A& S
free(Node_temp);
/ J0 m+ t" Y# p6 r# i& `! p+ ~) T) Q }
, _; g+ Y7 i1 b if(NULL!=Node_cur->next)
. r7 o0 R3 g8 P; c* E Node_cur=Node_cur->next;$ \2 x; i" ]( e) ~
}, Q/ C' i5 U# b" Y3 u4 A
cout<< elem <<" 元素已删除!"<<endl; 2 s, I* N. d6 X ]! N" U. C
}
' m% s8 I' x7 d: r
( O5 y! f" n; b7 e* E. b显示链表
+ g9 e9 o, i# c0 @8 J" ?& a
2 X% M9 n% n& z- Ivoid LinearNode::ShowLNode(){
/ d7 Q; o4 P& @' w8 U if(NULL==(HeadList->next)){
* c% I. P7 e$ }+ w cout<< "无节点"<<endl;
2 }( b0 w2 q: S. i$ @ return; * P- {5 Z! ^9 ^! S
}4 q0 \& y }3 u) G5 N
Node_cur = HeadList->next; ' v: O. g( w7 t! _ I- o
while(NULL!=(Node_cur->next)){5 s9 t: A/ u8 A' L/ ^8 \6 z
cout<< Node_cur->data << " ";
) x+ Y- j+ x7 Q4 W! } Node_cur = Node_cur->next;6 { f& T5 B" }+ a
}' n* O, h l5 c8 f* [ A8 `
cout<< Node_cur->data << " ";5 t! Q- b5 K/ r y
cout<<"链表中的数据已显示!!"<<endl;
; m" b" d3 u7 {+ m$ V8 Z) Y; E}
; ~3 s+ m% g7 Q: _" ~' m- w$ N! y, h9 O6 d# \' x& N
销毁链表
- M8 V# U1 s8 r* q" T* |) p
/ i* Z" _6 ^1 H/ C5 ]" |& ]void LinearNode: estoryLNode(){
+ F( P2 F! _! ]: V! p' F5 j+ I Node_cur = HeadList->next; ; P6 B6 j, ]& a+ }
while(NULL!=(Node_cur->next)){+ X/ J Z8 P$ w
Node_temp = Node_cur->next;8 [6 P; T3 a: g6 c2 u
free(Node_cur);" t9 F9 S: p7 z) c1 L% ]
Node_cur = Node_temp;3 L; I. G2 V& `+ C
}" K* z9 @7 i' `" N
free(Node_temp);
6 n7 u. u# l" w, B9 H cout << "数据节点已完全释放!"<<endl; / ^. A$ r# z( H( U; P
free(HeadList); // 释放头节点
& p3 D& [. p+ V3 o; S cout << "头节点已释放!"<<endl; 6 p% D, r" |: m
————————————————
7 O! x& S6 _8 B2 e* D版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- e0 b9 s' l" ]$ C, ]; S6 V0 ]( ]
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286. W' Z2 D {% P7 a2 C
9 s" P; w! d+ V0 h6 L9 g8 C# _0 x" Y% b& _% W: h
|
zan
|