- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563415 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174247
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
X% S/ \9 m( A( ]5 y7 w# g线性表顺序表示、链式表示实现方法及其异同点
+ K4 i( ?) f3 O; e7 S) r. S线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
/ k3 U1 F3 w0 ]' q; `! ^1 m6 ?8 d
' y% h" t b5 _% w3 P* |! Y* P本文采用C++实现两种表示方法。
2 Y4 z* P { ?. E9 Q4 u
4 y: }1 B' g2 K' J) d' x! e7 |! s目录
7 m$ G0 J0 o4 T: `+ l+ g5 N y. _6 X# N. b& M
顺序表示和链式表示的区别:
! U# ?* S" A5 J5 b9 u1 P8 r, P- ^4 o! ] f6 U
创建方式:
) a$ k( L1 [% s+ t" L O
1 w5 B0 y0 P \& i) m: |7 v' \时间复杂度:
9 B1 m7 F% \6 ?# F) x" S* V, M
3 ]1 J; a8 p+ T顺序表示和链式表示的相同点:
+ K" h7 L6 P' p, o6 y! v; K j `* x- q2 C
删除内存空间:
% c% g8 B: l+ L, V9 c6 U! N4 i/ p, Y5 E( K0 x
代码实现:- l5 ]' V0 o- [8 L: ]* I1 M
7 S( T: S7 {6 `9 w
顺序表示方法:
# \9 ~2 H' `2 j2 d! s. [6 c5 t/ ~ p$ k
结构体定义
" M' W$ a; J; [) M
7 s9 ~4 V; t: w6 d5 X ]初始化
- X) O- Q% ^# r' s+ I: i2 X0 `, N) V- Q: G* H3 L
增加元素- D6 M# B# D$ l. q6 L% L- e
7 x/ `. `8 m8 w
删除元素
: Y! Q9 f4 l, h4 A# Q+ V8 k; {% S9 I" x5 V
销毁列表) E8 X& P- l F {; u" R
3 ^) c$ D, w# _$ b( g
链式表示方法
4 a, ?1 m( Z4 V* i' Z7 I! g: _0 }3 M& K8 ] B6 p
结构体定义
) E3 W& f5 E$ x' a
3 d3 k! A& ?9 \3 k+ ?' r1 s2 ~9 {- V初始化9 }' F$ {) w8 W8 `1 a0 ~! _
* X7 x' `, G2 ~0 f- i) E1 t7 y3 a增加节点0 y* a9 v& V! h4 m- i
. ~% t4 Q1 p& J: ?. n* x, [; c删除节点
( n0 d7 h" q' T g4 i& R% c3 y& l; q( h/ _. F( M+ \
显示链表$ D- p/ t$ C! D3 u, T5 I w
" R' t( z/ y5 e' D+ U+ ^+ e
销毁链表
1 Y3 b j1 P2 Z) [& z) ~$ t6 y( e6 I+ f' z( ~
顺序表示和链式表示的区别:
* B: N v' u0 w& ~" ~- u/ n- I! e3 o1 p0 A+ c
创建方式:* R, _2 R$ |* v
@2 R7 ^" a- r. Q* H顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
; T/ L: c h' A& ^* i4 w' O
. A& r3 ]2 O" F% n; u(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
+ R" d G0 ^* K% g! v' ]+ K9 N1 D8 f0 T2 O+ R) [* K9 f
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
( a0 g- P- y4 D( G, X, k0 i, {5 C1 n& j& K& M1 g6 q5 F# ^" V* T; S
时间复杂度:
4 Y) p1 F$ V6 p7 i1 _, Y& X
% a6 a/ Q& }0 s+ e# z/ m3 z0 u增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
+ M' t9 m& |- I- P+ B: D1 m8 P$ l6 i; P) ]' [
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
' H6 m2 E8 C% R& B! f; H9 I- O" K% c0 ^3 }1 K+ s' G# E$ [3 B
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
" O$ D3 Z+ F8 g& y: V y5 ]1 e W# b3 ~) g2 K
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);" ?2 n/ c) J( a& N
* n& x- v' q7 |1 S% r- n( |; z查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
4 j# [5 |* V! b( L( a3 Y, g# s+ ]8 X- k& p
顺序表示和链式表示的相同点:
/ S% ~! N/ Z( I
; S8 p/ n! ^) h# M ?/ e8 O7 M删除内存空间:' `# @7 u) Y6 E1 V
; @: K$ Q6 t2 l内存空间的删除都需要对每一个存储单元单独释放空间。* M" y; p0 a% ^
6 e- E4 f; N) A o. |% _* e2 V
代码实现:
) d5 z, g' |7 w9 `+ u: D% B2 I( W1 T4 E- s3 M( R1 q
顺序表示方法:
0 M; C; ?7 X& {$ m7 }
$ b4 g4 ]9 j; D; L+ `/ E! P" z- h结构体定义; I* Q ?7 e7 W2 S, ]" k( K( G. c
$ @% l) @$ W" ~6 d+ Ytypedef struct {$ p3 K1 R: v0 W& C7 z
ElemType * elem;5 }, v4 n5 R- Y0 ^6 ?- E% r
int length; // 线性表的现有长度
/ {) i- V# G: B5 h int listSize; // 线性表的最大长度% ]' V! l4 v( O8 V# \' }
}SqList;4 D1 }7 J1 K- X6 H1 ?6 c4 ~7 ~' T
9 A4 ~' }1 f+ f% ^) i初始化
" }0 Z( i5 b, r; S! ?' z% h; X' Y" x, E4 z4 W
void InitList(SqList *L){
' k; a- s1 Q) Z$ I L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;1 c$ j) c* X" Q+ [. [, f
if(!L->elem) {
( P4 ^, T* u8 v2 y& P! \4 l2 ]7 X cout<<"申请空间失败!\n";
: O7 S+ C5 \+ S% k l DestoryList(L);
: h) F# N9 q8 ]5 w8 i- e }8 E7 E& ^2 D/ _
L->length = 0;
" x3 ^# |0 r7 F" y# E L->listSize = LIST_INIT_SIZE;
% G" ^1 m# z& f& W1 v( F2 g9 J# K cout<<"线性表初始化完成!\n";# B& x5 K$ a- H# ^* h9 c
}
( c9 M$ S1 I3 d0 u/ z- Y
. A: ]; b. S0 j+ j4 M增加元素1 m. D" d$ ?" `* K8 G; ^, h$ z
4 e* t) ~- P$ Q6 c' M2 s2 Y, W8 A
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素0 y/ v+ A) p- b( a% V
if(L->length>=L->listSize){- ?% i1 y- t+ Z
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
+ ^! G" U1 H6 Z+ |9 A/ v if(!L->elem){& J9 o. F r4 \: c/ u" |% n
cout<<"增加空间失败!"<<endl;9 Z2 ~, L7 c7 j6 Z. ?( Y
DestoryList(L);9 ]( d1 V5 W# G" x- O+ Y
}5 V: v& s1 t8 t1 {
}0 F/ X: ^ [% ^' u _7 I
* (L->elem+L->length) = e;
- l$ P$ _0 h! |% @" S' f9 \ L->length ++; 2 @$ B3 u1 L5 g
}/ N( Q' F) L; `
, d6 v. ~$ s& d: G
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素6 C2 D+ x' o \$ C' g" a( _& g
int i;
4 {0 _7 S' v6 @2 V! s L->length++;
. Q' Q: T+ @9 J for(i=L->length;i>=e_where;i--){
4 A& r( F# x# U$ L* n+ u: A if(L->length>L->listSize){
# k" X5 P: x& B# k, M L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));( ]2 B- B7 D$ f) o, b+ t9 ?
if(!L->elem){ p3 ^+ o3 N) G: c
cout<<"增加空间失败!"<<endl;
) X( S$ A! }& c" I; y% _ DestoryList(L);
! k" a3 S7 v7 E6 Q) }4 D }
1 }" ]& t: N+ G2 F( y, U& g }
& o& P( s# Y6 |9 i/ F *(L->elem+i+1) = *(L->elem+i);
2 m: |/ a/ y5 x. s- ]$ H }
7 c1 g2 n! Y' f0 n3 a *(L->elem+e_where)=e;
: `- Z5 X' K! D! e$ j7 S1 A cout<<"增加后的线性表如下:"<<endl;
$ s, V% w; H4 i& U6 M7 U ListShow(L);. F- Q" r! L' e' M) X9 x" p+ S. W
} 2 n6 t9 X7 |2 M4 j
- |6 B) k; Z# E: P; ?! Y/ Y
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
\7 Y3 ?+ q2 C+ P$ J* E; [7 m int i;
8 n6 I- s, D) ?8 ]2 R- X3 f* \3 z L->length++;) c. U* [ G2 M) M# t- g7 f) z
for(i=L->length;i>e_where;i--){4 R2 } v; O. f# p2 J
if(L->length>L->listSize){- T4 d7 x3 {* x5 }9 o( a9 f1 h
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
4 }/ O5 r0 L2 _# U& B6 K% h. { if(!L->elem){
" H' }; W. E% W. H( [9 E% f cout<<"增加空间失败!"<<endl;
& f1 ~ @: e. Z5 y6 N. k DestoryList(L); + m5 \7 e6 }; B6 f# v' A) _
}
" g1 L H0 i5 @! }* g8 S }
+ N$ Q! @$ i/ f( {# O% M; K/ I *(L->elem+i+1) = *(L->elem+i);
3 b& G! @" @- K2 T* T }
3 d; h/ K4 y- z/ R- i p *(L->elem+e_where+1)=e;7 J0 d& U8 o5 ?/ x( k: l1 ]& h$ T
cout<<"增加后的线性表如下:"<<endl;
1 Z. j( W/ z! f& i' F# S ListShow(L);/ b" W# o. n! X: E- K
}% ?) \1 I7 y/ W8 J, S' y1 T% [
: f3 b. k4 W6 A# i; I" D. } x7 U删除元素" h" ^' e, b, I0 X" y
# j$ L4 J2 y: A" `/ o
void ListDelete(SqList *L, int e_where){ //删除某位置元素
% M% ?, P9 M6 K L->length--;
9 Y& I4 t3 h" t* b; R: ]/ r2 D for(int i=e_where;i<=L->length;i++){
4 u5 D& h% q9 Y/ \: B) h* a *(L->elem+i-1)=*(L->elem+i);) \' J) z2 r- d+ Q3 H4 i0 {+ a
}) {; v$ n( N8 d6 s
cout<<"删除后的线性表如下:"<<endl;
5 p# i }6 j5 C) M7 v; l, r" h7 d+ h ListShow(L);
- [: ]0 a( ]3 ^% z4 m}
1 f4 B9 f+ a& K9 L
2 d: A: v' T6 J+ m7 U; z4 m销毁列表; G3 i7 E2 Q, e1 Q# M4 p q
% M ~# e: H' e0 j* f2 b8 W+ Zvoid DestoryList(SqList *L){# ]: M8 x. Y0 Y) _- S) N
int i=0;5 G* D+ T5 D Y$ Y
for(i=0;i<L->listSize;i++){4 {/ ?- v3 l" k% v* C" F
free(L->elem);+ P4 N# A8 Y$ [) z& _: F* c5 `* s
L->elem++;
9 E! T! t3 M0 T0 S% [( c$ q }3 F0 R& o" ]7 Y: H+ }9 T
exit(0); ' G* U6 [, E, x! g: t
}
# D( T( B# A% ~/ }8 |# U: G& _7 p5 N; s
链式表示方法
% n* {' \$ e2 d; b3 @: W( K* j+ k* P7 S! s# j2 H+ n! I4 W8 ^
结构体定义
8 ]: P- ~5 l2 l$ \6 F3 b7 D, x/ a0 \- [6 {# n# K
typedef struct L_Node{
; f+ R3 k3 Y$ J4 |, Z* `! { ElemType data;% K L, I) h! h! e
struct L_Node *next;( c2 s6 ]( H1 M: _% r3 o0 C
//struct L_Node *last; //增加可变成双向节点 $ h |3 H( E! U) ^5 k1 C
}LNode;* I$ Z9 \( D) ]4 Y
; P. l: ^5 |0 [' K% v2 t初始化$ T2 T3 j5 A1 s8 {+ O3 \4 h
( b p) `7 `9 g% Y1 g1 a$ Uvoid LinearNode::InitLNode(){& ]. z a) Z) W! ~4 f( n5 r
HeadList = (LNode *)malloc(sizeof(LNode));- r, @8 Q7 u# a+ |
if(!HeadList){1 t% \3 B5 r# H) O% ?0 P! J
cout << "初始化链表失败!" << endl;
5 ?- V5 b" D- j0 P: A+ I! y6 B exit(0); & o3 i8 H' \% H1 q, @
} ' o) e- e) f0 S+ [2 c8 o
EndList=HeadList;& E& e) Z y5 I6 B. }9 e# I8 j* A3 }
HeadList->next = NULL;$ W* y* i4 C3 \8 u4 C# u( q) C
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;6 `9 w1 o5 c( V) J1 A" N9 p0 i7 M
Length = 0;
, K# v/ x: w& O4 }4 I1 u/ e9 ] e_where= 0;
p1 t- R- F$ G0 `9 o5 x+ P5 n}7 Z' t" b3 G9 P6 z+ ^$ U# F
5 r) W ~1 k- R# y' ?- E增加节点6 a. q. a Z* M9 {/ N6 G; G
y3 o9 x' r6 B3 I4 fvoid LinearNode::AddNodeHead(ElemType num){ //头插法 - K/ m0 t. K. _. z
node = (LNode *)malloc(sizeof(LNode));
3 O+ F, n/ l6 I! R if(!node){
2 N; S6 }6 m- q/ ^% s$ W( @5 O cout << "新建节点失败!" << endl; w; _, T6 a! b' ^) D+ m
return; 1 m! d$ j G( r5 k- f
} 9 e* ^5 X9 y0 G, p7 M+ \
node->data = num;6 f% F& |' h# }6 P
cout << node->data <<" ";
% i; O: K- G* D if(NULL==HeadList->next){& y. u# S, c! t- T6 h/ k& y
node->next = NULL;
" }! c+ | D v& L+ S$ A- \ HeadList->next = node;" ~1 f: _% w/ K- G$ S. \: |
EndList=node;) K% C/ U4 ], s6 o/ Y+ Z1 I- ?2 O
}
. A1 k; c2 h: H1 D! ~0 u2 j else{* c# r1 ~# B0 |6 v7 C* C D1 t
node->next = HeadList->next;/ W5 n2 a3 `+ Q' G/ w0 r8 p: s
HeadList->next=node;
/ E" l4 E) l9 |; `5 W( C }1 Q4 D' @6 ]8 w: x
Length++;
1 m& d9 K, P" M& |/ g: J W}$ K, v* p+ N, m7 W( [6 `: @
2 O: J' J& T" N/ N" L% N
void LinearNode::AddNodeEnd(ElemType num){ //尾插法 " z0 { M0 [( e1 r" X
node = (LNode *)malloc(sizeof(LNode));+ [, Y; k/ {3 n9 v' |) J) }- v
if(!node){0 q) W5 Q" m( A. l
cout << "新建节点失败!" << endl;
$ e1 Q5 E3 T2 J C. f- \ return; ; ]% e) ^. E5 W- z% {. g2 A8 Y
}
' {7 E y& _4 y4 e* X node->data = num;' x: {3 w3 |. b5 }/ r' f; l
cout << node->data <<" ";5 Z! N) i8 @$ n o v5 a2 s+ D* z$ y9 I
node->next = NULL;
& p( }; ?- X! S U3 `" K EndList->next = node;
9 }" Z! H3 B' U7 F EndList = node;
' p: z& c K) h9 B' k Length++; 8 H' [ ?3 b. Q/ k' u- \1 X+ u) e
}! L/ U" k. o: k. R h# X
% e/ M4 G/ Q. P. u/ G0 k
删除节点- w* ^ m5 {% u0 x5 U& |) H
, N6 ?$ E3 R) M1 m J
void LinearNode: eleteNode(ElemType elem){
" z/ l8 r* T/ N/ _1 G7 b" y$ y if(NULL==(HeadList->next)){
' z8 ]8 H' J" t; @4 m; }/ ]: L$ b cout<< "无节点"<<endl; q' X8 w/ B5 q! e: @
return;
' I* q* V- M9 }3 {: }7 \ }
' _( y, L; p& x+ A Node_cur = HeadList;
- {+ L1 t7 ^% f5 I/ j! f while(NULL!=Node_cur->next){* C' Z; t/ M3 F1 i! c5 H; J
Node_temp = Node_cur->next;
" ?- r; G8 x* Q' I if(elem == Node_temp->data){6 b x! |* P% N1 q; R
Node_cur->next=Node_temp->next;
0 i( f1 {8 e D1 z free(Node_temp);, y) H E5 ]" t3 l, P
}
0 G4 e5 c6 u6 X5 g. X9 L if(NULL!=Node_cur->next)
9 g6 F, O& v+ i- Y0 U2 V; q Node_cur=Node_cur->next;
# U2 @& N$ Y t+ j( d, ~ }* `, B5 N; H9 D! s& ~& h
cout<< elem <<" 元素已删除!"<<endl;
' W4 @! T; Z" U; n3 M, S, |} + N2 r O6 d, b) Z4 X* _
" I9 p7 L1 z- o: Z3 |
显示链表
$ |7 n8 ?* b3 A) m6 l+ g b8 q4 g/ J% Q/ m- L
void LinearNode::ShowLNode(){; Y5 D% a! z2 _4 `4 ?/ O) E
if(NULL==(HeadList->next)){
6 ]4 f! B& U: O$ v cout<< "无节点"<<endl;
4 h& d' y% [8 ^0 y8 P return; , R4 Q! R* T1 I) O2 i
}
, I' U* M& M, _- Y& ^5 {' G Node_cur = HeadList->next; ) x7 ?" F; {0 K% t# ?) j# b( H. e1 s
while(NULL!=(Node_cur->next)){
& }* G; S* F* f7 Y: [4 @ cout<< Node_cur->data << " ";
7 m: i' m6 |$ G4 t2 { Node_cur = Node_cur->next;( Y: t+ N6 ?: e: U0 L* M% r0 C5 E
}
4 n" N6 c8 L. x3 y* t) V F cout<< Node_cur->data << " ";. Y& W9 ?/ W( |- a8 X( ?; g
cout<<"链表中的数据已显示!!"<<endl;
9 C5 p7 A# g; t}
3 c/ D5 z! d, H/ I; {& X* z9 ?+ N0 E
& }7 r* Q9 o$ A7 s8 e& G% p4 p4 C销毁链表
m3 [+ `$ a0 H5 n1 O. t; d4 E1 F, j& m+ p- ~6 n4 x
void LinearNode: estoryLNode(){3 e. a) H* M' B' ^' H0 @
Node_cur = HeadList->next; : Z, f, O9 v6 s# l
while(NULL!=(Node_cur->next)){
" H, b( Q$ n, [; l4 R2 v5 r Node_temp = Node_cur->next;
. O: ~+ k7 n6 M% F8 I; b& w _. A- [ free(Node_cur);, p- ~5 \9 n# v5 y( o1 _# Y
Node_cur = Node_temp;6 R. H' c' P' G2 C; o" C' }
}3 {: x1 a% H; n" [* ^, S
free(Node_temp);7 h3 X* V- e* M* c" f& l0 {# l
cout << "数据节点已完全释放!"<<endl; ; i1 Q% l! J- J( v7 k# j' u
free(HeadList); // 释放头节点 $ d& u- Q' {1 ~& D W+ Z+ C' [
cout << "头节点已释放!"<<endl; * P3 ^& w5 M3 F5 e0 F) p
————————————————; { [' d. y& V" [% d
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% t2 U L0 Y+ d2 H原文链接:https://blog.csdn.net/Baimax1/article/details/106036286* j& F7 n8 w) ~8 A X6 |8 z d" L f
: W: L) R* N9 G6 t
& c' m! N! j& `5 R
|
zan
|