- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564648 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174617
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
6 E$ B0 h5 K" p线性表顺序表示、链式表示实现方法及其异同点
8 q" [' ]" D' ~) p6 e3 y线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。6 y$ a2 k5 x; T Q$ G! i/ j( a \
: \" E, ]/ T3 f( i- G
本文采用C++实现两种表示方法。
7 N8 T* J/ O! H4 N5 z: P5 P/ x! p4 y( Y& u! f' a
目录# W! i( |7 U4 O4 m" C% G
. T. k# y( O8 ?: u
顺序表示和链式表示的区别:
( C) j: ~! S$ n( E2 Z# E
D+ ^3 I5 j; J Z5 x创建方式:4 E6 @" `( S. M7 P/ Y# W# Q# u$ _
: S4 g. T7 J- n) t6 u( \& v+ a/ k$ W
时间复杂度:
$ F9 v# v' a: j5 v
$ G( l) l6 M3 ^: f7 F. F顺序表示和链式表示的相同点:9 [; D2 L: }2 j" Z8 I: y6 {& k! }: W7 V. `
. p/ a1 ]0 {/ _& o. x删除内存空间:
4 Y% P' o2 }' p _
4 A: Q0 s& n4 z8 r代码实现:
+ |* F1 b9 P: G8 J
- ]! \) l5 M4 h顺序表示方法:
7 U. [! F$ M0 E. w3 x% ?2 t7 q# O9 T- R; ^
结构体定义
9 Y/ m& {7 H' t4 w" ^! I) ~8 \% n5 O4 v' f6 c
初始化
8 F5 [5 D$ _ J) _9 }) Y" D4 ^' ]9 v C6 ?9 V
增加元素% c+ \: N; D* n! Z, q7 @" Q% ~
i x' y" y$ l0 j: s删除元素2 ?- i I1 r k. o7 b$ D
6 q3 q. o6 u" L' D: g5 h& _销毁列表
4 X9 x# x' E* J! c- U* s/ J: t8 A
3 I1 y9 k# N1 A q! A. C链式表示方法
, d% F" N$ y# Y) _# X# f* g
% @9 D* K' [$ k% ?结构体定义2 n0 J) d3 W7 }5 F- N! e
/ h& }7 O. K! b' e* ]. [初始化
( v6 ?9 k% n0 B0 ? {3 D2 A8 h$ L6 U: r
增加节点
- {. j: d7 S7 `6 Z; g6 } Y% r& _6 m- _4 S/ _6 d
删除节点8 l& E3 O% C" _" K& g
$ \2 n$ N6 r* q2 T0 R' Z显示链表9 G# S, b" Y8 C6 Z! t
/ x( K8 W) m1 R销毁链表
1 v9 X% E( J2 P3 R$ ? M2 J; W
* e, h$ ^- |9 U* u+ N顺序表示和链式表示的区别:
7 W3 \7 Q* I- f- \' m$ H8 ^
; X+ K, w% E. z创建方式:
4 q* M/ h+ e6 e& I$ t- f$ r% }0 P+ K
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
) E1 A+ f8 x1 e$ K: u) T4 i; e4 h7 Q$ H& c" p# R0 I# V. z6 d
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
7 A d5 S/ |4 o$ m
' k8 g6 c6 S& A5 u* F' a链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
; D1 M; Y! V$ Q3 p& \
# }. s3 v: q- z时间复杂度:1 [* ~, x: t. k1 u8 k/ I
! v0 P j6 L6 C6 ~. K
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
T* r" G7 @ M* t: F( N
$ O) K; l7 {& b. v# t增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
& T/ {7 `, |. }5 o0 i% i; |, P
3 J4 Q. G4 i+ z- v: D. W ^( UPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
' o. S3 r: O0 [5 l3 f
4 Q. |$ ]* m! E修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
4 @1 k; w" U* N6 j" B) g4 ~' {0 }8 L K( t6 o
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);3 D1 T+ T# N+ M1 J1 \: X+ e
g! p% k5 f1 S( Z8 J6 W+ K5 p
顺序表示和链式表示的相同点:
6 ?. \# @& |' a) X. [5 ~& z8 X; U( W0 `7 L
删除内存空间:2 T* L- S( k! S7 B4 i" Y
/ e7 m% X- [3 K. }+ E内存空间的删除都需要对每一个存储单元单独释放空间。, x5 f, W0 [9 r, I
# B7 F' L6 i1 T i* \代码实现:; I9 O+ b8 B) y
6 `+ e) @( y+ c
顺序表示方法:1 M& c0 G! G; X
( `9 |3 ?2 b6 c n# n
结构体定义* e; ?5 Y9 n1 E6 s; K
1 Q6 m8 {; A) E1 q! @. H# g& F
typedef struct {; Z0 U- Q. i3 n: S' J9 L3 P
ElemType * elem;8 Z! F0 B P; J4 t2 ]) v* Q `
int length; // 线性表的现有长度
) E3 i8 f) F( q6 E/ h4 M# H7 c5 ` int listSize; // 线性表的最大长度+ I) F8 O' z2 z# E, I# g: Q
}SqList;
( O" ^, K% h4 |" ]6 e1 Q5 g8 x: _7 S* d9 K# o
初始化
! q6 a3 f! G* |
: E8 Q; x% s2 S- o/ u& m: L2 f% Svoid InitList(SqList *L){
4 g4 z, m8 G& F+ J# i/ b' e5 Y L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
6 O6 b8 Z. x' v! h if(!L->elem) {
' L( W, G6 y" J cout<<"申请空间失败!\n";4 k. o* D$ {3 ^0 b; S; `3 J9 N! G
DestoryList(L);
4 l' n. Q6 D7 r" e }% D* j* G$ m1 k1 \6 y+ I. C
L->length = 0;$ |: b# W: J5 X6 @
L->listSize = LIST_INIT_SIZE;% L: ^0 b/ {4 V
cout<<"线性表初始化完成!\n";
) h1 V+ k, {% ]* L, C/ @ C}0 D }% ?3 y: P+ p7 U
, K3 Q p- Z7 }; S增加元素
5 D1 p& ^: F4 i% `. T% l$ h. L/ q: b! l& }$ ^+ W4 `
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
2 T. [4 }4 N4 M! [( n L) o+ [ if(L->length>=L->listSize){; O" a2 m6 A5 g- E0 L6 A7 g
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
8 Z; r Y/ i3 @$ i( i/ D if(!L->elem){
& g6 C+ S# Y7 H. M8 f3 x% r cout<<"增加空间失败!"<<endl;
, s; |! t# ]+ D. q DestoryList(L);
6 t0 o, Y& x- `! r0 V z }. i! ]; B% ?) k; g
}
/ @) V$ b/ V7 Q: } * (L->elem+L->length) = e;* y, J- i& `6 E) t! ]+ o2 a9 c! B
L->length ++; 9 y* L% U |$ M+ [ T5 q3 a. F
}: q. }1 r; v/ l+ d Z4 X$ Y$ E
) n4 |8 ?: `6 K) n' c/ Ovoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
7 }# u; Y( ~/ r' t' }- t) J2 ^ int i;9 F$ E" u8 T* F% k7 h- {2 y
L->length++;1 ~0 N( x& s0 k) t l/ t. s6 R
for(i=L->length;i>=e_where;i--){
% Z# _2 ^ `/ t4 H if(L->length>L->listSize){, t) V! r3 v1 P3 M
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
0 ^. v4 Q7 n8 }! H if(!L->elem){
; J- _/ g7 `+ }# Y$ p) w cout<<"增加空间失败!"<<endl;8 P4 T7 }* i& T. T6 a s7 H& Q
DestoryList(L);
+ u- \! b1 J* k% Q) x0 t0 Q2 a }! H+ N* Y4 f! F( G" M
}: ?% J! o5 G H
*(L->elem+i+1) = *(L->elem+i);
% M0 z1 {/ K" }& A& y# t }* Q. X, [- K. f1 b8 N
*(L->elem+e_where)=e;
7 e; r/ O0 X1 |7 j# n& E cout<<"增加后的线性表如下:"<<endl; , Q. O. B4 W2 D
ListShow(L);2 _0 Z: Y- z+ e; w! j0 }7 d3 A
}
0 K" H: l' ^5 k4 Z/ f7 Q
6 s" d2 A, U2 X' k9 r* w& G5 G2 svoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
3 t, v; V: ~2 t+ S+ F, C int i;
- x% o$ K6 J0 c/ {) t* s5 S L->length++;
, a3 \5 A, M8 e# {% h; C2 F for(i=L->length;i>e_where;i--){( n+ p; ^5 J0 v6 u+ A) Q- s
if(L->length>L->listSize){
/ V7 f) M/ Q. B1 f# C L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));" s& W7 |/ `$ J: {' t! U% i
if(!L->elem){. B7 X1 Y3 S- T- V; z
cout<<"增加空间失败!"<<endl;+ H$ V8 w" m ^2 e+ ^- d2 Z/ d/ p
DestoryList(L);
/ ]: p1 K) N/ g6 `3 Z$ l( T } j/ A$ y( Z5 T7 Z* K! u4 L2 H
}
$ O4 k9 x9 ^, R/ V/ K *(L->elem+i+1) = *(L->elem+i); 1 w0 e- t9 v' k1 ]- G# P1 X0 d
}: `/ J6 ?& _1 p6 x% o+ h Q
*(L->elem+e_where+1)=e;
% p. U1 M% `& x$ h# m; h cout<<"增加后的线性表如下:"<<endl;
& R5 ]0 s1 q1 Y* ? ListShow(L);
) J- Q4 v1 Q+ g0 p3 H( B# ^}
/ C; Y+ x- v/ ^+ i1 B, Y& }
% I5 I# Z1 v% i0 {5 F% |: s" j删除元素
) A6 R7 \; ?$ M9 Y' p/ f& _" C% e5 m' x- k+ B% S
void ListDelete(SqList *L, int e_where){ //删除某位置元素 8 t/ }4 d) F/ A3 O: G/ D7 L! ~1 W. J
L->length--;: D$ Q9 Y4 e2 b) v# M
for(int i=e_where;i<=L->length;i++){) F$ }" C6 H; d0 |0 | I: ?( `
*(L->elem+i-1)=*(L->elem+i);
% R: R9 a" h0 @7 J }4 b' |. W: G$ m
cout<<"删除后的线性表如下:"<<endl;
/ c/ u, |( @$ S2 T9 {0 e4 S' U ListShow(L);
: r$ o& f, s3 b5 Z' g3 ]( ?( G}
) o8 k- ~. p" R7 \# Q! f3 c# z% K$ g" E+ b
销毁列表1 G( n5 G2 D+ q3 ]; q3 Y
5 v. D8 I5 U2 M: L
void DestoryList(SqList *L){% l$ E& F! I4 ?9 H+ d# ]
int i=0;) i9 c9 _- J( S0 o$ C
for(i=0;i<L->listSize;i++){
' \( c2 U9 i5 V( H4 R free(L->elem);
' d- u) O2 X* k }) f- _# e L->elem++;
9 o0 J, x: _. E% B+ h4 U m }
7 m6 r! C2 X" _4 G3 W, ^( S& O exit(0);
5 U# ^ i4 c5 j6 `& n: i}
# I; o- Q E5 g3 r
# I- j2 a: C i5 K7 L$ q链式表示方法
$ }6 D% m6 v3 S) G5 k3 W& G% X
4 U+ |3 }" M$ h0 V; t结构体定义
* d$ _; m/ }; G! ]5 D8 I0 T$ C$ }0 E( L6 ?" `8 P9 N7 ]+ M
typedef struct L_Node{, G# U# ~3 u/ K0 i4 ?7 M7 P1 X& B' C9 I
ElemType data;
* Z( s2 c0 ?; V9 L) ?' I; O$ t4 R struct L_Node *next;
, L) I4 r7 B2 A# E //struct L_Node *last; //增加可变成双向节点
2 Y& S+ i. Q+ x/ }4 d! u& h2 ~}LNode;- ?# [7 A; t, G' `: `5 s# g
1 S9 _+ f# }% m# v
初始化
& W* N6 ~( R, A% f; x, A/ A1 w% G3 I( s4 W% ?8 a: `" g4 q* M9 K
void LinearNode::InitLNode(){3 r' Q; ~6 g" ^3 E
HeadList = (LNode *)malloc(sizeof(LNode));
% }! P k% p" e( r! \4 b if(!HeadList){
. u/ A. U# V- |5 Q, K( w m. b. V cout << "初始化链表失败!" << endl; / Q9 }# n2 b# R# `! X
exit(0);
$ \: ~+ a, ~) R1 v, S, H0 z }
; [# ?' w: z4 L. z) W8 ]7 S9 a EndList=HeadList;
, h# Y+ Z: i( E1 ^9 X% i& \& G$ H, K& o HeadList->next = NULL;0 J: d/ i; A5 |* Q' f
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;$ G9 p( Q2 d8 Q0 f, Q
Length = 0;4 |: A- X8 p' G
e_where= 0;8 q$ P, F$ A, g! m/ c' ?1 g3 v
}' n3 m2 m* q+ b$ e8 Z, m
1 g5 C) d: M- Y3 K
增加节点) P* n( ~2 g9 Z O
5 A! {5 I& H! Y9 j6 r! Q# O( b5 A. C) D% _void LinearNode::AddNodeHead(ElemType num){ //头插法 / {7 {1 x4 ~: ^7 Q
node = (LNode *)malloc(sizeof(LNode));
& i6 H! k$ P" A# x8 c if(!node){
! Q$ L; J2 d, ^4 |! u% z: b cout << "新建节点失败!" << endl; ) N8 V, J0 j A
return; 9 T4 u7 Y4 X/ O' B2 J- [: c/ I
}
( J! }7 g) U4 r0 j0 J9 V' c node->data = num;/ T b# @; \: U- n- @0 v
cout << node->data <<" ";* g6 ]$ A% ^" ?$ h, N1 [
if(NULL==HeadList->next){
, ?2 `6 |6 p* w node->next = NULL;
, T5 L1 g8 @! l7 z- a4 w HeadList->next = node;6 r: G' C! l( e& ?, X7 F7 |% B# A
EndList=node;, S4 E2 C' u, G4 V Y5 H3 L7 ~9 r* a
}
8 `1 |, Y% @ w+ o% ^+ v else{
& w6 D# {$ y G" d/ B/ p2 d, W node->next = HeadList->next;& f0 A& t0 L* b6 y
HeadList->next=node;: P. u: K0 b' x0 ]
}8 j' R) n! v& n8 a
Length++;
1 N+ z3 [' d; U9 X+ a$ f7 ]}0 C: f8 z* N. H4 y$ p
' r8 p5 c6 \, t+ V2 ?/ y- ovoid LinearNode::AddNodeEnd(ElemType num){ //尾插法
% j4 k* n) B( W& s: p node = (LNode *)malloc(sizeof(LNode));4 w' n; ^0 m0 n, m1 [* K
if(!node){- @- `) D9 G$ t$ V
cout << "新建节点失败!" << endl; & b1 t! O; ]( o: X& e9 n$ r
return;
/ P$ x7 g' c, R }
& [$ N0 o8 h& x& c1 U8 ~ node->data = num;" h) s I7 Y4 j& {% H
cout << node->data <<" ";
q+ f: W7 b; ^( E$ ?6 Q node->next = NULL;) P% G5 o3 t' ?7 o6 Y% d
EndList->next = node;8 B7 X9 T% V* w% o* c1 ?+ a: t
EndList = node;) N2 t& I9 a i4 j
Length++;
$ u4 ?* V6 n7 F& M1 X+ T}3 \6 |% ~# q% T, [3 u8 N
+ I& f% L ^ P4 m/ i4 j0 ?+ d删除节点; s! s0 l; z/ H& Z
! X: S: E/ h) ]4 ^$ pvoid LinearNode: eleteNode(ElemType elem){
; M7 c0 Z3 t' w( N; m N% | I* Q if(NULL==(HeadList->next)){6 {* |1 ]& e5 {: r
cout<< "无节点"<<endl;
0 @9 b* L/ S( a3 N5 x5 e5 x# p return;
' T( ^5 g3 l! A1 I* i( w }. ^* _/ E4 I; O3 F
Node_cur = HeadList;0 o) Z! b% s" V f W
while(NULL!=Node_cur->next){
6 e* Y4 }6 k; |7 r) q$ d; { Node_temp = Node_cur->next; $ z9 u8 @5 D- A
if(elem == Node_temp->data){
& |3 }; C& i3 F& J. v! p( w Node_cur->next=Node_temp->next;+ G, a3 w% }* k5 b
free(Node_temp);
0 @* g2 c! ~- H; z6 U$ ? }
: i5 y5 ] o8 y if(NULL!=Node_cur->next). f. E5 Z9 J8 g9 n' E
Node_cur=Node_cur->next;( ~. B* y# u5 H2 ]* P! b# W
}: }. E) D% j |' Y
cout<< elem <<" 元素已删除!"<<endl; ) F. B7 s+ R. p
}
8 k0 y* j. `0 U% z! r: b* l
! ~" N7 _& g8 C; f显示链表0 v- p; D5 T8 Z. o8 \
' P* | ]+ t7 J
void LinearNode::ShowLNode(){
. w$ y3 g; K+ | if(NULL==(HeadList->next)){
% ?! q% A. d2 d, w! k cout<< "无节点"<<endl;& o% Q# ?/ `( V+ W7 m8 _! l! U
return; 2 J, e( Y0 W8 i* K1 Y( |
}
5 C1 ?, ^+ t4 S6 U. s3 V. R/ c Node_cur = HeadList->next; ) h0 d* j! A3 W% b' E
while(NULL!=(Node_cur->next)){- n& k' F; M" _, E
cout<< Node_cur->data << " ";
3 e, a$ @$ @ c8 O Node_cur = Node_cur->next;9 Z7 b5 x; ?- W- `$ r6 U& V
}
. d6 Q ^4 H0 J& j, G0 ~5 T) H cout<< Node_cur->data << " ";: ^# {4 Y" ]( s8 D' E9 \5 W, B
cout<<"链表中的数据已显示!!"<<endl;
# N- o: ?4 a" f+ G9 K3 N3 ` O}
* Y/ N3 V4 ^9 W- i! F6 I; m
3 d: r4 b! D. u' v$ @' P4 s" t( y1 `销毁链表. P6 H* a F) R0 y9 [
+ c/ s$ H5 S, Y* A$ u
void LinearNode: estoryLNode(){9 V$ @7 ~7 g* p: P7 G5 [7 u
Node_cur = HeadList->next;
: i, |7 E, H# J+ s. s8 X while(NULL!=(Node_cur->next)){
, ]; c' g+ ?# d/ a2 Q Node_temp = Node_cur->next;
, _3 p7 R( f, Y! s6 j R free(Node_cur);7 {0 w7 j3 R6 [0 W4 G
Node_cur = Node_temp;
, p, |0 u; F. f/ U0 W- h8 [5 U }
3 L @4 t0 S) ?( L+ }9 f free(Node_temp);. }8 B# B5 i5 e0 D3 o
cout << "数据节点已完全释放!"<<endl;
8 q) R6 `/ @& {- K; a) p free(HeadList); // 释放头节点
* W/ T- X" I& Q/ r2 e cout << "头节点已释放!"<<endl;
6 J) z; B& p; v3 w+ a" Y8 i* X————————————————9 k7 a X8 f! f' L2 k1 `
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) N, m p% }, y+ s3 V Z& ^2 ]7 E原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
; e; j9 ^3 l+ S5 }5 |) f- `) @) ?# F3 ~6 i1 I$ T& P# I
2 l7 e$ F9 M1 O9 d; `- x
|
zan
|