- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566754 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175249
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
( {& C- @2 k6 a: x
线性表顺序表示、链式表示实现方法及其异同点
& m2 G" A4 T- l. G( E线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
; X5 b3 j3 y, c% T' y) a
8 o% C$ ~- _2 E) }9 f本文采用C++实现两种表示方法。& j6 `9 Z6 s: g3 Y
2 l. S+ J4 `, G% U* `目录5 q% T# M4 C4 T0 N
8 g' ]# ^: Z3 _4 N0 h+ x顺序表示和链式表示的区别:$ N# M( }( n, A
& [3 q- i, T/ e9 l, ^1 ^8 x创建方式:
6 T4 Z7 `9 |8 q$ B; K. u
& t2 u( y* K0 u r) V时间复杂度:
6 H$ A! K: i* Q2 d# m# W. \
( v, h9 {9 h% i2 N5 \# P: g顺序表示和链式表示的相同点:
, E3 ^. c" y0 Z9 u2 c0 n* a X8 Z" V+ X% B( q k' w
删除内存空间:
! }9 G! G, e$ ?. n
# }4 `4 k q/ ~. |代码实现:" b2 r! D* j9 X9 t7 r
- f- H$ D1 x, ^9 P顺序表示方法:2 }% p [+ r2 Y: X X4 B
" |7 Z, R7 e) \8 ?1 ?8 K
结构体定义
X7 `6 T+ ~5 {- Q7 v3 c+ ~9 C( t. W: Q; }
初始化 m; c! B- R2 Z; U0 r6 q" W1 Y
# I @' J5 T/ {& o& N增加元素
# N8 A2 {3 _3 w4 D: f; o! s. _& v/ n( E4 R0 W3 o9 x! r' ]2 a0 J$ a7 F
删除元素- f$ F0 r% k; _4 H5 z$ H( L
, \7 V5 Y2 u9 F销毁列表
( ], i/ P% b. i3 y* [
7 a) ]# R# B" m. z% Y链式表示方法
, Y, c y3 s1 [0 l' Q& A4 m7 X0 r3 q
结构体定义* A T2 G8 C1 `0 b# ?! U
; u+ v2 {% R/ y3 I! A
初始化
/ K: E% Y' q' G4 I+ S' c, Y4 Y4 i2 O- _1 T/ ]8 E
增加节点. _- u! i T4 w- Y& b+ W* {- F
W7 g5 s: j1 i2 v8 V
删除节点' v* {; n% C3 A( n' }
! u9 C9 x- U# i显示链表2 {' Z8 v9 z! c3 a
0 x0 ?% R; h `. H' W6 h; Q- ^4 U
销毁链表* L- ~2 L0 z% [; j4 p
" e6 s1 O; V# N) Y" u$ m' S- P顺序表示和链式表示的区别:( J' |. B* n; A# {! G6 k$ n2 k
5 R5 B& b7 W' N# V创建方式:
! `/ A8 F9 n, ?/ `- p
T& `2 K$ x) p7 o顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
3 x# Z/ [+ Q$ g& a. P' D: ?
3 r# c _6 f1 D5 {6 |# h- {) P(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
2 \3 N {! g7 ?2 J2 C7 l
7 u, L" F& u/ F" v; U! q链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。/ \1 y% V/ [! S! F, T. G$ Q [6 D) W
. U. J% ^/ f, V9 H i时间复杂度:% H6 V' I" X% H* \) D. G
. E- v$ s1 _ }$ X. f增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)8 v2 P* ^& v$ f, h4 c! a- V5 K9 W
; Q( F5 E8 U5 E7 I; P7 |
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作), N( }$ A" k. w8 C- y
" P/ A+ I) n0 u
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
* r! q9 |9 `! @" P8 }, T3 J( {7 M; ~- Z
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);/ `0 L' _) ?) W( g2 I. a, J. g
% J- @" e1 L* F$ V, p
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
l( A1 k# d* ^
7 k- R% f0 T% P% w6 r) C7 P顺序表示和链式表示的相同点:6 r( d0 j3 q6 w" C" Z3 [, A
, a8 w. C* D4 x' d" y
删除内存空间:2 q; H: M% Q6 J/ j) h1 p* k' Q
* |. J% f; Q8 F6 M r6 }
内存空间的删除都需要对每一个存储单元单独释放空间。" Z+ G8 V; @/ i
. T: k' n9 _& p6 _; X7 g) n" S7 ?1 W& w
代码实现:
" ^) m1 K( d) X
& V3 o- N' P( z( t, a* Y9 Q! ?- @顺序表示方法:
; v4 ^7 q! r- F4 c0 D C
/ ~; o3 x' d& d; k' W* h! i' J结构体定义9 v, h; h( J- L2 V4 y
& m; v+ {4 }% I6 C9 W# Ptypedef struct {2 J5 E; ` H, w% @6 ]4 }
ElemType * elem;1 Y, u* u. l/ F) c- s) y/ ^7 F# M
int length; // 线性表的现有长度
& V2 W; X8 s: d) [/ u) j. ^ int listSize; // 线性表的最大长度; W9 P: n4 k$ N. t4 x# {/ `
}SqList;0 M. ~) a; f" g0 @
7 ^; h. C2 ?+ e$ U! Z9 ~% T
初始化
5 v; m7 R' g" l* ?1 w& ^/ a1 ?( ^' Y: ^( A0 [5 z; {( ~7 z0 j
void InitList(SqList *L){
9 ?* t$ G2 \# k L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;$ A) Y, D. U! n$ ~
if(!L->elem) {
& ]8 Y" A. n- G3 [# N2 R, |7 f cout<<"申请空间失败!\n";; g- d6 u$ R+ p# o$ f4 ~. T
DestoryList(L);
- v7 Y8 X( L5 F o! r' b }
( I. h% @6 c, R& {' w L->length = 0;
8 I: C, y* }5 R# O" o7 E9 W L->listSize = LIST_INIT_SIZE;! ~7 ]) H$ i# g: G( T
cout<<"线性表初始化完成!\n";
" ^5 ?% ~4 R4 t D3 T- V" C2 l}8 F+ h5 t5 C c& L* g) f
4 g$ t: p! W( R增加元素$ I, Q2 Z& u4 w' c1 ~
) G. H1 s3 O) `) Uvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素" G+ U: ^* b$ ^" O) _7 i
if(L->length>=L->listSize){
1 i" H% g6 J H r, ?# f# d' A L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
' w" \5 ~: X5 G$ [ if(!L->elem){
3 k: ]2 \! U- m; D$ \ cout<<"增加空间失败!"<<endl;1 `( L+ y6 b1 r+ T4 J; W3 D
DestoryList(L);1 P4 V( S4 m M1 k2 b3 I
}
: B# v- U8 a$ a! \" }$ T1 A }3 L+ s# g% d: Z6 X2 g. ?+ K
* (L->elem+L->length) = e;% k4 Z, @* t) f3 A( Y
L->length ++;
0 Q; Q" x! T' ]6 l q. f n* u}; r6 R y. \- F! \0 s4 A/ _
7 b; F. v8 u3 Evoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素1 F$ j2 Y* w* U6 p) A3 i
int i;2 o) V. d1 R' j3 {, i$ ^$ X' C
L->length++;& k3 {# E! F+ q- H: w
for(i=L->length;i>=e_where;i--){$ _- A* x8 `; w1 k4 R; [0 b
if(L->length>L->listSize){& [9 h- B( `8 M. t. O
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));' z: m6 v% C! }) m" b
if(!L->elem){( T3 J G1 u' s( R" G$ Q
cout<<"增加空间失败!"<<endl;
6 P, e8 h4 n& o i, g DestoryList(L);
+ i% \5 z- }; P; N; L! G }
( C8 [4 ?# V3 ? }
4 P; Y0 L' u- @7 i1 H5 q) K *(L->elem+i+1) = *(L->elem+i); 6 i Z+ p+ x7 c" A% f. K5 E ^
}- V5 S) V9 j8 t8 a( z& K: C1 }! G
*(L->elem+e_where)=e;7 f K% i+ S; A
cout<<"增加后的线性表如下:"<<endl; , m" ^& L6 Y3 H, Q) b2 Q
ListShow(L);
/ D1 G6 g: B; L4 q8 V. N/ @1 u} 2 M7 n- s) J) c5 E# i7 J
# n+ u+ ]+ B2 `8 V9 \" u' M# Y# G# b4 d
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
& E, ~5 K0 P2 K8 w5 r int i;
3 f$ N1 L1 _0 i. p L->length++;6 n1 f; i9 j- k0 L$ I
for(i=L->length;i>e_where;i--){* x) ?# _6 N, k# ]. U
if(L->length>L->listSize){
+ V% i( W+ S! i6 Z L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
0 n5 D2 o) U, I. P5 C if(!L->elem){
6 w9 a) A y5 N8 {& Y9 A" C7 w# l cout<<"增加空间失败!"<<endl;
5 M6 R2 H5 o; N' P: t' @ DestoryList(L); 9 o, F$ u) P! C& u0 ~
}
4 f5 S: q3 P1 ^3 K }
& ` U& ], Y4 S9 N( V+ n *(L->elem+i+1) = *(L->elem+i); ) d& }' G4 Q+ a# K
}
; P7 s, e E- E& e$ q7 R5 t *(L->elem+e_where+1)=e;
. u( s4 Z3 N; [: \! N1 H cout<<"增加后的线性表如下:"<<endl;
) A8 T1 c7 Y: B+ e$ v6 m+ A% a8 @8 i+ _ ListShow(L);7 N+ }6 u' `( N3 l
}
- w" V! r, ?% E) J( _" g4 {
+ j' J0 R2 q& J3 I1 `删除元素6 @) @0 I" u+ f" [" a5 B& _+ k8 D# F
! Y: P. B" U, @4 ]4 s. V8 ]
void ListDelete(SqList *L, int e_where){ //删除某位置元素
1 Q$ x& W% P1 I& B `" g' u3 ~ L->length--;
# z' a3 j0 @/ k' q0 V for(int i=e_where;i<=L->length;i++){2 |! m& x" ~% q. Z [# ]
*(L->elem+i-1)=*(L->elem+i);
9 I3 H* |9 q2 k0 t4 B# L# t/ C }
' G& J% j! ~( R, ]2 y+ B/ Y$ N cout<<"删除后的线性表如下:"<<endl; ' l& Y& W. q8 p9 Y' {1 S& c' Z
ListShow(L);
1 Z! b0 l F& F0 L3 H}
2 |. Z3 [3 S% n, N$ v0 s0 F2 F4 f/ X) T4 g5 A6 `7 f: T
销毁列表
4 I1 W/ b6 y% d; B, R& J# W5 z9 S
void DestoryList(SqList *L){. P1 x# A! q8 k( G" H2 }
int i=0;
2 r/ i5 k- B* D6 C% G, f for(i=0;i<L->listSize;i++){) `, V, Q! j! }* ~( W
free(L->elem);
$ d& Q+ R4 n5 A% \ L->elem++;7 @9 ]: g8 B+ ~, z. j
}3 {2 O) `% h, s- `1 E0 k
exit(0);
( k3 c6 d7 E2 c8 {}
2 n6 r1 @0 C+ B# k% A- K
. x5 s, I8 r1 D- [) G4 H链式表示方法, H7 j7 c+ _ {: V0 r$ c& e
' W4 x& R1 I! p& Z8 [3 g& \
结构体定义
4 n2 U$ m# t8 e" C, v/ b6 Z$ i" i# D. W6 [( D
typedef struct L_Node{
, @4 h# }+ r* @3 S+ C1 b. b ElemType data;
' ^0 S C1 z7 h# a% |) P( d3 A+ R/ b struct L_Node *next;4 f4 h6 L- E. a2 ^% a' i- t6 ]. n
//struct L_Node *last; //增加可变成双向节点 ; l: X& Z k3 r; j. `# B% h
}LNode;
' ?; s2 T1 j6 D1 n% t- O/ x* h* m! A8 t t
初始化9 C7 _3 B7 H# X) d4 ^; }
4 e o! i( F# r+ d2 w& zvoid LinearNode::InitLNode(){0 {, g! G8 ]& G7 I! N; O( y
HeadList = (LNode *)malloc(sizeof(LNode));1 K- F. r* ?% {# l8 w( p% L% l1 P2 ~
if(!HeadList){( a$ b- ? e% @" ?* k
cout << "初始化链表失败!" << endl; - d: G/ c7 P3 L: q- U `3 F
exit(0); 3 o6 U9 p* S/ t: }
} / U. H. B# @8 g1 L1 l( C8 }
EndList=HeadList;
- g+ R. c2 N' f+ O* x) |8 g HeadList->next = NULL;, E- d; z' v; ~4 ^' L& p
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;) b5 q- N9 }2 j+ E
Length = 0;; B' h7 [- b) H$ V0 Y( E! h. ]
e_where= 0;
( k1 r4 L! i6 I9 K0 C' K% j3 S& j}" b: G" ?+ o+ d& s T5 b# c, ?2 e: \
2 E7 M- P5 }9 e6 `. p. B6 I/ y: q
增加节点4 \+ P* {% D& A& m0 `9 C0 K
. E0 @9 D5 `5 ?$ ?5 a R
void LinearNode::AddNodeHead(ElemType num){ //头插法 $ v: p9 T6 L6 H+ R8 z3 ?
node = (LNode *)malloc(sizeof(LNode));
3 z7 N+ } k& k if(!node){% R4 t5 g/ z; M) p4 Z
cout << "新建节点失败!" << endl;
1 K+ S/ ^' j( e1 L9 v4 @ return; + S8 ?" o- a$ x& W' g2 d
} 7 y. i+ I$ q2 ]$ b" ^
node->data = num;
! F' n/ Y0 P7 q cout << node->data <<" ";
- a$ U7 ^# i! t6 { if(NULL==HeadList->next){
8 g3 E( y5 T* R" B/ w* l( G8 b& u node->next = NULL;: _$ H' T7 O' b% a. g9 G4 D0 U+ y
HeadList->next = node;
% f+ F1 [, H. ^% L/ v EndList=node;, K; M/ [! z5 v% v" `/ X
}
9 [% |* t5 w, V5 C; t4 f else{1 S3 q6 `% T/ M# N2 I; M1 U2 r
node->next = HeadList->next;
f6 l. _& D& [( X HeadList->next=node;
* j1 t+ C% ^3 O) J1 N6 H% w }: F/ H% o# _4 J! o; ]- M
Length++;
. C$ X* L8 P% ]; l}. \, ^' M2 E7 @4 N
9 b, z) u* G3 X# d4 l, X; S& W5 M
void LinearNode::AddNodeEnd(ElemType num){ //尾插法 " @) Q6 P& h! E+ o
node = (LNode *)malloc(sizeof(LNode));
$ d* C! `( f; J" [5 p if(!node){" f; ~, O/ O1 ?8 [5 j' o
cout << "新建节点失败!" << endl;
1 v6 ]% N, o( z( q! E, D; e( y return; 6 q( T7 a7 J- U9 l+ v
} 9 J+ s! j* g/ I2 r+ k8 @" {4 c
node->data = num;
3 U! y. G" }& }8 ?7 k# d1 e! q cout << node->data <<" ";
% y6 b. u' ?* o6 ~ node->next = NULL;
7 A$ ]- X1 V; S$ V7 a EndList->next = node;- h$ M/ V/ C9 W5 W4 f
EndList = node;
x2 W" e- k5 v( `6 d* y: b& | Length++;
3 _% q4 c8 m t/ i2 H: R$ a8 Y}6 d* \) `+ G( S& J+ S% ^; x6 `
2 ~, z! A0 @8 N: J# {; N) Q
删除节点 a$ f/ {+ i5 H9 n! P* R
: i' ^, a' m5 B' `void LinearNode: eleteNode(ElemType elem){
$ I( O. I3 b N if(NULL==(HeadList->next)){8 C- H6 [" R* q1 j2 K
cout<< "无节点"<<endl;
& M$ O) ~9 i8 p4 i0 ^7 v% O return;
. D G F) p- a# m& ]5 i }
0 a: \' x2 {7 _, }7 W4 O Node_cur = HeadList;) E" c: }/ u( P( [5 s
while(NULL!=Node_cur->next){
$ B% c! I0 F* x$ C) u Node_temp = Node_cur->next; 9 }$ L8 o: t7 u9 B7 N
if(elem == Node_temp->data){
) ?" m4 d* n* h2 X Node_cur->next=Node_temp->next;
6 w; B$ l1 b6 i7 d' p$ p) I0 q9 S4 Y% A free(Node_temp);
, X) a3 e3 E$ O: @* ^6 k }
8 J/ k( s2 E) y9 h if(NULL!=Node_cur->next)
) k& S: O' U- ]7 {0 B. U Node_cur=Node_cur->next;
7 V" c; T2 A# Y2 E: ]5 A }, t* }6 v& J4 w$ n# C3 V
cout<< elem <<" 元素已删除!"<<endl; & ^! q, o1 H5 w9 Z. @
} # n7 x1 i/ K' W1 N7 `' ?9 R
5 h1 @ A" u$ ?/ D* _. o# z
显示链表- u6 N1 Y: n' ~" ?1 q4 x- z
0 a6 a+ L$ Z( k' x& k1 `0 Ovoid LinearNode::ShowLNode(){" i4 H' Q6 D/ E* }/ j
if(NULL==(HeadList->next)){
* `/ ?# X' ^" {' Z8 i ^0 ~, i" N cout<< "无节点"<<endl;
% y6 Z$ l6 S2 P9 u9 d return;
i3 f- X f1 o/ l }% [8 n- F" h& R/ F5 M. J
Node_cur = HeadList->next;
2 Z9 g* F7 A6 {2 s+ b while(NULL!=(Node_cur->next)){6 y( O9 {4 f! q: T2 _
cout<< Node_cur->data << " ";0 ], n4 K1 A w) b6 H- X7 m
Node_cur = Node_cur->next;4 J3 a6 C5 e9 `& B4 q' a
}' j$ H0 c- c6 c& l: o7 r" h0 {
cout<< Node_cur->data << " ";4 G) [ j4 G) R2 K" Q2 f
cout<<"链表中的数据已显示!!"<<endl;
8 J7 j5 L8 E# q! }. \}
6 z- {4 y4 J- J9 U) l
8 G$ a. k, y. D; v+ R销毁链表( q4 f2 b4 W& w7 r n
7 r6 ]9 z. K. I( s2 H j) avoid LinearNode: estoryLNode(){
4 V5 U9 u3 O1 S8 |% L Node_cur = HeadList->next; " p% R& w: v: n
while(NULL!=(Node_cur->next)){( C1 a4 X6 l' |) f
Node_temp = Node_cur->next;
# C Y- D) V8 s6 y$ { free(Node_cur);: G. n1 s* {! Z) m% Q7 S
Node_cur = Node_temp;# F# w# A: |; X! c9 `+ T
}, N% Y- {5 p2 A E* Z+ o
free(Node_temp);" q, `6 E& N8 e1 ~( P+ P8 J
cout << "数据节点已完全释放!"<<endl;
! E6 X+ v2 h" t: i* z7 E free(HeadList); // 释放头节点
2 A8 ^4 ^9 g. E- _8 s cout << "头节点已释放!"<<endl; M% d6 _+ D- m! T
————————————————+ o9 P) e5 U! S* C
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 b& {! \$ L) J, d, g原文链接:https://blog.csdn.net/Baimax1/article/details/1060362869 l+ J0 w- l- n0 d7 v$ Y
$ i1 U5 Q7 a7 a4 s* w
0 c# Z( k- s7 J* b; ]2 G |
zan
|