- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558912 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173046
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
5 |9 U$ B7 b) k' N2 k7 K6 X线性表顺序表示、链式表示实现方法及其异同点/ b+ n* J, K9 |5 T
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
: s: L& o4 K: \; o" J- I) E6 p, \: ^
; o* Y0 K8 V) ]/ }本文采用C++实现两种表示方法。
$ R, X. a( P1 A# _
( w2 N/ t$ D) M0 E, T目录
$ L( q0 k: u% Z6 B. F- c( F1 u" B8 k, F- I6 p/ l" B
顺序表示和链式表示的区别:
2 R4 B8 s* p5 X8 K
( h' S% D1 r3 c: V, j创建方式:
9 z8 X! T# H+ ^. [: {3 x
7 z% G/ q) I$ B时间复杂度:
3 |! |0 a# l( P6 ]% r- o$ b2 [5 I5 T/ |& Z9 i6 K) R( H
顺序表示和链式表示的相同点:
3 h( y. ?, r% r1 m* }4 h( C
( t1 Q* |, k, ~) `) ~0 C' c删除内存空间:
$ _1 e. j! V/ e" w9 o( P% z. q$ Q p' ?# C. h0 H2 g3 l1 [$ t3 z
代码实现:8 f i+ {% G/ [1 t* h+ v. p$ ?
* Z, u. a. K4 E% ^* J$ P顺序表示方法:
! z0 O9 y7 `! l: U
! {! M" @" Z m$ l! \2 D结构体定义0 O6 N2 P! e& C/ ? m% R
) Q) X# q/ G: f$ L D: }
初始化: V7 p- V, h C! x( l/ q
6 }' y7 E: t! i; ~1 W( f# q增加元素
. E: t$ d' d B2 e, w
9 A1 p- U& l' b# H% P" F删除元素
( S w$ X( S/ q3 l8 S8 `! G% s$ H" C0 }1 Z7 g8 D
销毁列表* L2 J( M; x8 m. A0 d
2 `# W0 D! f# y3 W/ R. ~# e链式表示方法7 N) n: \ w' i: N A2 d t
( ]# ?0 t+ ~' g( e7 Z结构体定义
' A' K* F7 l1 h1 l9 [2 R% ]. Q/ R* a1 D5 r& Z% l
初始化
Q& C2 i J+ V2 E
. W! V8 x# w3 h" i2 E, m' s- d增加节点+ D! m7 J$ n# P0 p$ P8 u- k
8 T. N4 y, B6 N删除节点$ h& D( C; G4 n: n* e
% K4 z$ X: ?. ]! E* s y8 p
显示链表
, V# H6 Z8 T% A- P8 t! K$ k( p6 R; j& L0 Z
销毁链表
/ L- e" P4 N4 x& }0 j- C4 P( ]0 Z2 c; ~8 \7 Y9 w; ?
顺序表示和链式表示的区别:! b, n- R5 [! Y% s3 L8 U# k+ M
8 r+ B9 T, j5 X! {0 i1 \# R8 p( h创建方式:* {: D' K4 m3 c& d6 \
2 E- [- L2 V% J- s1 p+ |' r0 D顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
1 A1 Q4 L R$ n4 u1 S' k( f9 K A w, B& y" G* T9 n
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
; o/ c' C6 T3 n1 F! u+ O
' L; S! H. Q0 ^链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。, M5 e! e. T1 a$ q/ I
2 b& A" l) [+ T& o
时间复杂度:
# @% {" R2 a8 F/ G; E
; n* Q. w# U/ b& z- T$ V9 M增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)% j& r |1 i2 \- H) V
. v: Z3 F( V; }6 d
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)1 ?- e5 t& D) Y1 R
# P- {7 y8 g' R Q/ D
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。" p( Q1 w- s+ I/ ]
+ R( v: q& w7 \: B. y+ V* L0 ?修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);' k8 Y+ r8 n; p: p; K
) d }8 E+ p* r% u
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);1 o/ \" F7 @: ^- m9 }! X) s3 w
1 E4 _% @$ a0 a
顺序表示和链式表示的相同点:$ t) ~( S5 ~( ^: c- K" W1 Q
6 N- ?, ] _2 r% K
删除内存空间:
! W! L b* T' t+ U" z
( e) S% R8 Y0 H. m5 Y内存空间的删除都需要对每一个存储单元单独释放空间。
; K8 m/ G) \7 T. Q& y" U0 @: W( L/ m' q* x5 N( c
代码实现: F5 ?& y% d6 e3 Y/ y
$ k, y$ M& K: G5 g
顺序表示方法:: x z5 s/ W3 \( t( \% b
. l- p" r+ d1 h/ _1 O7 v结构体定义
: l0 Y: H# m8 o+ v9 y' |* A$ o; F. ~# ~; n, o% l2 \1 i
typedef struct {
6 j& }5 y" t! b/ l* P* @2 I ElemType * elem;
- n4 b( w+ b* l2 \/ Z# @0 _ int length; // 线性表的现有长度
8 I T7 H( D* Z int listSize; // 线性表的最大长度4 N. V: ]: t' G/ P$ p
}SqList;8 O/ {8 L( l$ K O
# d9 I8 [$ A9 @4 b5 l' q# {2 m4 J初始化9 f' p- n5 Q1 A5 x
7 |& e' P7 ~5 G, T( \1 q& @ J
void InitList(SqList *L){; n T$ S4 o7 |$ c$ G- q
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
' `: y8 B! p4 f if(!L->elem) {) B* O1 Z1 y& {. ~
cout<<"申请空间失败!\n";) ]/ H' u4 `7 r0 X
DestoryList(L);
# d9 Y. ?" f$ f; e; D }- L$ a" l# v1 u4 |: C
L->length = 0;$ @) q) f- O/ } w# R/ O8 Q
L->listSize = LIST_INIT_SIZE;' w; m8 Z1 I+ G& r* B0 d8 }
cout<<"线性表初始化完成!\n";+ h0 k* t! J" V: Q2 _; D
}& V: h& o* K$ z. W6 J$ n$ c
* J1 e; W; P0 j- n- E) ^; q" P8 L2 l增加元素
8 G" _$ S w! K# R& F
9 U1 K2 ?& y/ t% i. Ovoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
1 v1 M/ K# X: k# h0 ` if(L->length>=L->listSize){
4 [8 [; [# j1 A6 u/ W3 w3 D @ L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
1 H F3 h; [+ Y if(!L->elem){
8 W% I0 J2 r4 t, L. _ w) { cout<<"增加空间失败!"<<endl;3 Q2 D# J/ f9 z: t
DestoryList(L);
- r# [# [9 z0 {3 M" t }
: A$ Q6 r, F* [) G8 T }5 Z+ g, J" ], a3 P3 O# k
* (L->elem+L->length) = e;) {# i% g# ^2 L0 @1 T# E
L->length ++;
T- ]2 p% H* B. _3 Z& _2 s- s% _+ ]}. \- E* t+ _: [1 T
4 |% F: V1 f+ `7 y( rvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素3 R9 ^/ J/ x! B
int i;
- H0 k0 D' ]7 M+ w; v0 a G L->length++;& m8 N( [5 s2 h4 L- ~& J
for(i=L->length;i>=e_where;i--){* B* T |+ k! Q4 K
if(L->length>L->listSize){
. m0 L) ~9 z1 \5 u. O: w A9 f1 t L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
* g/ X) S* z0 P- b6 K if(!L->elem){
' ^9 s: H8 a9 e+ l6 D cout<<"增加空间失败!"<<endl;
. p# x" r" d7 s% w DestoryList(L);
; ]$ K9 b6 Y/ C }
" I6 L) Y/ v, Q' r+ C) j* e }1 [. D5 i4 u* P) ]3 k5 R
*(L->elem+i+1) = *(L->elem+i);
9 q1 q+ K1 [; w: F; T }
* j9 {7 Z" W2 e9 e( X; H *(L->elem+e_where)=e;
9 q' i1 u9 Y2 a% L. L cout<<"增加后的线性表如下:"<<endl;
/ i3 `1 l! _3 s3 B0 |8 ]6 Z ListShow(L);
, A8 j, I% y! q. Y$ W6 e}
; I, p2 @9 f, b& ]9 p2 x; _7 j4 E: V4 B- T- T/ I. ? v( Z9 _
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素/ m: N$ j; k' L! u6 Y7 y& a. J
int i;/ I7 H! l# c: O" W9 g5 Q& B9 w
L->length++;# P3 |' B7 F0 ?
for(i=L->length;i>e_where;i--){ L7 B( c% L! S" K; o( m0 r0 l9 _
if(L->length>L->listSize){
, x6 K5 D% O% @8 C1 l- x L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
2 u* [0 f. R- F. K6 q- U if(!L->elem){
! n' o8 ]: W" Y- A7 ^( B cout<<"增加空间失败!"<<endl;
1 k, L- V7 f& A; y- Y! o DestoryList(L);
# h& t/ e# H% x% X }$ b5 a$ ?; |. @
}/ F* a0 \, {$ N2 t/ |3 G
*(L->elem+i+1) = *(L->elem+i);
5 l7 _. m0 m. |4 e8 [- [% M }8 g4 F T, C; T1 x# R
*(L->elem+e_where+1)=e;9 w+ K# ]) I0 x) g# ~% ?( K
cout<<"增加后的线性表如下:"<<endl;
9 c2 D4 a* Q) C# C6 v8 U ListShow(L);
7 J9 _+ d% P1 v1 _% `}
/ A- t. [# G) I$ @! q
& {( ` J, _1 @" k; y删除元素& F$ y. n6 N( S( J2 J6 |! z; t3 \
" q2 m2 d- g$ ~9 T p
void ListDelete(SqList *L, int e_where){ //删除某位置元素 9 G0 M% o5 i( ?8 j; x. @
L->length--;
2 |$ e2 G6 d# u/ @, a for(int i=e_where;i<=L->length;i++){
$ p4 O, S8 f" s) m; ~/ p. d+ b2 x *(L->elem+i-1)=*(L->elem+i);
$ }( H1 ]# V# p N }# V2 z9 ~3 S6 q
cout<<"删除后的线性表如下:"<<endl;
9 ]% c5 |( L# F' y! E* ]( _ ListShow(L);' r# y# j$ _8 q# {
}9 a" n+ ~. z; y3 L% y! P0 h. N
9 |% i( X+ i# R, d
销毁列表
6 G3 L# ^3 V& u) f+ s) m. y3 @# V0 I8 ]. [) \& x
void DestoryList(SqList *L){
5 b1 H# ?8 h* w- | C int i=0;
) S* {# v5 @% } for(i=0;i<L->listSize;i++){5 `" o! J' I6 y5 H
free(L->elem);
) v5 ?0 K( }8 p. i9 r" \ L->elem++;
4 x& S( Z% H+ r- y }
$ h- q* S3 I1 L2 i& Q7 ] exit(0);
, M& K# N" A* V0 N( W/ Z}" P7 f) r9 {7 W% q5 j
6 O6 U9 S" q9 g2 ?0 W
链式表示方法
# Q: }6 U$ p3 Y2 a; D. T1 O; K m+ r0 K) _
结构体定义
- N% M" i. [, V& ^+ f; h! a
M" Z8 a0 C+ u; ftypedef struct L_Node{+ } t8 Q7 L: ]5 J- t, ?4 t
ElemType data;$ _# E; }; Q Q
struct L_Node *next;; [( ?, U" V! _! |9 F: U; k3 E: |
//struct L_Node *last; //增加可变成双向节点 ) M! Y9 T6 i' c8 X, \
}LNode;
0 k E% e2 x2 L2 y- Y/ E6 r& [- J/ v. D- A: c9 ~$ k+ i6 o2 Y
初始化
: J+ |4 } j7 F
# t7 M5 W) W: U$ k9 U4 qvoid LinearNode::InitLNode(){
2 ~+ T8 Z/ o# T HeadList = (LNode *)malloc(sizeof(LNode));
5 c* ~' `1 x v if(!HeadList){
e$ ^+ X, _3 d cout << "初始化链表失败!" << endl;
: N' N( _2 M! d$ s exit(0);
) v0 J+ Y- q: T) x5 m; L; j! Z }
2 S! G3 V( N; P2 b% V2 ` EndList=HeadList;4 G1 u+ h# r3 k4 a* Z* t
HeadList->next = NULL;
8 Q" O; R- k3 r8 \. F* a' T- E/ t cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
0 L' Z- u5 a! T0 D. }6 n$ h7 X Length = 0;
) e8 {7 M; H. B# F( z8 G e_where= 0;
2 m1 H# w" \: p* H/ i$ x}
) f+ R3 q/ I) H8 k A3 F. |! ~. D$ k
增加节点
& e$ Q: k* B3 L; m$ p8 G" w% D# o2 Q
void LinearNode::AddNodeHead(ElemType num){ //头插法 : v1 [# w: W7 p( m4 R+ J, b
node = (LNode *)malloc(sizeof(LNode));
% P: I- s) W0 e if(!node){2 Q# \- ~0 [# S; n" U4 ?
cout << "新建节点失败!" << endl; : e0 b2 \1 Z8 Z6 x+ ^4 s4 J% a
return;
3 S4 `$ f4 u0 [; l) x" I# O* w }
4 I3 _1 ?4 x7 L& k, C node->data = num;
" ]9 [' T+ f4 ^- Q% t2 }" D cout << node->data <<" ";# x* P4 i, f' X7 [ C
if(NULL==HeadList->next){$ s0 c( A) w9 C% @
node->next = NULL;
5 h) x; t5 J" n# I HeadList->next = node; P6 {' X( L8 V/ H7 @6 o' X2 x
EndList=node;
+ B8 b0 V: N; r5 K0 P3 f, v& y" S }4 u% W9 c8 y1 Y. x
else{3 P* L I; b- h
node->next = HeadList->next;
( O2 C% v) t! v, X$ x HeadList->next=node;
; P: V$ l6 f { }
- e u8 }3 N6 ?% b% | Length++;
$ a4 j0 j4 w+ a, e: }" i% ~}
+ R2 X. C( O) g3 }% R
# F2 V; V' C% l7 Z* v& U7 q5 Vvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法 % v0 i+ X' u( @+ M* t/ t3 E
node = (LNode *)malloc(sizeof(LNode));
( k1 `* J, m9 _) {; G9 c9 s8 t if(!node){
; ~. S6 h% ^3 z cout << "新建节点失败!" << endl;
! {9 p/ H5 C% c$ Z1 t return; + |2 Z* E! P" I
}
6 R) U. U& p' n2 Y; p/ ?; ^' c1 H node->data = num;& j% R) E& n4 F4 J
cout << node->data <<" ";
7 X5 y# @- C) K. b node->next = NULL;# C3 i, O/ v' n! S3 \3 J$ z" _
EndList->next = node;+ W7 \5 d/ |8 P0 r- l. `3 r
EndList = node;2 @, J/ o7 Y* R ~5 }
Length++; ; F# |7 J0 A7 e8 M& `- [
}
& o! |$ ]/ H9 ^1 o' V7 A. V' J
, w) b! g; b6 J# d- d5 v删除节点1 P: C8 C/ D3 ]& W2 z4 d
# ^$ d: q7 M7 {. ]3 y
void LinearNode: eleteNode(ElemType elem){
: K) w8 q% O0 W( x( B: @* Y6 ~+ s if(NULL==(HeadList->next)){
1 |! m$ R8 Y/ {/ }: C; p5 C cout<< "无节点"<<endl;( S+ v j; A3 c% @$ `8 ?: Q5 I
return;
& V6 {7 b0 S3 {5 a }# b5 G6 [0 u' w
Node_cur = HeadList;
# J- O# t6 Z+ c while(NULL!=Node_cur->next){& h! i5 g5 @4 t! S; x$ s/ H
Node_temp = Node_cur->next; + P/ E7 e' A6 E8 `; F Y9 N
if(elem == Node_temp->data){. K8 h, c- O% h$ E4 {9 q$ F( A: N
Node_cur->next=Node_temp->next;
& p2 p& y! m1 l7 M4 S& d free(Node_temp);" y/ Z: [4 G3 z# x, l$ [
}
4 d% t% ^% I9 p; f3 \9 O if(NULL!=Node_cur->next)
" ~4 M" q5 o% F. d Node_cur=Node_cur->next;
: N# H/ c1 e& w. h( d }! h* S1 p4 ^8 G' r; I4 q% I7 C
cout<< elem <<" 元素已删除!"<<endl; " k2 I& T! d0 \1 u3 X) r# _
}
) E6 `5 y3 |1 \5 O: \4 r1 B
2 ~7 h6 O% S" C1 x) Q显示链表
2 @- q1 G* Y b: v" e; ?$ G( B! f9 d" \8 e6 r) \
void LinearNode::ShowLNode(){
' L( a+ w9 g2 Y! L1 `; [ if(NULL==(HeadList->next)){$ Y0 \; O2 r1 ]3 _1 t) {# B" T
cout<< "无节点"<<endl;3 Q6 z& v2 v1 C T. O1 A7 {
return;
- v. r" R$ Z% W! K3 s3 K; u }, y9 T) {. e; I0 [
Node_cur = HeadList->next;
J9 f; Z3 A# J4 p5 S' C- a. ]& s while(NULL!=(Node_cur->next)){
# a) O1 [4 I$ h S/ G cout<< Node_cur->data << " ";/ @6 R% \2 B8 s0 J/ C6 \, _! ^" z
Node_cur = Node_cur->next;/ ~6 q* F1 C# S. v- B- T$ c
}- w% z: O9 A9 p- u% P0 u/ q
cout<< Node_cur->data << " ";
s6 G3 U0 S. u6 B2 Z4 e cout<<"链表中的数据已显示!!"<<endl;" @) m7 O C, I5 _5 Z/ q9 q2 T- b
}& R1 u" M8 _# b8 f' d" v0 Y
- ?/ ^3 A9 v+ j( Y- i" b, h0 M销毁链表% Z# I9 o3 e' E$ n }- W
: _0 M& R' D5 x5 ?+ O, A
void LinearNode: estoryLNode(){
+ @# m+ K+ r2 F1 Z Node_cur = HeadList->next; . i X9 o" x a6 n9 J
while(NULL!=(Node_cur->next)){& L+ O$ g; w: w' u6 Q9 E
Node_temp = Node_cur->next;
, l, m2 y) A8 e) E3 T5 T free(Node_cur);
* [1 l1 o9 o; [" h# W* S Node_cur = Node_temp;
~" m2 Q# }7 [+ _4 l }
1 D" D; }4 \4 {1 e, R" c' T, H" _ free(Node_temp);
* x! L$ m1 m+ ^4 g; _, L cout << "数据节点已完全释放!"<<endl;
( z# L+ `$ E. L% G, E free(HeadList); // 释放头节点 . f& X8 I# g! u- O: q
cout << "头节点已释放!"<<endl; ) _" C# @6 I6 h; _+ n
————————————————% q! D* C8 [+ ~ x* _- T1 C
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# @) T' @0 I) d1 }1 v, j- s& _3 p6 i原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
- g" ?* ]- s; O, Q( ? e3 s" h) I
- s1 v, o- O+ S% J |
zan
|