- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563404 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174244
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
2 j Q% G& t0 J& e+ S$ ^- h x
线性表顺序表示、链式表示实现方法及其异同点4 J! x9 A0 g C, D! M+ [( I+ j( p
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。% O. e; B2 W& |+ p: R( g
) q. D! v0 I% H$ M0 R* |本文采用C++实现两种表示方法。0 o& \; g# o/ S9 }
% U6 z/ I6 n9 B s& p6 p) c
目录
U$ K0 U- w: F F
/ Y; S& p, ~5 G2 s顺序表示和链式表示的区别:1 Z8 \, U$ `5 n9 H1 \7 ]8 W
+ R. q V) F2 p# `; T/ j. O
创建方式:
1 j* h! c! ~% X" t
" e; g! T J5 A7 ^* G9 R时间复杂度:) E2 A/ u, K! T) _5 w* v
+ f) C8 c) O2 {8 [6 {顺序表示和链式表示的相同点:
! B$ v3 P, V4 d+ z* f
$ {0 s5 y& d5 S删除内存空间:
4 l1 G1 P( u9 h% q! B) Y$ ^: U; f0 U) ?! V1 j, p! l6 e
代码实现:
% z& C7 P0 C0 z1 k/ M
% ?; Z4 l. m: `顺序表示方法:
$ w* n8 g/ ?( u/ j- q* ?7 e9 T, Q! N# l6 I1 W
结构体定义& \: `) c, j; ]
9 h, c2 y6 e$ D
初始化- P; k2 ^3 L- Z
+ E8 C) @ q/ x增加元素1 |7 i; p& k P6 t9 O
! r4 \" z4 o6 @- l$ q删除元素
( ^. [6 K* L2 u, O& c( Q j7 H( g8 l9 I+ U% y2 t5 o
销毁列表
. P) r8 y, W8 E( m/ ]$ b" H2 U2 Z/ ~- j5 K
# G" J* H# i e链式表示方法
( O* U+ X7 Z0 v, D; U2 N# |/ V( ?# i
! K0 }! x8 R6 n( B- t4 \% v3 f结构体定义$ n( {: _" H) O, C5 B" Z
, W6 ? o/ g( O
初始化
1 i" p Q5 w" G- S9 w/ Z' E- h9 @& x( y3 b
增加节点
7 ` @. C# P$ q6 m( n* x- p* G: T+ T6 H
删除节点2 G3 ]8 L" O! }# M/ B
4 R: q: }" \/ U3 D8 @显示链表0 `0 l1 L$ o3 c p
% o. I# r/ U! g2 T# P7 @销毁链表
; G9 Y' [# ~8 b/ }! ?( ?
" T" W' g. T3 M5 U顺序表示和链式表示的区别:
3 @! B3 w" ? i+ s
$ j# C e. W. G/ U) @创建方式:
+ f3 j& \" j5 P9 }" S5 @$ b. I" n. D6 ? M& D$ n w9 R+ m
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。: G" X( b9 ] D+ @9 Y t* c/ l- x
0 @9 t, A& { W3 B
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)* j, R/ P5 ~0 U9 M/ M, n
. b: F; q7 p5 X0 w链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。8 l: i1 R! ~6 S% ^
* n Q" j( w" ]时间复杂度: }! S# k/ n3 W$ {9 l
/ `. _' t. E6 _% V. i0 S增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)" G& P4 G1 ]/ S! z) W
/ k8 Q/ Y9 s7 m. ~! }" C' f" A, e) j增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
2 _2 _# P& o1 _
# t( m9 W2 h* w7 APS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。1 K8 N% l5 _( m8 _
& @/ v( V! P) P4 R1 \3 D' [2 n修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
% `$ w( ]1 ~0 G) Q* |4 M, P& [/ d6 }9 A
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
7 _, e. ^6 I! K1 c4 p
! e R' o1 U6 G" m顺序表示和链式表示的相同点:, j2 }, u- x6 U8 K9 }
! W1 t4 c" }8 `' f8 D
删除内存空间:! S u# v) Y% G! e+ D0 k- X' e
}% J' h6 m J内存空间的删除都需要对每一个存储单元单独释放空间。( Z1 ~4 h$ J& Q3 p4 p
* w! n; X5 t1 d0 |4 n& v$ @! v
代码实现:
7 b$ A& I% O% z* w5 M% \2 ?: a: j. A# c' @
顺序表示方法: N0 b* z3 W3 _7 I% H
/ G* l, y* x% Z* i% F+ N
结构体定义; F6 w1 Q% H7 _& L; z
& Y D4 K$ a. S3 [4 T i1 P o
typedef struct {5 z3 c& b# O0 O7 i w" [
ElemType * elem;
- z: `4 `& V: E1 }6 H/ j int length; // 线性表的现有长度
i6 X% t3 \8 n int listSize; // 线性表的最大长度
3 X: V4 m' r7 k) N7 p" \/ T; Y; q}SqList;' n' k* }5 U+ A/ A1 ~
4 ~5 j* C+ v8 E+ {+ R4 s S1 E初始化! f8 A1 z8 D% B4 b
7 v6 X6 H1 H: |& @/ |) Y
void InitList(SqList *L){6 b( c* e' |* [9 u; p
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;0 M1 g; a: k; \* Y, ^
if(!L->elem) {- E" r3 d: l1 E; B/ i
cout<<"申请空间失败!\n";
3 d1 m: i/ M/ n- [ DestoryList(L);
# |3 ~# `6 d+ X& ~: ^ }
9 J2 {* o/ u. A L->length = 0;7 ]6 c3 _' N& ^1 j1 ]
L->listSize = LIST_INIT_SIZE;
* `% X4 |- G. F- G2 p. p cout<<"线性表初始化完成!\n";# [3 E2 h& X6 r) J& D: Q @3 k+ [
}
" d# x) Y# x0 C/ b& j' e! m% M. o
1 C/ I4 l: O0 l- d增加元素; w q! p* G* z4 j) C
$ {* f& C0 y4 q) E
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素4 b p4 B: u, A; u' @/ d4 ]! S
if(L->length>=L->listSize){
- z6 B6 V3 E- b L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));% G5 d4 {( H/ b1 d& s/ F) r( H5 a) `
if(!L->elem){
$ f& G- h2 x5 y cout<<"增加空间失败!"<<endl;
: `( ^# `( A2 b- T2 M DestoryList(L);+ @5 T2 g+ R. G
}- J6 N# q: s4 M; P
}
7 t! u& b2 E+ `$ W * (L->elem+L->length) = e;8 O9 I' ?! r+ P. z( C3 Q* U- i3 K
L->length ++;
; Y# c3 J4 q) Z0 B% G}
$ F3 x8 d. v& R O! M6 q4 [4 b+ N+ R$ x/ D4 Z0 R Y( s2 M
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
! L, k _ w+ B- H& U int i;+ @3 v3 k5 M* Z9 i
L->length++;( t# r6 g! m/ L" N4 B
for(i=L->length;i>=e_where;i--){
* P, y' M$ H6 Y if(L->length>L->listSize){ M$ m" v* b4 e k
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));" Y) E& W1 \ W( [
if(!L->elem){# c% E& U2 A6 c/ I
cout<<"增加空间失败!"<<endl;
3 w/ T' O2 L" T0 K2 S1 T4 I( z DestoryList(L);
3 j+ v: D0 @' E* [ }
% d8 M; Q4 j( E/ b# \' Z. i }9 D" `* x9 @& M! @: o% e
*(L->elem+i+1) = *(L->elem+i);
, x; y: z7 q/ D$ m! R# e6 M6 X$ l }
2 e$ }* o+ f8 x- | *(L->elem+e_where)=e;
/ Y I4 G' F1 X" |. ~- k* q cout<<"增加后的线性表如下:"<<endl;
% d$ n3 P' P% U4 b* }9 O6 O ListShow(L);
5 J5 W) \% z8 s/ ^4 \8 s! W} ( g, P, W: F! l$ j
. x: @, K; x4 k6 H6 Z6 N) p' uvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
# J T6 i/ I3 L" h int i;
( K! |5 W/ W, _$ Y% G L->length++;/ M6 E( C! [/ Y8 ?# [
for(i=L->length;i>e_where;i--){' W; @/ B& H7 i- N) C9 [
if(L->length>L->listSize){2 v& m) O4 j w) s9 z8 I
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));7 K$ x' n* A" n% i+ I- L3 l
if(!L->elem){! V* g' K& ]; O0 Q4 d3 @
cout<<"增加空间失败!"<<endl;% k1 C5 D% V) x- r7 i
DestoryList(L);
1 H* {8 v; o0 o( s. e }
" Q. e* P) z7 j. m6 d$ P o }
3 A( j6 H$ e* Q' C *(L->elem+i+1) = *(L->elem+i); # u# C3 N, K# R
}
4 ~% C- l% Z* x1 o9 j *(L->elem+e_where+1)=e;$ ?, ~. U/ L# Y- I! @' Z
cout<<"增加后的线性表如下:"<<endl;
- l/ s+ ?# N8 L+ _. G ListShow(L);0 ~3 ]2 S6 m! ~; l: {; G! F
}9 t/ x* _' [- s# ]% h6 s
# n3 d0 k# z" N7 ]0 W) q9 Y7 p
删除元素3 [: V1 W% X" H! |2 I: Z. G
! d f0 }8 Q* ~8 H4 `
void ListDelete(SqList *L, int e_where){ //删除某位置元素 1 v7 [( r6 E3 X; i# T: t& B
L->length--;7 x2 o) g9 x0 s- p
for(int i=e_where;i<=L->length;i++){
+ f' M: P5 N$ l+ y% I4 Z1 }* |' a" a' F *(L->elem+i-1)=*(L->elem+i);
1 ~- {# E2 ?0 g }( P A2 G" V- N
cout<<"删除后的线性表如下:"<<endl; 8 f% e; c7 Z2 x0 a4 O) B
ListShow(L);( K4 a! M0 }3 V9 m) K
}: X( K0 R0 U- ?5 A2 C
& l, g6 r1 a5 D( \$ ?( ]8 ~
销毁列表
& c! Z& `; ]+ C( S- P% n- }
9 o8 v. V, ]5 S) _* m- K Vvoid DestoryList(SqList *L){8 m: X# ]$ _+ }" ?2 h
int i=0;
) N q: @! u0 ]- Q. P- R for(i=0;i<L->listSize;i++){# f2 m+ a, E, I# ^$ u: x4 k
free(L->elem);) I, ~0 H. \7 m4 ~
L->elem++;. w0 `7 C* F! A4 U6 j; d* Z0 M
}
, e' @2 u/ I8 w% T7 }+ C9 ` exit(0);
! Y& F8 |7 u, M( O' d2 b4 U3 A}- D- a% s, H, ^% Q4 n, C% Y! s1 T
1 Y0 @9 E# X" y; l Y2 Y. O
链式表示方法
# K7 n; Z4 t# U V
! Y1 {1 \5 q& d' [3 ?0 Q5 U结构体定义/ Q: r& `) R7 z1 D# Y4 a8 A0 {- t
9 X# D/ W* W) ^typedef struct L_Node{
, n. \' O9 [& k6 [5 R ElemType data;1 ]3 a# y o8 Z/ b
struct L_Node *next;
; D6 H: Q' d2 x+ Q3 D: J //struct L_Node *last; //增加可变成双向节点
; K$ W# A7 K- [/ ]( v0 W}LNode;$ N! Y0 S9 d4 c+ ?7 r8 }9 i" }
3 f5 ?% N1 O/ P5 g4 ?) y) M2 f
初始化2 X, l& m' \+ k
; k1 ]: Z0 s! m9 a7 r! Jvoid LinearNode::InitLNode(){
' p: K% M& K! e5 N3 J' f+ A" w HeadList = (LNode *)malloc(sizeof(LNode));1 w! w" y9 u2 b9 |2 M, I( r- i6 d
if(!HeadList){1 V/ }! Y) E7 z: E* M( ?
cout << "初始化链表失败!" << endl;
; j" H6 G6 a! a/ k5 A exit(0);
{9 D: |" k! [$ A( v- S } " e+ B+ S$ I% G$ v
EndList=HeadList;
; x+ o! e8 Q" V! ^. q$ Q HeadList->next = NULL;
. @# E9 g- K8 ]9 ~: H cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
: S$ |+ F; I9 X Length = 0;
# A4 q' U4 ~9 R! K o4 O o e_where= 0;& f# ~8 X0 R1 c* s' n* c
}6 w5 i$ a* r( h9 J$ W# x5 L, y
& T8 L6 {2 }4 M$ t0 e z增加节点
& r/ I) z1 v0 G& _, j
' [/ t" V4 @5 evoid LinearNode::AddNodeHead(ElemType num){ //头插法 8 M8 y. y% F7 k( n# ?. e
node = (LNode *)malloc(sizeof(LNode));. R) E1 P5 h) m" s, Q
if(!node){( a; X5 W6 n2 v6 C& @
cout << "新建节点失败!" << endl; # I2 [6 [4 e( ?
return;
r# u$ R s, `2 H }
1 m: l* F7 @7 r3 X node->data = num;
, @, u8 `$ V+ l) z. i1 S4 c cout << node->data <<" ";+ a/ |+ G9 B& ]& e
if(NULL==HeadList->next){
8 c- U/ e2 |1 U0 X node->next = NULL;
- [: A! ^& y. J+ S! \ I HeadList->next = node;
7 w n7 M! s) f$ X8 d EndList=node;
) [" Z. u7 ?$ Q3 p! e; J! e }
4 P- o: d4 \% E L" W else{
$ Q: @% K; u6 g- |9 L9 ] node->next = HeadList->next;
( [0 |5 u8 s( P* O) H: @0 C/ r HeadList->next=node;0 I5 @0 `! l2 [6 O; l& e
}
8 a! P8 x6 F: C( O; ]4 P Length++;
# ^0 A% [! C" m8 f( o9 Q! \}
# ?- l5 q" D4 [
$ D& g/ |( R1 f+ ?+ [) T4 y' i- D8 t* \void LinearNode::AddNodeEnd(ElemType num){ //尾插法
6 r% c% n1 y6 b K node = (LNode *)malloc(sizeof(LNode));" N# v2 L7 U ^) ^( o6 V: p
if(!node){
& {+ x* U }9 Y6 v# H3 x. s cout << "新建节点失败!" << endl; 3 F0 c3 {* X+ L1 s
return; ; Z1 R+ G3 |2 }/ g
}
. ^$ Y( ~ Y9 [' ` node->data = num;7 z; d, ^; o0 I5 Z; D: n
cout << node->data <<" ";6 l y5 Q5 b/ x& I
node->next = NULL;
- `, |" V4 @/ u% z EndList->next = node;
; Z5 Y$ |. D6 [. K. N4 Z! q EndList = node;
/ j: ?& V, J. q1 Q7 N8 k6 J) X W Length++; + Q' f7 b/ _- J. }+ T
}% P" d6 l5 o& _* a
/ f7 E0 Y. t; I" Y
删除节点
4 i0 X% [$ R E. q6 m O
2 c% G1 a* q' {! j2 W2 i3 P1 U( @- N4 nvoid LinearNode: eleteNode(ElemType elem){4 L8 ]& {4 p7 B6 R
if(NULL==(HeadList->next)){/ N) K* f! D8 I5 p4 O
cout<< "无节点"<<endl;) h6 |/ C' d; G
return;
" E9 _- V# u8 W5 [ }
- x, y' F$ E N+ Q) Y& J3 D Node_cur = HeadList;
# c% y# h. \. M0 s8 @' C& r k while(NULL!=Node_cur->next){
* \7 T* u8 C( l) N+ g2 z Node_temp = Node_cur->next;
( M6 P! z8 l# Y1 D' u |" I if(elem == Node_temp->data){
( `4 E; |3 a+ R+ V' \ Node_cur->next=Node_temp->next;6 M) [, S* B6 r L! v4 t9 ^0 v' p
free(Node_temp);
! G4 |! D- ?( c' w, |! B i, V }* k E) |# x- k" e
if(NULL!=Node_cur->next)$ [! }. T9 _. ?
Node_cur=Node_cur->next;
. O8 M: l) Y9 s, N( N& r z) W" P: Z5 G }
n5 p4 I' m2 G# ?& d8 D' l cout<< elem <<" 元素已删除!"<<endl; 6 A1 l ]7 S+ G% o& T. t0 V+ i
} 1 G N, d: l( a8 h
3 L: j% g1 a- M" o0 Z
显示链表4 Q# n: R# ?1 q: P; O) ^
/ ^& p9 s8 F+ D5 f" b2 g% cvoid LinearNode::ShowLNode(){
8 T( I; `( H" a* u8 I if(NULL==(HeadList->next)){3 ^, O9 o/ i/ z6 w! A- t
cout<< "无节点"<<endl;$ L* S6 @3 j) b- a& a
return; ; G' H( W0 b% d1 K
}% G( z# `- b# Z' {- @% G
Node_cur = HeadList->next; 8 M% q* |4 P5 H/ `- X3 C6 T
while(NULL!=(Node_cur->next)){
4 p" K9 ]7 q( A+ Q$ L3 O9 A cout<< Node_cur->data << " ";8 w" I3 P; b. c' j6 i" S' l
Node_cur = Node_cur->next;. `. y K! A) I' E$ I
}
/ u/ z$ f; X0 N cout<< Node_cur->data << " ";
8 O: }3 ^- _; n8 e' o cout<<"链表中的数据已显示!!"<<endl;+ v; z1 B7 z& g$ T+ C+ G
}! t3 L/ \* g# G0 x" e( U- F% T7 \
8 J; H; K7 s I) T8 q Y9 n7 D
销毁链表
/ f2 V6 X% H: s: R% h3 T- D- T0 x9 U. J5 [) B% p+ A$ ~
void LinearNode: estoryLNode(){
* ]% U# c D/ i& l4 Z3 R. P; H Node_cur = HeadList->next;
# {& K4 e( N8 T# S while(NULL!=(Node_cur->next)){7 f% x9 F' F2 e9 D9 C' `1 t% J
Node_temp = Node_cur->next;- y7 f/ e2 k4 `
free(Node_cur);+ \" }5 D$ q6 ^2 Q9 i
Node_cur = Node_temp;
5 @& h/ o- Z; c4 A }
. g( z8 y l# i1 _ free(Node_temp);5 g$ C8 v+ A# z! Y
cout << "数据节点已完全释放!"<<endl; 7 u$ d5 |% [7 \7 p. C
free(HeadList); // 释放头节点 ; G" Y# G6 [5 A6 Y) f6 x5 I
cout << "头节点已释放!"<<endl;
" P6 m9 m# X6 V* D- }& {* H————————————————
?/ V" E; |7 }' k5 v版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! j1 e- V$ _- ]& y2 \
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
2 ~0 d! n# U8 I( `4 T! ]3 r' `6 k: M6 L, L. }
( T7 H. ~ w' i* T
|
zan
|