- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566811 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175266
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
* X, y4 o6 J+ ~5 D! @( f线性表顺序表示、链式表示实现方法及其异同点7 d- W: K- d8 H
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。/ T6 y) ]% M8 E4 n
4 H8 s% {+ h4 s# g) |
本文采用C++实现两种表示方法。$ w0 t! @. ^$ J: }5 J
# D6 V9 n2 k4 l: w/ t
目录6 w0 E3 W5 J7 _: M2 A, f! Y5 K& M
6 H$ c0 M; o; }3 j" S/ ?, ?) b P7 Q" @顺序表示和链式表示的区别:) B8 x7 z) B# x% K& Q# s
2 w; S7 K8 z( a9 C6 Y( i
创建方式:$ ]/ i) \2 Z X. @9 L
6 ?9 p# L' w$ k+ } R/ M; r
时间复杂度:4 X8 u9 t. }, Q, T; q
/ e/ T& w1 M, L+ W: l: a/ R
顺序表示和链式表示的相同点:
* R; G3 Y5 Y) ^& J @6 M' L4 M
" W B* M! Y; ^) {: _; |& T( [, n删除内存空间:
5 b/ h$ z" [4 i& J0 k) p, q& |, I4 B( P* H- Z7 b
代码实现:
/ b4 I- |( r# V4 c# x
* |( g) x/ h" {$ U- @$ B( [顺序表示方法:
, Q# a- ~, z# G2 ]# J z+ d& y( ?
结构体定义+ i0 T5 m( J2 [! S
- \, U, k# j2 P- n* ~: n2 Y9 H5 _6 D初始化& C/ w- A" o/ _1 R% b6 I
/ E2 s- p" J; e
增加元素
# Z8 f0 ], B+ U% O3 ]8 A+ f7 \$ G
删除元素
6 M) `1 E' W; h4 c' W
0 {% X$ e3 \; a! s Z8 U) _4 x销毁列表
. J8 g; m9 K( @& v0 [; H$ c; l& B. i- m7 Q* r: N
链式表示方法
" v! ^% N( F" @+ V+ ^( ^7 v8 G4 \- }4 w4 T
结构体定义
6 R1 y# g, |6 q5 l: A! R% m8 j; {5 m( p5 n7 V, X# x# Y, b
初始化2 X7 \. j; c' |6 Y: `
% Z: e" |$ O$ m$ [- f7 Y7 B. O
增加节点/ z3 V( a0 J( c& c3 c' h& K
( Q; ]1 n8 ?& ]. A P+ R删除节点
+ [5 ]# e1 G: c4 t& M" T% u z; r0 d; S" B3 `4 m& a
显示链表- u9 K* Z7 o1 {
" O0 m9 w' B# K$ X' Y( g5 |
销毁链表
5 h& K+ S3 r; ?" H9 j5 C" o$ G; ^ Q7 K' n! f2 D8 C
顺序表示和链式表示的区别:7 ` ?# V- _8 j
- |: A8 Q2 s) e- P! H1 w, [5 M创建方式:
, r H4 t4 [$ }8 \& L
9 j, }: x6 Q, W% V P3 j7 I- [顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
4 b. z8 f; s& `1 m- R, L2 c! I# _/ E8 Z$ u5 d
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)* v5 y1 W0 _- ?4 Y
' l5 L& n, ?+ E
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
4 i! h3 S8 J$ B% r p5 O$ e' j- [, D# D, a3 s7 x
时间复杂度:
" y P5 H4 b# Y; {; v
( ^8 S0 F5 k! b' L0 V; d增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)" o7 I2 x( V# C
1 }2 Z6 l! o5 F增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
6 \8 Y# m! q4 q# l/ e; t& M1 L7 ~+ Z& r
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
. X: Y7 P( q0 F7 K3 Q
7 G0 O. |+ v" p2 j1 C, ^# a$ q% K修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
+ _8 P' F, ]6 ~
- y) T( i! \8 M) Y. L查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);, R% b# M3 B. @" {. X% `4 y
) W6 m/ @3 ]8 C" C- m顺序表示和链式表示的相同点:
8 |- l) V& Q% \ G
: ]3 L. Z! w9 F% G删除内存空间:
% C5 y* g r, @& q* g1 K0 L" X6 X
$ S# N1 S! ?+ A0 l+ L* E内存空间的删除都需要对每一个存储单元单独释放空间。
& c$ D, l# r3 b& m7 C) T! k+ s/ U/ C4 |" K
代码实现:
4 o4 P$ k/ u) h2 u* P! `. Z, `- N' K% C6 \3 y0 ?
顺序表示方法:( u; H- h6 ?$ j# a
m; h; u3 V8 x2 v8 h2 e结构体定义3 {1 F# `1 s" |
" K9 \. q! ~5 h% m2 v
typedef struct {9 u3 u9 I$ T: S
ElemType * elem;
5 H) i' V: {7 g int length; // 线性表的现有长度 * x; V" V, ^* M w0 Y0 `
int listSize; // 线性表的最大长度
1 G8 R; t( k G, {2 J: [6 p}SqList;
! s$ s& e; P5 ~8 w' _' k5 j% `: z$ f7 ~( t: X9 }
初始化; _% Z( a+ _- Q( W( u3 y
8 j, ^) C, y. `& O& W9 ^4 F, y" c
void InitList(SqList *L){, ` `, i' K% a: Z: _5 `& ?/ x
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
6 ~0 z( c8 k" { if(!L->elem) {
* Y0 |* v8 d% y V/ I$ C cout<<"申请空间失败!\n";
}) {$ U& V% S7 L/ X& ~ DestoryList(L);
/ m- \' X+ M, n. n7 |4 L }
; ^3 y* @$ b6 H* H# Q6 P8 h; C% C L->length = 0;/ X1 R: h' Z) _* F2 b5 m& _& f! S
L->listSize = LIST_INIT_SIZE;
/ C1 u- \" i9 t cout<<"线性表初始化完成!\n";
9 y: q" w9 L0 T* ~$ F9 v}
( i' P, H/ e0 _* S+ B4 ~) n0 ~2 P- P R% l" ~7 p( S2 c# y, P$ [
增加元素
$ J- Q$ ]/ }/ |: p* _1 C0 p6 d( G6 Z/ l5 f \2 L6 A( a
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素+ I, @, f2 j6 M, t# `' T! T3 f
if(L->length>=L->listSize){$ m, O( w6 O! S- P2 B! _: S
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
' {: b* F5 y- o( b/ r! [# Q+ ? if(!L->elem){: M8 j1 d) e4 V6 \6 |0 D% R: L; q/ P" |
cout<<"增加空间失败!"<<endl;9 l+ y# }, K/ X4 |2 L
DestoryList(L);; M- ^3 M4 P( d4 D
}# j# c- x$ p, P& U! Y4 q2 u8 y
}
^$ O+ _& t0 F( M" m* G& v3 H * (L->elem+L->length) = e;
5 Q4 i+ O/ M0 w# v j3 ] L->length ++;
8 Q. e" J! u' e( J}' c$ t& Z G. N6 `0 q4 S ?
) J) ~& _8 |" H. Q
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
I M( {' p/ ^2 r$ ]: l int i;9 N. x- v- F: L r
L->length++;
) z7 ?# j1 r9 o. i) N. q for(i=L->length;i>=e_where;i--){
8 k% o$ Q3 e$ ?! P& W if(L->length>L->listSize){6 Z: O6 k% Z0 I# F5 D
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
+ E# a2 M% Q4 k$ Z7 h* {" X if(!L->elem){
, S3 x) [7 X3 l, d. u cout<<"增加空间失败!"<<endl;
6 L0 Z- C3 r2 E+ I5 x4 T- m DestoryList(L);
n% b% c$ G9 c, Q, m }+ h$ \" R6 c/ A
}
5 {3 b- x: R+ S- l *(L->elem+i+1) = *(L->elem+i);
( c4 C. d- R) \$ l$ f$ ? }
2 a2 a; {" i6 H1 Q- o( h *(L->elem+e_where)=e;8 z& x! e, W4 X: K
cout<<"增加后的线性表如下:"<<endl; ' o3 a0 c* {! g' X% T, R
ListShow(L);4 l8 X2 p. R' C- H* j
} & [7 m/ m$ D' B: J. v
( G% B; Y- d8 n* g: v) pvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素2 J$ ^& Q8 b4 b. Y' m% Q, I
int i;7 ]0 p# D. \1 t, k1 `
L->length++;
# b2 f" ]2 w; g9 C4 I+ n: x for(i=L->length;i>e_where;i--){$ H* b3 V+ Y$ [3 T# @
if(L->length>L->listSize){* c/ T$ ?) N1 W, |4 v" k
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
* j4 l! x- j( r- A! g if(!L->elem){: q5 F3 Z5 C5 Y: \
cout<<"增加空间失败!"<<endl;+ ^8 |8 x% k4 l) L$ h' i; \% D
DestoryList(L);
2 b8 r! b1 X1 n: w, L$ P/ r }
+ s1 f% H% G* z; @+ K- Q }% b& O; x; ?# g8 a
*(L->elem+i+1) = *(L->elem+i); 7 ~: I9 D5 N0 P9 k+ \5 @4 g
}0 z7 g* c; d, o, z% I/ N
*(L->elem+e_where+1)=e;
7 P' P3 J/ i8 G T4 m cout<<"增加后的线性表如下:"<<endl; . k' o: E' x5 R y. c' c" M
ListShow(L);5 A' W- i( o+ E: O9 x3 ]7 e- G
}: T: M/ o% j2 k6 |; X. c! @7 B
- N% v* i3 ~1 \$ p5 W8 _删除元素
4 @: y6 b m! l4 L9 G7 }
- M$ W% ^; D+ Z0 o$ Z" ?void ListDelete(SqList *L, int e_where){ //删除某位置元素
d2 N1 p+ H" X/ z7 f L->length--;
+ K, h3 R" ^" K1 n8 Y/ b for(int i=e_where;i<=L->length;i++){
! B2 r# j1 F l& q *(L->elem+i-1)=*(L->elem+i);* K0 b4 O( f0 g4 A
}1 s5 [( c1 `. F" h
cout<<"删除后的线性表如下:"<<endl;
4 O( y: y' T! H/ |2 C4 o2 V j8 J ListShow(L);
; D* i/ _; ?* `7 y% u. w}
5 P- U# v3 K/ u
# t. Y! {% ]1 C销毁列表
: E( `& r+ }+ d+ r2 P3 g# ?5 m( T' N+ ~- |
void DestoryList(SqList *L){
) D, [; Q: N. ~2 U int i=0;
2 f X- m5 l9 O; ]8 P; z for(i=0;i<L->listSize;i++){8 B; u/ O- r* {* o7 h# @; E" m
free(L->elem);1 m) b* q' S3 A# N% z) L7 D% O
L->elem++;/ S) b b0 |4 p) Q- v( a
}
% z7 k6 S- e1 i' m. l exit(0);
% _% r/ I. E6 g}" }1 y& V, g4 ?# x
/ `: D" Q* n1 O' S: B3 ~
链式表示方法0 u8 O% j( @" J5 x* A
. J9 \" ^' V' S) ~ f# n9 }% N结构体定义
1 [4 q3 i! ?5 T7 [- h' W
+ I* b2 M8 w" }5 Y/ o5 s8 htypedef struct L_Node{5 p* A7 ?( S/ g) \2 f
ElemType data;
. `: n4 [+ u( |; i/ I struct L_Node *next;
; O' A; o+ a* c" ` //struct L_Node *last; //增加可变成双向节点 1 G( l" ^: @, v+ C
}LNode;+ P0 B- ?$ \) s
+ W Q5 Y) G; l6 _- E$ @
初始化5 R3 K7 M* ~ o D
; B' J5 d. z' g$ t; g
void LinearNode::InitLNode(){
) p$ k+ }0 n- ~, e' U HeadList = (LNode *)malloc(sizeof(LNode));; V2 h6 f. q( {0 v# `3 H+ A/ g
if(!HeadList){& z) J+ k+ F2 `( W0 w9 Z9 r' \
cout << "初始化链表失败!" << endl;
, M3 `8 f! _ Q6 w# V' N exit(0);
6 C) O4 X+ J* \3 Y( C } # k2 N2 v4 F, f& n1 I" O- M* ~
EndList=HeadList;
% F6 P7 r0 ]9 i. B9 P! z) e HeadList->next = NULL;7 m/ @/ F: r/ B: T9 ]* b6 d
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
4 S/ O) W x# F7 B& V Length = 0;
$ {0 @8 f( b$ O. D3 E$ D e_where= 0;% J" ~& K1 g1 x0 z! ^0 [
}
( H% V& j) d; J
& i- n, v2 \; b3 y9 V增加节点; o/ V8 K) O6 x i( W6 W5 T/ [
+ f l& V3 T4 t( Cvoid LinearNode::AddNodeHead(ElemType num){ //头插法 U0 I' M, n9 \+ }6 U+ j" p: q, W
node = (LNode *)malloc(sizeof(LNode));* G% I) K$ V, E4 y) ?0 n C
if(!node){1 ]' z$ m; G& `5 v3 Q7 e- T
cout << "新建节点失败!" << endl; & [ @4 A( ^' Z, E, K
return; % X& J7 W* @7 \* G2 i- c) W% z' }' K
} 3 g8 ?0 v/ a( \% u8 f" i( l: v! z: |
node->data = num;
. N- A, J; p0 \! D cout << node->data <<" ";
: z( A D0 W( r if(NULL==HeadList->next){4 `0 Y: k6 L# S7 u
node->next = NULL;
" z9 j. W* N" D/ Z1 t HeadList->next = node;
; f* k7 k6 t6 j" k EndList=node;
, m0 C# W( x) I; z2 S. |2 I }
- Y% {; P) T0 z3 S# F else{5 B. h6 e0 @: M, f; V& f5 S# m( I0 T8 ~
node->next = HeadList->next;
4 w9 g6 U% q) U. b) i j. o HeadList->next=node;6 D+ C2 Q- F% _* h2 R
}
! u% j. i. C! T, b! K0 }2 F2 c& U Length++; 6 A0 q0 o& d- ?8 R) a8 |8 M
}
% }6 v1 a/ P3 R" @/ a/ D( t
9 I5 T' ~3 A$ k: V) \ xvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法
$ g/ I- N2 U4 |9 S( L3 X3 }3 m: Q3 ^ node = (LNode *)malloc(sizeof(LNode));
* {3 X5 C0 M1 K# d' ~( M if(!node){' E3 [# A" v+ p6 z+ R! A
cout << "新建节点失败!" << endl;
$ L) b- g) B: b9 @ return;
& o9 D# S5 q" I+ k9 a0 V) ?0 z } - B) c8 X" ^5 f
node->data = num;
5 B8 w% L3 f; h5 d: q% q cout << node->data <<" ";
. P4 R1 \7 E% i4 A2 G node->next = NULL;/ {+ f1 R5 x- G$ Q& J
EndList->next = node;
9 G1 L8 A% z1 R" F0 n3 @ EndList = node;
, z6 o+ ^. A- ^1 q& o Length++; # G4 L' M/ |; p: L
}
+ b: ~0 {3 i% ~6 |! }0 m S2 H Q! y3 x& Y' j" I
删除节点
' h( [4 l7 T* g% [, Y% ?2 }
3 e. ]( A6 F( f: Dvoid LinearNode: eleteNode(ElemType elem){
* h) Z% N$ O% M% N# d if(NULL==(HeadList->next)){4 {' N5 |6 n& R6 _5 `" V* y
cout<< "无节点"<<endl;! ]1 B' y) q G S+ z
return; 1 ?/ q. j7 T* ^6 a7 z7 a' y
}. `) Q% e( \( f, @8 l$ m4 V2 k c3 K
Node_cur = HeadList;* q) b& f+ r7 R3 F( F9 E7 u
while(NULL!=Node_cur->next){
8 ~& [7 B8 I. {( H n) n _, U: y Node_temp = Node_cur->next;
7 g5 k2 r: j7 h$ I* h if(elem == Node_temp->data){
9 n" T& |. G, [ Node_cur->next=Node_temp->next;/ u/ }5 p, \' |) r- s1 q$ _0 W
free(Node_temp);
1 p) q$ p- M; p4 a }6 v/ t0 E- ]+ \6 B- ~8 A
if(NULL!=Node_cur->next)6 a' b: m/ T; B9 f
Node_cur=Node_cur->next;& V+ i% @0 v7 q4 v, \4 x
}; l2 f! Y! W& I/ N- {
cout<< elem <<" 元素已删除!"<<endl;
, \% |6 x5 @- \& E) I5 f} * t7 i% r' r/ c$ r) i& E, q$ t& E0 g
" n# A7 P W- x- I' V9 {$ h4 v! P显示链表) f) |# A& }8 p+ J
+ U: [ D% y" T8 D# l4 f) S. w
void LinearNode::ShowLNode(){, T% y6 d( j5 E# P* h/ d% @; t/ x, F
if(NULL==(HeadList->next)){; i; g3 {% ?- ~
cout<< "无节点"<<endl;
+ |: D$ n! l# N$ Q9 K3 r3 T" q return;
$ J/ s, I* ?; L" e% ~4 ^; O }8 Q" e2 Q5 o+ t1 n6 c
Node_cur = HeadList->next;
9 E. ^7 t3 ]+ r' m3 Q/ h8 ?3 Q while(NULL!=(Node_cur->next)){
8 h9 _: `' i$ L0 S* p; x2 ` cout<< Node_cur->data << " ";! X+ _. ^! g+ n
Node_cur = Node_cur->next;
) p0 v9 x1 J" v2 L! Y }
# j/ a; ^3 u9 p9 J- f' Z6 w cout<< Node_cur->data << " ";
$ W) F9 ]- C, T cout<<"链表中的数据已显示!!"<<endl;
9 o/ Y- r- f; M% u( C0 A! A}! C6 Q- b& A0 }$ {9 I: E- @
7 h/ Z8 g! |+ p0 H6 X) A0 b
销毁链表
, K. `9 [( p! M# p R# _% t/ U8 J( ^0 E9 T& l2 L# q1 F2 D
void LinearNode: estoryLNode(){' L8 Q# J- Y& d1 E' W. t
Node_cur = HeadList->next; 3 l% n1 \7 a8 V3 C
while(NULL!=(Node_cur->next)){* Y7 v! Z6 |# C" B b+ N
Node_temp = Node_cur->next;
& r4 y7 z& v/ F; [2 k. e free(Node_cur);+ B( e5 y- c2 I4 b% v" q' m
Node_cur = Node_temp;. M0 F' [! _( d5 w+ l. {
}
0 Y* @/ L2 q# a; x free(Node_temp);
T) W5 N* D5 A cout << "数据节点已完全释放!"<<endl;
+ {6 L. Z+ L K I free(HeadList); // 释放头节点
9 A ]! H2 X0 z; V cout << "头节点已释放!"<<endl; 6 S( `4 u0 x" r8 R; H! q1 Z! `' U" m
————————————————
( {, x/ H9 W; X2 ?& `7 N版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# G6 I2 e$ t6 E原文链接:https://blog.csdn.net/Baimax1/article/details/1060362865 n( S E2 ]8 ?3 Y( X6 G6 d/ P
1 V0 B5 V L% \8 E0 j
2 t# }3 d7 s+ r8 w& [' c9 z
|
zan
|