- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566700 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175233
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
o, C* z4 [! r( `# ]. D6 T) {7 r) d线性表顺序表示、链式表示实现方法及其异同点
$ ]1 Z8 s6 |# Q" k线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。4 F! S& [5 ? Z+ k$ o( y: D) I2 v
, |6 W. }/ A+ \( o
本文采用C++实现两种表示方法。
1 ^0 K. Z' e, A0 E u! o3 w* {, A+ i$ g5 |
目录. L) K, ~& t0 R* s% ?; n* ^
8 y8 y) H3 b ^ G% `1 ]5 i: p" ]顺序表示和链式表示的区别:
L& n+ M- i# K% ^
! a/ `, U( Y$ p. O$ F4 A创建方式:/ M9 W% T7 }8 G$ m( P8 {
1 M) T* e# P8 J9 I' j
时间复杂度:
: Q% I4 r7 ?+ _8 i- o
! l& T t, s3 G) |3 G' @) a顺序表示和链式表示的相同点:
7 o H& {$ p0 f0 T- `0 f
: \$ F- b- G: f# J9 c( t; u8 t删除内存空间:
# \: T( R' O+ c0 I7 |2 Y( Q2 T3 T+ L0 U
代码实现:
/ a1 q4 i% w/ v8 ?- P' ?1 R% I# g" U3 W1 |; ~% y
顺序表示方法:
P. U, S8 {2 {0 \0 `; ~* i4 I* G; q( f* T% l: d/ t9 n. @
结构体定义
' Z! f( H7 O0 ^
, v: d) ^6 }; n初始化
5 Q7 M3 }& l$ c& c' t
; ^8 G* v7 x" j. ^1 l/ n增加元素8 B+ V! a; ]9 X- _* Y5 X
, O) I5 }0 D0 f9 |7 K6 n
删除元素6 ]) h4 w7 T1 Q& Z+ Z3 y
6 E* g# R- ^+ V% u3 x8 Z7 l: f
销毁列表
# P4 W( b, T* J# P% p$ X6 o8 w2 Y$ d
2 e# s+ \/ u: `链式表示方法. u: ` r) o" w, g' |0 O
8 r4 l* c' ?! h/ a
结构体定义
) U- h; M3 a$ \" i- y, i6 O# _! `8 @$ \
初始化
A* e/ O) V1 L) x( j$ A! j* ^& p$ u, G7 X- A
增加节点
S) Y8 G C; \9 {, |, A3 Q% z% n: g
删除节点
+ O3 Q \( O- m. g+ u: A9 t8 H0 F1 R( U2 n
显示链表
# b( p. N6 T1 b d% [, u/ W; V% ^& o& O
销毁链表
( O7 C9 d6 M! O ~0 X+ i1 A& W( O- K- n$ e2 I8 C0 ]1 @
顺序表示和链式表示的区别:
3 \7 |& |% _/ r6 g$ g, u- i7 ~
" v- ?: B/ ~8 @9 O& v创建方式:
" p+ k3 ~ H. C* d; A/ V
. Y# y Q9 s8 i$ J: _ t B顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。! }# t* z; m4 c, c# V' V
2 ^) L: @5 t; t: W9 G% ]
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
4 G. j5 ?0 B: E$ ?/ Z: }. j8 O& \! g* y
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。% j- g0 W+ D' }" d% C& [5 H
0 R6 a2 q- o( X5 B) u+ ]时间复杂度:% E( W+ h3 ^" j# E- L" S9 |) x$ T! w
6 m5 W1 w) b% E1 O6 ~' ]增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)5 h8 R# h* |' m5 q
; w5 K' {- S0 |! p# M增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
) q( e2 N& J" q E3 A4 l/ D2 s& P. u+ [0 J) Y5 r! h3 A) Y! g
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。' V/ i: E/ r8 t. n6 K2 F) s
* |) m5 l2 v6 ?# C- Z F# a修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
2 y* v/ g. {5 A4 m& ]% ^$ ]8 Z) o
8 X4 p3 }& ]5 a查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);' b5 H8 k' o2 J7 H7 O0 b# y( C8 F1 i
' x$ M/ d2 I% K: ^! d( T
顺序表示和链式表示的相同点:- g' e5 x" B; L: t1 c s
5 `. c; y) N4 j/ p( H! A删除内存空间:, a' \' H G' h k* g
5 I3 @$ x- r( J0 B
内存空间的删除都需要对每一个存储单元单独释放空间。
% j) V& O f. Y
$ j& d" G7 q, d: J4 ?8 s代码实现:
0 a7 Z- b, j& g6 L2 X* c' f) z/ ^4 Q
顺序表示方法:
; a( g% W" J9 I9 n0 d) p
8 n5 L7 b' G+ G+ N/ O! T! U2 Q结构体定义
" ` ~+ Z( }6 U$ e% m; `
( P( d% D) G" X Z" [0 t* j5 otypedef struct {
: f' n. o# ]& A& \) O3 h, p% I ElemType * elem;
. n5 N& X6 Y; n+ \3 b int length; // 线性表的现有长度
' {/ K# A8 y& s6 I8 \! f% A+ X; J+ D int listSize; // 线性表的最大长度
$ ]5 U: I' D; U: d}SqList;1 Q2 ?3 z6 y( ^$ b" C8 Z
. E. [2 r5 |% X0 ~
初始化
6 ~6 h; `. p1 i) \& A
9 }/ G! l! W3 Y+ \' wvoid InitList(SqList *L){
% [0 L& G, v) F7 ^8 ?3 M L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;9 h/ X) W0 W% W' X
if(!L->elem) {
$ _) c1 C! m; X( m, o; a& K" Q cout<<"申请空间失败!\n";
6 ~) [# z! g. ?6 D DestoryList(L);9 W% R. }$ [5 r
}
4 J8 y; ?1 W1 w. C* P! [( ^ L->length = 0;
# `+ I6 I' o3 x8 x3 y8 O' q( g L->listSize = LIST_INIT_SIZE;9 s; x- \$ G, b- C1 X+ i
cout<<"线性表初始化完成!\n";
4 L6 X) d1 t- k: @% N( K}' X e H8 C& u, x, A" a
0 L6 S+ ^3 m8 r5 ^增加元素+ p! V& J% G5 `; G7 Y) z
# x" C- z. T: i# I# Cvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
" c& W5 A% n- B, v2 Y5 B if(L->length>=L->listSize){
. a' R' m, S; k2 Z L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));9 g7 A8 l' f) r. F
if(!L->elem){
7 P$ i, s* t# V cout<<"增加空间失败!"<<endl;( C" p, ~) K, C: }/ x4 F
DestoryList(L);
^. O. C6 r$ n! Q( b* L& A }
! l5 V) B3 a9 q8 r7 \5 Q( Y }
, S' d2 X0 A( }2 Y, d+ b' D * (L->elem+L->length) = e;
+ I5 J( _9 Q0 _5 E& } L->length ++; . u* c7 _2 k" t
}
" s1 q% F3 g8 S. L# q7 t/ N" Q6 Q* g& J5 I3 _ o% S% T
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
: H5 V) [; ]; E/ R' Z$ ~% ?1 ] int i;
9 |7 I7 P5 |! T- A) z0 J! ], s L->length++;+ v6 m) d! ^% I0 @' q. o+ L' W
for(i=L->length;i>=e_where;i--){; u* q: h- E7 Y/ a' ^7 I
if(L->length>L->listSize){
5 h1 S: D5 t! ]" K9 `' M; } L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));4 A) Y4 G# p1 K% L' J2 o7 K% y* V4 P
if(!L->elem){+ ?5 r O' I- L% E% o; U
cout<<"增加空间失败!"<<endl;8 }$ o4 s/ _2 X7 \4 r0 R
DestoryList(L);
6 W/ C0 M8 I C0 ?0 P1 E4 X+ F }3 @1 s* y. R( p" R
} S4 X& A5 P$ o
*(L->elem+i+1) = *(L->elem+i);
4 R( l: j( Z3 b x& T }0 I" R7 L( R$ A4 F+ ^2 q
*(L->elem+e_where)=e;. O0 z3 I b) w3 B& l0 V% Y9 u! E8 a+ A
cout<<"增加后的线性表如下:"<<endl; 1 @* m/ t4 _2 w( r; x$ p( g2 W
ListShow(L);, G. z+ X8 \' x* [ s
}
( t+ ?' J9 |0 y; f. }: O; z5 y* ?' t4 I! k/ q
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素3 x& W4 i( Y. l
int i;3 n( c+ |* s- w% t/ a* g
L->length++;
$ V3 ?5 _- k1 B, b- G4 r/ [ for(i=L->length;i>e_where;i--){
9 w+ L1 n2 D8 ^" F/ Q; y if(L->length>L->listSize){
. d2 O6 u& d2 w0 J* ^0 ? L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
8 J5 Y, L$ ^4 _, c) p) l if(!L->elem){5 e% t5 H( a3 m$ D8 i) A
cout<<"增加空间失败!"<<endl;
# l# ^- D& a7 @, ~. e T6 @4 E DestoryList(L); 2 L W, D4 G/ x9 N, w) f2 j
}
; g9 w, D, @1 | }
; _; x! i( `: E1 Z' m. \. ~2 \# I *(L->elem+i+1) = *(L->elem+i); ( c& T" C. ?3 C7 J# G
}
6 y9 I& B" e9 z5 m2 W5 C *(L->elem+e_where+1)=e;6 B9 h& u. h6 S m( V
cout<<"增加后的线性表如下:"<<endl;
6 M+ q* n& E) y6 A ListShow(L);
8 L' \' U1 _% C: ?}, }$ D2 l5 F' o8 ^
) K; }- t3 s/ N5 ~删除元素
9 q7 a% J" h/ i& m, R+ G0 T2 a+ |7 F1 l( S7 U
void ListDelete(SqList *L, int e_where){ //删除某位置元素
% e, h8 V; b6 [" q L->length--;) P) e& k: x" T9 k
for(int i=e_where;i<=L->length;i++){, k* X- I4 A' J
*(L->elem+i-1)=*(L->elem+i);/ [. v$ y6 ]* k) A
}! F, {" E# J( z2 U8 P+ @
cout<<"删除后的线性表如下:"<<endl;
+ Q1 r* l$ o+ ]' Y1 M: k ListShow(L);7 J0 a: ]5 b5 f2 a$ w1 `/ f0 E
}
% e/ T6 g; o$ x/ T) G
& q* C% n# _% Q) R销毁列表
! e4 k9 X$ g0 q0 F. {' o! K) D( }" Z% p. K2 q/ J% b
void DestoryList(SqList *L){
4 K! a- X$ ^# i! j. y( T int i=0;, [% F/ \. H5 A0 ~' |) A2 l
for(i=0;i<L->listSize;i++){
, t \7 s; R. I5 q0 X free(L->elem);4 l6 A. Y$ g8 Q# P7 d
L->elem++;9 {0 I3 m' k, r- a# G
}
1 R3 R( U, p- j exit(0); 1 N6 X, ?# H# C z
} n: I( v9 x5 c/ ]
8 ]4 f4 F+ d: F& l, {$ G, K4 L, f
链式表示方法
. h, Q' A+ r: `% r1 d% f
! [+ u3 T% G: z+ i) L% p结构体定义
! K; ]/ a, E' [8 X5 M* l: B; F
- W$ U9 G' Q6 y. a! k; v0 b: `typedef struct L_Node{
1 d; |& d. m. q7 K. b% ?8 W+ B" H' ^ ElemType data;
$ z0 I# {6 t: g9 d& n6 o" E" L struct L_Node *next;
( g; `/ U0 x) h: [ //struct L_Node *last; //增加可变成双向节点 ; E# C1 ?5 e; u _9 k$ U. K, R
}LNode; ^( `- v. a# t9 z0 d7 l5 S3 `
* W# T5 l5 l/ u% ^! {) @4 i7 C
初始化
. R7 Z( M$ P. r# T. p
3 B2 |: b( @* k- u H1 d* Q/ Evoid LinearNode::InitLNode(){
2 c6 A( Z0 Y& ? HeadList = (LNode *)malloc(sizeof(LNode));! v: P! c! {& u; ~- [3 M' |
if(!HeadList){( y( G- L5 |. z$ G7 h, r3 { u& m) ~4 ?% _
cout << "初始化链表失败!" << endl;
. ^/ R$ V( l) M% L% B5 Z% x" z exit(0);
) p* |: I, H5 e4 Z5 G0 { ? }
6 [6 g {, Q2 d EndList=HeadList; |- W6 ?- [) i1 E
HeadList->next = NULL;8 [4 Y- N6 l; `/ i2 e) F
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
! H2 ~7 k' p" ^8 o! _8 L5 f Length = 0;% T! A& w/ q! @/ M( I! k/ }7 r
e_where= 0;& B1 R6 p; _, D( F* s! w: ?: B
}
4 m/ [, O* W5 `! J: k$ e) I {- v
& U2 @% F* w$ ~- l增加节点
0 H4 N7 \. t) O5 C+ a; u5 L9 [, R p) s8 O7 ^' z3 }
void LinearNode::AddNodeHead(ElemType num){ //头插法 / Y5 S0 ~& W+ S' k5 d
node = (LNode *)malloc(sizeof(LNode));
, J: e$ A) R, S+ @, ~; E if(!node){
. E6 I4 `+ R* _' p cout << "新建节点失败!" << endl;
7 x6 I' B" r5 ~( ] return; * _! Y1 G* b q6 y ~9 Z9 `
} : p' k1 u# Z% {/ o# w
node->data = num;$ t% ]0 {2 C8 Z) ?2 V7 q
cout << node->data <<" ";. c r9 s+ O; K* w; A
if(NULL==HeadList->next){" @' N- |3 ~) W( w6 [ S
node->next = NULL;/ K$ c3 f% K7 u
HeadList->next = node;7 N8 t4 P V3 T! T0 x
EndList=node;. I1 D# N& S) U X- D
}
+ ?$ d# E) F' Z: m7 [3 ~( Q else{+ h! @9 m) X1 N( V+ h& i4 |
node->next = HeadList->next;
4 y& g( L/ h- h; _ HeadList->next=node;% @( y2 G% e$ y" [+ h+ X
}
$ A. c. m2 W/ k5 Y& Z. W* P% Q Length++; $ v* z: Z+ h# m& U9 I
}
$ W) X* R7 S: z/ g1 p! W/ q6 }* h
void LinearNode::AddNodeEnd(ElemType num){ //尾插法
, n& \0 o0 q( [' [0 S node = (LNode *)malloc(sizeof(LNode));
+ U7 b/ H& f- Y; ~) b5 p if(!node){
+ L) Y9 n% E$ i cout << "新建节点失败!" << endl;
$ u* T" g, I/ ^' g5 } return; ) }$ \. {& }/ C! g. T- M
}
- I( m# K( @9 d' V node->data = num;
8 @6 _. S5 q+ Q; s: V cout << node->data <<" ";) O* r& j; Z2 }3 o- t
node->next = NULL;, \# m% l5 O, \# _
EndList->next = node;
5 K$ h9 N4 f0 z0 j9 `7 Q EndList = node; q5 c, n2 a; Y8 y& n4 S
Length++;
, T. b' [" x5 M* ~. |, K5 [}
3 W" x( u0 h6 p N, B( z# v1 W2 L: _9 g: @
删除节点9 y+ j% h4 z2 U/ G g1 G/ f7 M+ W/ G
: v+ S+ q" M% ?- @- L
void LinearNode: eleteNode(ElemType elem){
: M. J1 V2 k% L if(NULL==(HeadList->next)){
, [% a# f, t! a4 [4 M; { cout<< "无节点"<<endl;
8 M' Q `; v3 m/ f2 ~8 H return;
: c8 v& Q" k$ ]3 Q1 S2 R" O }; x9 H! ~3 U& {* B6 s; T$ F
Node_cur = HeadList;# e4 D; p" D3 g! m5 Y3 N
while(NULL!=Node_cur->next){
" b5 H. L+ n. T) F Node_temp = Node_cur->next;
% m7 \# g6 |' z1 {5 ]$ e: `& A/ Y if(elem == Node_temp->data){
6 V- W$ L/ F) R Node_cur->next=Node_temp->next;
5 A9 M4 p8 M6 Z; u3 x free(Node_temp);
6 A1 T' t5 o/ ?5 f3 { }% `, }% I/ o, U) a8 j" N
if(NULL!=Node_cur->next) f; G& h& G" |% `& z0 w# L
Node_cur=Node_cur->next;5 y. c9 }& D7 {* i: Q+ m& B
}
9 \( r9 r0 z- z3 w cout<< elem <<" 元素已删除!"<<endl;
& B0 i9 v+ f7 E+ J+ R- P" S L} 2 Z+ x; N8 B q7 Z5 U, j
$ S$ }1 h( }6 A+ t7 Q4 p# U显示链表
! m( _6 A: _: j$ a; J
! r) Z' E: u8 w/ B4 evoid LinearNode::ShowLNode(){+ {8 p/ X/ E( e( b$ p& p
if(NULL==(HeadList->next)){! f1 W3 `/ N: j
cout<< "无节点"<<endl;
2 B9 W, S5 ^5 m$ \5 J return;
- K& [/ _! h- T$ n& L }
2 _4 g9 P$ D9 w( Z Node_cur = HeadList->next; 4 x4 J6 z! \0 Z$ } P. k
while(NULL!=(Node_cur->next)){- r3 D% b' L, C" B. d$ K
cout<< Node_cur->data << " ";
( J1 V" {! `; Y; { Node_cur = Node_cur->next;
& z* K1 Z: Z: e& |! R }% g4 |1 l V# K- P# z
cout<< Node_cur->data << " ";6 d/ `% }* j* r% N5 x- ^3 U. r6 F
cout<<"链表中的数据已显示!!"<<endl;
" [+ I* C; t0 R% K+ x. r}
0 h$ @: j# a2 C$ |: N2 @; d) `2 O* @' I) a& a* p
销毁链表/ T0 Y S( k* \* J$ W$ H% {
0 L% C" r' K! s. k) P4 g* [
void LinearNode: estoryLNode(){
, N! m/ x8 I; ~- h0 E _ ^ Node_cur = HeadList->next;
/ A. E! x. h8 ] while(NULL!=(Node_cur->next)){1 \4 p# Y4 u h1 A3 o# Y1 C
Node_temp = Node_cur->next;$ j. H0 S& c! S0 J1 h" q
free(Node_cur);/ [; u! x4 E J
Node_cur = Node_temp;, W8 @3 @. w% L2 s p0 x. J. m8 U
}
1 d7 t n+ ^! C( i6 h free(Node_temp);& k/ W% o8 v" U
cout << "数据节点已完全释放!"<<endl; - D0 E* q4 A4 ^( {+ _
free(HeadList); // 释放头节点 / Y9 M) l$ f L, b: K
cout << "头节点已释放!"<<endl; ; X. o1 h, T1 B6 ^9 R/ k
————————————————4 a! S, l/ C( S0 C" |' e- \
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' b; s/ M) F0 g0 z: G原文链接:https://blog.csdn.net/Baimax1/article/details/1060362866 Q2 r1 p. k( P8 I0 z
6 {& d* T$ n; Z7 o2 e" L6 V5 D5 p" w! D/ l+ U# m$ n# o" R# j
|
zan
|