- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565543 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174886
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
0 r% a" y5 H, w( u" L7 Y
线性表顺序表示、链式表示实现方法及其异同点2 I: w$ B2 \* r' e
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
, t' }, w/ s) f$ A( X* T$ s. y* ]7 d: `: V6 Q& @
本文采用C++实现两种表示方法。
, z5 A& c, ^( Q# \
* D, Y$ m7 H5 F目录
9 _9 O8 F; d3 w1 _" N" C, p- O9 a4 _# r1 o' ]
顺序表示和链式表示的区别:
$ j. C# R% f# m* c# l
" c/ a% \! p! M创建方式:
" p M! B t/ F' E8 R9 r& H. _5 a4 R% a7 ?2 `
时间复杂度:% h$ }, [2 F7 N7 v k3 V4 n9 S' |
# H# V* P5 h p: j
顺序表示和链式表示的相同点: R4 i0 d6 q: p1 P0 o! ]7 t
* z$ m/ G% U9 Z& Y, Q. d
删除内存空间:$ k* s6 H. K: P5 [( k& {
) p! L b$ g8 h- D3 z3 G0 t2 ~2 p
代码实现:) n) T. C! w4 k1 p: a$ u
* X P% ?1 S* H& R1 t' q顺序表示方法:/ c. Y1 M7 O6 `4 R
~! I1 O _3 o% e
结构体定义
1 B# B3 x- }& r$ w9 N
# \0 N# V4 l$ ^9 Z初始化
, t4 y& x: U: q5 T) j2 N2 p2 C! H, b
增加元素
# S3 F% k, V N$ w
; u) G2 m1 b2 E' H3 D$ K6 |( p9 d: g e( I删除元素
6 A( B% w- t& d' U6 p% w7 I! H. z( s6 @
销毁列表
# _6 G. n* b1 [' ]( o7 s# c2 ~& ]- W( l% r8 e7 M! O' k9 u% N5 ]0 m
链式表示方法. f. N/ |' {* k! x4 Y6 E' ?
4 b) N# m- Y5 B7 x
结构体定义3 c7 h0 p) }: I `+ m; p- J
- T; ~4 U \5 P8 e0 f/ v
初始化
; `5 o) T* O3 v2 w& p* W6 U6 Y" |( v1 z. N8 [$ M
增加节点
! u' ^3 B, x* H
! U p. W2 Y1 k, ^4 n& g删除节点0 j& b. N, m% p3 {( P7 }
) R6 D; B6 ^! f
显示链表( B( U i& c, [4 t( z
) h n" S& c4 [* z
销毁链表+ \* w) e( Z/ N+ o
8 r4 {0 N: H3 V K. C顺序表示和链式表示的区别:& Z8 E+ `& J/ z* n3 \5 }# S
. J) Y" M2 b8 o& }# T j L" C7 I创建方式:
1 O/ d9 s2 [. `/ H" c8 x4 G0 s( q+ R7 o* R1 j
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。: w' [2 W. I; ~* U2 L! `! w
3 G7 J! N; _; E6 F
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
) q+ u* O4 I& r6 i0 R
; W4 C& F8 ^( u3 |链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
$ {7 |' ]3 T& @; `9 N7 \, W" `7 ]/ ~+ T2 S! l. d
时间复杂度:
& g* @* y% ^8 z2 l" Q# @' I/ U% n1 e8 _# v% {: p) X9 a
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
( {# M9 b: z* X' G2 K
" L4 Y* L2 J& w/ d4 V增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)9 H/ D; M8 K4 o& m
4 x# v5 W2 A& v
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。3 o" R; n- N' c& |
a. j7 m$ x* \- @ p, P, X修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
' G' h" ?6 ^3 x8 W y' @# s. ?' a3 q. m
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);& |3 f$ H& K5 b& g0 J( g
, d1 d9 o) m2 ?, D) Q' n8 v9 Q顺序表示和链式表示的相同点:
7 a" U$ @* ~& o) E1 f$ W7 ~! X6 `! O8 |, A/ W- p
删除内存空间:
! [6 o h1 A U5 ]; u
3 y9 c' g# n; b' R% f, J( z内存空间的删除都需要对每一个存储单元单独释放空间。; Q( j( f- O" X
; A* g8 `& }" B6 K- L代码实现:0 e3 c/ m6 D6 o" h
' e' i0 H E- S' i6 w
顺序表示方法:
* G2 J& S" e- T8 F2 H% k5 F/ H6 Y& V- C/ F
结构体定义- o" C; ]4 {/ c
3 e7 V( u5 N' r; Wtypedef struct {
, F* `6 f: c8 t0 J ElemType * elem;
. @+ B; ^4 j {% [' n int length; // 线性表的现有长度
}; q. M( N+ V3 H: M int listSize; // 线性表的最大长度
* R9 b* A3 p" J# V- {}SqList;
% [+ g& [9 I0 I& h) O( W! |2 V3 z- H9 S0 [$ a
初始化4 J* Z7 t/ E9 X+ W& q" d* S
/ y! b$ W3 ^. [, Y2 w# F8 |void InitList(SqList *L){9 R0 ?# o$ p+ N- W0 v: w, V6 x; P
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
8 U1 I$ q# V5 `: f& f& P- ^0 d if(!L->elem) {- `& ^. r( e; ?9 v
cout<<"申请空间失败!\n";
- L* q( s& `8 t# H0 a DestoryList(L);: F5 l- j8 N0 W# K! f9 M9 P$ H! `3 l
}6 R: `8 o. r8 A0 f, d7 ?
L->length = 0;* k, b m; `+ R
L->listSize = LIST_INIT_SIZE;' @& j0 L" g1 a8 C
cout<<"线性表初始化完成!\n";2 l0 H1 Y1 `) A/ L8 F v6 {% t
}
9 p$ p8 S4 r+ o2 o; O# F5 `5 U* I) h1 z# D
增加元素' q& B" J! Z* x+ ]) V( z. R0 s
) K3 ]* n1 b; N8 C4 Q' t9 Evoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
8 X# }6 H& a& Z0 Z if(L->length>=L->listSize){* X2 B5 q4 s% l9 T
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
/ z# S9 `% r3 l: i* D/ G) p. g X if(!L->elem){0 r7 K7 Y) v1 f: _) K# C
cout<<"增加空间失败!"<<endl;( m4 x# `& }9 Q
DestoryList(L);1 b+ ^. z7 k, l8 Q
}
8 k$ y! A, r$ ~, h# u" e }$ |1 H3 k* y6 }2 w
* (L->elem+L->length) = e;+ v' i$ U7 g0 w. G" l
L->length ++; 9 l( s& U" Y% m* o1 G0 P
}( A* a$ k" b {& C& G
6 l3 r4 p7 H5 Q# s( c; l8 F5 f
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素 |/ E! \) m* Q6 E% S& L
int i;+ ~0 F- b8 Y' S, j4 F
L->length++;
; P% h! o! ~% [+ V1 b for(i=L->length;i>=e_where;i--){
3 E/ b4 M) `+ N* d if(L->length>L->listSize){( f( \* M+ U; D2 O3 z7 g9 z
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
& V. F; d$ c/ y# L0 _8 r if(!L->elem){
, q$ D3 W" ]2 X( i cout<<"增加空间失败!"<<endl;* f' G% B9 B- d9 x& W
DestoryList(L); # y9 T8 n- t( \% a5 a: l% I: M
}
+ \; C1 N' S" } }
% A0 J) I- W, z7 E1 i *(L->elem+i+1) = *(L->elem+i);
$ k! t- r! Q- z6 d0 |: F8 Q }- ^3 T$ Q- F) q) [: ?
*(L->elem+e_where)=e;
3 W' \# B, q. N% M, B, M cout<<"增加后的线性表如下:"<<endl; ) T1 A+ |+ E7 v# T
ListShow(L);: ^% w1 P) v* B
}
5 |) }$ ?5 e9 U. E; V+ N9 _% P1 H6 w+ d6 a0 t. ~: x, E
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
2 L* p/ H+ v4 A% y3 P int i;1 b$ O2 B3 u8 B. p$ n
L->length++;0 l6 h- ]0 r- q0 V2 e2 ~/ S) c
for(i=L->length;i>e_where;i--){
' D! h% E M5 z- O+ h if(L->length>L->listSize){1 M' R: u+ M4 ~. D
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));8 _4 W2 ^- s- O0 b) P
if(!L->elem){( e5 B) q+ E- J! i' `/ j( g" i+ ~
cout<<"增加空间失败!"<<endl;
9 Q+ b+ o# Q2 b' k* u8 c5 D DestoryList(L);
! E' ~2 R# X0 f; n2 q }5 n% c: M* A& R8 e# y% B7 ?1 p
}4 M, { ~, Y9 b$ h: s8 s0 R& |
*(L->elem+i+1) = *(L->elem+i); & U0 T3 h6 [- z% `( `1 J+ x
}
+ K$ s7 A% _- G+ p2 T# ]( D *(L->elem+e_where+1)=e;( r: `8 ~ x; i) E! O
cout<<"增加后的线性表如下:"<<endl;
+ _7 i/ o4 N& \. l' ~- m; @8 S# E ListShow(L);
0 L) Y6 H5 G6 G/ B$ W}
9 e6 I" ?! y5 j8 K9 c, O. W
" j" ~$ s' W+ @! h5 w3 O删除元素
! C3 k3 B& X8 d2 p! E( J/ m' g. ]+ G7 L
void ListDelete(SqList *L, int e_where){ //删除某位置元素
; e( q: J& M" M X, a, B% Y L->length--;) G* M: q f& q
for(int i=e_where;i<=L->length;i++){
8 ~) B# [4 \: L3 c+ h7 T *(L->elem+i-1)=*(L->elem+i);+ V# L$ J: ~" p8 j5 ~
}
9 {: m& ^3 c2 Q4 q/ X4 |' s cout<<"删除后的线性表如下:"<<endl;
8 [5 N' H8 e3 K% [ ListShow(L);
: Z: M) m& r) p}
q. T* J9 i" ~
6 ]7 K" b& d: e. a/ g销毁列表. N7 ~- E T( @; d; i
# ]: m( {, c1 B6 v. ^# Y
void DestoryList(SqList *L){' e7 n! y( ~# l* s6 @4 ?0 T
int i=0;
# W; |0 o! e! m) G for(i=0;i<L->listSize;i++){ n$ F% n6 G# b" }4 ?! }+ [- f
free(L->elem);* @" T, I& o' O& N6 ^
L->elem++;* l% J* I! }! l5 K: o
}
6 V5 @' \) s0 U, H5 O! t exit(0); c$ a# f0 [4 L# q% ]) J
}
4 B4 c* w: f, Y% s) Q! q* X# k* x ?- N; M/ [; g ?5 e* t; O
链式表示方法
2 X5 _, q3 a* P9 c+ X$ R: O) E" S, g/ \& O( j) s! Q
结构体定义5 `- e7 h- Z. D' T% h+ }
/ P; W1 ?$ c+ @8 E' y
typedef struct L_Node{
1 r5 G( ^# A3 A+ c7 _% J ElemType data;
7 v! z- x- w( _4 \" \7 D& {9 i" E struct L_Node *next;* ^6 }. o# f5 z9 Z
//struct L_Node *last; //增加可变成双向节点
" d' P- u/ ]/ ?, q X5 \, S5 h4 G}LNode;3 S" z6 J+ v% e3 P
. h" F' c: d( i3 a) q7 \
初始化
2 l; B; d! \( D3 {5 f( J) d. l+ k: m i( F/ H: G2 i
void LinearNode::InitLNode(){
4 q" f6 t" L& a/ R6 x HeadList = (LNode *)malloc(sizeof(LNode));
5 D+ } ]- |3 K V( S+ h$ d0 n if(!HeadList){
; p. M' q/ t* S! N" o$ B3 c' j cout << "初始化链表失败!" << endl; # L+ y& |6 J5 N4 k
exit(0); ( _) n% _& R! u( v+ Z
} 6 R$ K/ s" Y- Y: j2 T
EndList=HeadList;
+ L5 h" @' l- b- X5 P HeadList->next = NULL;8 a& _, H. G. B8 L" h
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;7 x. o! r6 \" c& U8 ~* ~# M. C
Length = 0;7 o8 l( l" p- O1 G. H0 ~; ^% n
e_where= 0;
* j, O$ @0 g4 i}9 U8 B+ E/ b: ]0 R) H2 x: I/ c- W
& H; J1 R, l2 Z8 r3 B
增加节点
# m0 \ e6 k# C, c5 x
: i {, M& E: n8 f6 Z; i2 Yvoid LinearNode::AddNodeHead(ElemType num){ //头插法 8 W4 v8 [7 y% f3 I! P
node = (LNode *)malloc(sizeof(LNode));
# p! f& W. s2 l/ h& R4 M$ V% ^# w+ q if(!node){6 L; g, L+ p5 z
cout << "新建节点失败!" << endl;
* F) u& ]) _3 b5 n return;
2 d# A5 _( ?$ s* y# M* s5 q+ c } ) M5 l6 H2 ?) l% S; C7 F
node->data = num;
& d4 S4 v9 s% ?0 E. J2 [ cout << node->data <<" ";
. R9 M9 y$ ]9 G+ c3 Z, |4 n if(NULL==HeadList->next){
& c/ m. Q2 R+ \0 J, o& {7 H6 m node->next = NULL;5 @9 F, O5 x$ i* g, @) Q% b) W# S6 L
HeadList->next = node;) F9 r! T8 d5 S% k% V" k; S% j. Z
EndList=node;% H7 @: i( d( f# j! S, r
}
2 x2 u Z, j- m% I5 K else{* ^+ G- P! @! Q+ c h
node->next = HeadList->next;3 Y1 K3 w7 g0 r3 [# v) k) ~1 \
HeadList->next=node;' W- B, J6 D; \: e, `
}7 t0 K$ u6 o* O
Length++; ' A2 g1 R' o7 i# y" G
}
8 r6 x1 E. _0 Z M# ?( }, P0 q/ }2 f Z; ?7 l6 O; l v' i
void LinearNode::AddNodeEnd(ElemType num){ //尾插法 ; a1 i( E& x; ~
node = (LNode *)malloc(sizeof(LNode));3 ?9 ]3 u6 i5 @% E* L7 {1 L4 n- R3 L
if(!node){
; ]0 }4 `% C0 p/ D. \8 t8 P7 o9 S cout << "新建节点失败!" << endl;
& y( T S& g! B) @1 A* B7 |4 j return; , }" D0 b1 `: a2 y: R/ v: q
} ) {/ {& [) I6 Z/ x) i, j& ~
node->data = num;
L, G9 I: J1 f0 a+ _3 m$ A- K" L cout << node->data <<" ";
0 Z) P" c6 G: I! O9 J' g& p node->next = NULL;
6 U5 n; u$ T$ R EndList->next = node;3 w; k- S0 m2 n/ i6 I
EndList = node;( n, I* q4 e2 F
Length++; 6 O9 {: O2 W' N. J% W: {/ B4 f/ z' z# t
}
0 x- M5 @) E r0 H
: z7 B+ A" e0 d& M5 {" b5 n删除节点
! S% X! q) V7 G- [' W
1 F8 h" i, E+ x9 \ lvoid LinearNode: eleteNode(ElemType elem){/ r& o2 |6 F. S0 a
if(NULL==(HeadList->next)){7 c: S4 ~, T" d
cout<< "无节点"<<endl;/ o( v' [6 E, m8 ~8 v
return; * J5 y6 E# o5 x3 [& Y% Z7 s
}
- C, L, T6 x! K9 a' D7 j' H' Y Node_cur = HeadList;7 n* W6 b* r: C1 j. r
while(NULL!=Node_cur->next){ l, O7 R: x; s7 ~/ Q: x
Node_temp = Node_cur->next; ' ~, v4 i6 ^4 U* k- X" Y
if(elem == Node_temp->data){4 s* F; ~1 @4 e# A V
Node_cur->next=Node_temp->next;
; p- ~$ O# f5 K- v free(Node_temp);
4 e- j, I( P% b B }$ R8 Y2 s% E; ]' g+ g' H7 D- t
if(NULL!=Node_cur->next)
7 b" h$ X" S q+ w, Q Node_cur=Node_cur->next;! N. ]" U8 p/ ?$ q( c0 W+ v
}6 [4 z2 \9 X( e' w$ F" v
cout<< elem <<" 元素已删除!"<<endl; V" {4 s7 L$ ]( Z9 Z
}
1 O1 s* a$ t4 V* U3 s9 w* \7 c( `
2 J* l7 ^9 A4 `9 u* }显示链表4 S+ @! j9 p! D% k! W0 ]
; M* X1 `* w% G6 z
void LinearNode::ShowLNode(){* q7 m5 ]/ K( }4 M' d! @" C
if(NULL==(HeadList->next)){
1 D% k3 k1 a/ d+ i2 S" Y8 N+ o cout<< "无节点"<<endl;
; `+ ^( q% s& j" N4 A return; % }3 O/ r& p, B0 T# H/ G$ Z- u
}
7 i$ f2 p. s8 G, ~; Y# W Node_cur = HeadList->next;
- w* ~! X% a5 U7 B8 s4 p# }6 O3 o while(NULL!=(Node_cur->next)){' b2 L) i* |+ m, n; C
cout<< Node_cur->data << " ";: I7 q8 ]/ u" {' |% s
Node_cur = Node_cur->next;
3 m$ J$ ?* n. Z: L& @5 h9 \ }
# ~7 k+ r s( c' t; X4 g cout<< Node_cur->data << " ";
' t# o$ o! y( a8 Q cout<<"链表中的数据已显示!!"<<endl;
/ A# d: X# H$ r5 ~6 s}
) J: q, Y* \) \' U6 C6 D Y" A( A9 u4 b( l( n) F
销毁链表& B9 B! l M/ \, q _, D
. N5 q! L! E6 S7 U) Yvoid LinearNode: estoryLNode(){5 S4 Q, ^% z8 m7 t
Node_cur = HeadList->next; % s6 _: g5 ~& l, @4 a- w0 z) C% Z
while(NULL!=(Node_cur->next)){+ [- Y7 J; Q( V" u6 O
Node_temp = Node_cur->next;
5 o5 u, q5 J- |/ a4 K$ e- k free(Node_cur);
8 n. z v2 f# g Node_cur = Node_temp;/ w' i+ ?8 Y% B( J0 I5 Q
}+ r/ d V, {1 {4 y3 X8 W
free(Node_temp);
/ [3 d6 U( S4 A( k" G cout << "数据节点已完全释放!"<<endl;
# q0 C! L1 b4 n6 V; b free(HeadList); // 释放头节点 5 H) O% ?. o) v, ]! ]+ s
cout << "头节点已释放!"<<endl;
: \3 d: @5 M: w) L; M s/ Y5 l————————————————
" P+ a) \4 J. |8 s5 F, j版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 F4 P6 }9 O t& \& g
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286- x; H; ]% ]3 [8 \. e0 x; |
6 f& r" {; f" a$ l! _7 a$ b
; x- P" e$ @+ O: F9 [! d |
zan
|