- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563431 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174252
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
; h. F. k+ d6 m2 @
线性表顺序表示、链式表示实现方法及其异同点% _4 m' {3 H7 G, ]5 }! y
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。6 ~1 b, T \6 G
+ Z( X0 m1 R$ l! W9 S本文采用C++实现两种表示方法。
6 Z4 p3 `% i4 H. W4 A% Z+ _+ T3 x1 ~- `1 I* y f
目录4 v6 d8 n! D3 f% \; n# ~" N2 d
8 f2 g Y/ U4 K顺序表示和链式表示的区别:9 G. n! K, x5 P! R, c1 n
1 K% |- k+ L7 u x2 k0 ~$ g9 z* A
创建方式:* B: C( b, M/ ~& ^/ s" M2 ?
* B+ m2 F/ ?( ^/ ~- k! Q B时间复杂度:/ m5 ^" U7 }/ l0 ~
; `$ P9 u8 J* ^, S9 J( M# D顺序表示和链式表示的相同点:
: }9 m7 |& H b6 o/ t' }' V
# r- ?- K, N8 R5 z8 \; @# B删除内存空间:2 F! i. ]" m" [
8 [# b6 D$ k, D& _% f' {6 A8 Y
代码实现:
2 G+ m* D7 g3 n; f3 M" t v% z$ c% H9 {. J X. q2 L
顺序表示方法:
8 V6 W0 J: W- \: U- ]% J/ n& @ c
结构体定义+ V6 }# Z/ }1 J4 k4 E
+ |2 b8 [# m- U# V
初始化
Z: W1 q8 j8 o# Q F9 s; c0 k0 x! F! Z8 ^
增加元素
: v+ q% P& n' e% v1 Y; y! n9 {
7 L. a- x( |$ A删除元素1 v. u/ z. m6 y5 t ^! A
, p8 z5 ^1 C: i/ Q销毁列表
5 s8 r5 P; ]& Y. w/ ^% k. a. B8 Z4 m4 @, ^
链式表示方法. R9 {* ^' @! R) q
5 `" D y( _3 Y& Y' l* T, p
结构体定义. M, I% s. v2 X/ J5 ?
3 s1 g: _; k/ [# T/ f& }5 ~8 h x
初始化
3 d8 X8 c" f+ w% Q1 B$ Z
2 s5 T4 g6 K/ t; T增加节点$ e; H+ p h. x" z [. y
6 g* T2 e# u% m, o- Z/ v6 q2 z7 D删除节点
7 v0 Q9 h( y/ q$ A# K. ` P7 M$ J
显示链表
2 E7 p2 B* p {- x. c1 W/ D
, F# r, z; @5 V销毁链表
0 z4 J) c8 i8 K9 i3 |( A* |/ ~- H/ p6 s' \
顺序表示和链式表示的区别:
3 ?5 j6 U% U% d) I2 m$ c: C2 g5 {8 a
创建方式:
3 E C% Q# E$ ^
! f1 q2 _$ Z" d- H8 j顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
. N" y$ ~7 h- b4 V4 I3 ^. J1 u* v/ u3 R" t5 k) s. i
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
+ m8 u7 \# v8 E: `% }3 ?1 k/ N/ s5 D: {6 G) \: g0 Z
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
# d L, x& ~& {, E- D9 x& {3 r, A/ {+ w- C" g9 X4 V
时间复杂度:
& l! v$ G+ v( L3 c( E3 ?1 F8 d
: h/ |- x) T; }$ E, l4 X) H增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作); f+ Z; Q( K5 F" q0 W) U" x$ F
. _+ Y3 u; c4 W6 M; _, D2 ~7 ~增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)$ x4 ]. c- a% X4 `: K* H/ [2 p
" V* P4 p" U- y9 c) E+ a- m8 K
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。, Y8 q7 N/ C9 N! P! }: G+ X1 ^
: [ K4 t" q- W" M7 P2 i+ y& B修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);4 [7 q+ \" A4 F$ {4 o
$ N/ A* n" a8 x9 @2 M
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
$ R, @) I, c: P2 H: f7 [$ \
0 h* O; h" I; f: g( c$ w顺序表示和链式表示的相同点:; A! C- K( k, P- {5 Q0 H
' D" n% K# Q. G1 c
删除内存空间:% i; N" U; Q0 M, ?* A
$ m" ~! r/ G' @- }内存空间的删除都需要对每一个存储单元单独释放空间。" Y3 M. f! W, |, d
4 b0 j9 t. D! E, U# ~# ?# k- s
代码实现:
% H* c9 ?' _4 l. N; S, a. {
6 f+ N7 J$ j, j% w9 U1 c顺序表示方法:
* w$ @3 g% Y! j& Z9 N, h' k( Q# `+ e* l3 x2 ?4 L
结构体定义
$ x8 |) F) `. H& M" @" X7 R w6 p6 K% A8 H2 v- L+ E$ o
typedef struct {
9 T& Q) |0 @& @7 z( q ElemType * elem;
. h# m( l1 t" l0 ^5 W7 _ int length; // 线性表的现有长度 & p2 p; b8 F: M+ i4 ~+ U, C4 {
int listSize; // 线性表的最大长度' e, V- Z, e6 f- O8 Q/ d0 s9 S: V: b
}SqList;
/ V, b; {3 j# }) t( S) O& E: |/ M5 ~. C4 a, `) T2 g, X% p+ j
初始化" _( a# I( u# |$ B
! [, E S2 l4 ^) z# D; T
void InitList(SqList *L){/ N6 M6 U5 m( L; U L
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
$ t# ^% g% {' Y' |9 c if(!L->elem) {" V1 e' r+ ^9 Y7 z% \# J
cout<<"申请空间失败!\n";; ]4 b# c! v9 Q) B, q
DestoryList(L);
& x# d* y; X, N$ Q! D4 x }( v1 {2 @! L( J% x. J/ x
L->length = 0;! f3 A6 P+ M; B* f x
L->listSize = LIST_INIT_SIZE;
; w% m; s! E+ S- y cout<<"线性表初始化完成!\n";
$ D* K6 _7 s: G}
6 Q/ O. v8 m3 S8 k# \6 M% S# f
/ W" }+ A5 \: H5 @2 E% W, s增加元素
. }7 a% h' J- F( y) w7 E
8 B) `2 O) @- |* r$ Dvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素: o9 Z) `0 b2 A7 p
if(L->length>=L->listSize){
- @' X" K& f2 o L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
+ K' A% M9 ]! o1 } if(!L->elem){$ Y# x/ a9 q0 G
cout<<"增加空间失败!"<<endl;4 O2 |9 }2 D4 v+ z" W! p3 [
DestoryList(L);
B$ T& j9 U3 E+ u3 x$ c }1 Q+ e3 ]) a! G( r
}1 U! [& w- L8 m) Y
* (L->elem+L->length) = e;
1 t6 S+ l9 _3 }( n; c4 F. Y L->length ++; ) Z7 k9 b* x, e% r
}9 \4 a0 [! ]+ o* X, y
+ y1 W' H$ V0 f/ xvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素- x" i# E8 s' B. ]: Y3 K# D
int i;
1 J$ a1 @; @$ w8 V% x8 p3 X9 D L->length++;
7 [- n# i7 c) j* d for(i=L->length;i>=e_where;i--){
5 _% F9 ], ?& H, \, C, b+ ~ if(L->length>L->listSize){ G) e0 q8 {% Y) o' h# A# f1 F7 Q
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
+ I+ L9 J: E# P: G( h W7 X if(!L->elem){; ^ S7 [3 ~6 j
cout<<"增加空间失败!"<<endl;
% `4 P% C6 v- ~0 ~: G DestoryList(L); * I1 ~# a8 h9 O: Z
}
0 G; o2 Q+ V' t; L }" c- q6 \" s% b; i
*(L->elem+i+1) = *(L->elem+i); . ?, y! d( \" J- ]6 t* t
}
8 F5 W; S$ p4 A+ [! |4 L7 A *(L->elem+e_where)=e;
9 m; F* ?; h/ ^6 C cout<<"增加后的线性表如下:"<<endl; % X% v/ P6 O" j) I0 s
ListShow(L);6 P- B0 \! }% L
}
- a; z7 \, f( v/ R9 B" q2 Y
2 L+ E: k! q8 Y( ?void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素- _& M* Q/ s: Z! n/ `& C# `
int i;
# ~* @' u8 t# b+ L! m0 B! A2 u: ]7 ] L->length++;# y/ Y9 v; P; |& D) X
for(i=L->length;i>e_where;i--){& G# T9 ~6 N2 d+ ?( L2 g% B
if(L->length>L->listSize){2 k* g9 d0 X8 X2 e9 U$ o" \/ G
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
" A8 }* J8 M& \# D+ W if(!L->elem){
$ W4 @+ H/ U% \% h4 V" h5 ^, z' c cout<<"增加空间失败!"<<endl;
; ?4 W; G' s- H. _% P/ M7 E DestoryList(L);
5 X* v, g3 {5 l }
& d$ x" R4 F- Y6 \7 C& E }) V+ f1 S. \7 J! i& j
*(L->elem+i+1) = *(L->elem+i);
9 p7 V+ X! o T- ^; }: h* y }
7 |# v7 e m7 v) ~ *(L->elem+e_where+1)=e;
Y5 o+ {( L- N2 W- ? cout<<"增加后的线性表如下:"<<endl;
% T, @( r5 Y- d8 ~1 `# v+ X ListShow(L);
& ^1 Y. ]% W' P6 R}
Z1 b! V E; m% c) C/ h; r% q( q, O
删除元素
& p7 o6 }1 J. ]. S. A$ \. o( |9 B" E
void ListDelete(SqList *L, int e_where){ //删除某位置元素 + m! I: K; k$ r5 p. M0 G( p8 ~
L->length--;
5 V: J6 b- T7 M for(int i=e_where;i<=L->length;i++){8 P, {3 y& F, @( T, ~: x" O: q; _
*(L->elem+i-1)=*(L->elem+i);0 i0 a5 l9 X, i: u, e1 h2 d' \& Y
}6 n. o- ~+ h& Q x/ O) `
cout<<"删除后的线性表如下:"<<endl;
7 A# V0 m' @5 X* U: H' u/ `( Q% ? ListShow(L);
2 @! n9 t1 z- M}
. a \; l" g+ ]
$ r4 I( m$ U) S8 E' r销毁列表. G) M5 \- ^% m6 O; K
/ c7 b/ s8 Y' O% pvoid DestoryList(SqList *L){3 v( ^0 r9 v$ `# F8 G
int i=0; ^) H: ^/ a; U& ]
for(i=0;i<L->listSize;i++){# v+ l& c m: W( |+ z9 z
free(L->elem);" q( G5 @, k+ a$ g
L->elem++;" d" [- H! s2 n h
}
$ F g. o C" C3 G exit(0);
! s0 ~3 K. }) r# D5 n) d}
+ c4 p( b7 _/ N. F& {% G
- E* r9 E' ]- k% [5 H链式表示方法 Y( }0 i2 [9 `
) `; ~% ], ]& n
结构体定义" [1 F: Z5 [; B0 y7 W* }. C
9 S* N( A- s' e
typedef struct L_Node{1 m- i# V( M: T+ E$ h$ ~5 M( N, S
ElemType data;
. p& j0 s- w: R/ O6 \ struct L_Node *next;
. B% L4 }% R/ [5 X //struct L_Node *last; //增加可变成双向节点
3 O& h/ s4 c& [$ L! W. _5 X}LNode;
4 P* r/ x' {, k1 |5 S; s) J& ^$ F C1 p% |4 T0 S6 V; i! c3 ^+ \: [, {
初始化7 {: H; U3 \0 \' h1 R
% ]/ _: `3 }- X* I, V* z4 |4 A
void LinearNode::InitLNode(){6 Q# }2 i+ g2 t. \
HeadList = (LNode *)malloc(sizeof(LNode));
) p h: h0 D6 `( F: s, t+ R$ u8 z if(!HeadList){) k0 { W: X n" [/ [
cout << "初始化链表失败!" << endl;
$ s) d; ?8 A$ G exit(0);
" f; G) w8 o1 I* C% Q1 A1 H3 z }
0 A6 \5 b$ D* R4 s- j+ V [0 G EndList=HeadList;' }4 N8 \9 f4 [5 _1 r5 _) N
HeadList->next = NULL;' E) O* M! P+ Q: C( t! S$ h
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
" c4 f2 Y, V: f+ p Length = 0;/ w* w) A: p9 Q4 N% {6 {$ [+ W+ }$ F
e_where= 0;4 v2 J5 y% C7 K$ \8 K; b- t& z. [0 R/ ]2 d
}
4 j8 ?* o6 M3 p; k+ b* y
; q" H+ i( {, [% A: N增加节点% m) i& R$ C- B6 E' ^
, V& B3 B- a) N6 A3 t& K# }9 z/ Kvoid LinearNode::AddNodeHead(ElemType num){ //头插法 - |1 b, j9 g) b( S; Z3 @
node = (LNode *)malloc(sizeof(LNode));. v# w# j: {- ]
if(!node){
0 b0 X% Y/ ^; Q/ w* e5 N' g7 [ cout << "新建节点失败!" << endl; ' c+ e2 @3 x* r" \$ ?5 d, O
return;
1 k2 u; k9 a( w } ! W9 ~' e0 |1 O! h0 o) a' Y
node->data = num;
) o7 F6 x; h A: o& }( ] cout << node->data <<" ";
/ i Y7 ~9 `: W% v+ o+ H if(NULL==HeadList->next){
8 B% ]1 v9 N$ _ node->next = NULL;! \4 G( z8 ]8 u( M
HeadList->next = node;
/ ^( Z! `2 P! O8 @! g1 H( s- x EndList=node;
' k" P3 i7 g7 ?% E; v }- p( A7 J! o) Q$ b( M3 M& v
else{
7 P1 T$ k- t3 x( y+ T4 j' s/ S, S3 {, W node->next = HeadList->next;
$ r% I/ Y5 l, E HeadList->next=node;+ {+ F$ F4 i! w+ ]4 L. U
}
( X. V5 g5 E. E6 f1 D# U! N Length++; # N; v# A3 i3 R9 m; r/ P5 A- n
}$ \$ T* O0 F) `" | u$ P
1 d O+ B3 [6 G6 T( t
void LinearNode::AddNodeEnd(ElemType num){ //尾插法
2 g; } r0 S7 P- n) \ node = (LNode *)malloc(sizeof(LNode));7 p: d* V: S1 p' Z
if(!node){- c% {9 G" g4 f1 P( U* l
cout << "新建节点失败!" << endl; / _4 T( W% R. j! z- E+ v# m
return;
5 r1 g- j* |. O } 8 @; H6 e3 ~5 i
node->data = num;
) g- c8 ]8 w! v/ s cout << node->data <<" ";9 ?+ r5 K+ `' _3 W$ ]% N2 W) i
node->next = NULL;
v/ }$ ?# M/ U& c- F$ o$ z0 }7 { EndList->next = node;
8 z& y; ?; N2 \6 E1 P& B# V4 P EndList = node;
/ M4 }3 l/ t+ T# B; W" g( U Length++;
: I: U: k% L& {, K% c}
8 c7 d. C7 ]; H1 @7 d- a6 p" L$ ^- p1 f( B7 n6 e; a5 E/ G
删除节点
A$ W3 y* W+ M( Q( Q
& n5 O9 d9 G# b% ]% H/ V9 @+ tvoid LinearNode: eleteNode(ElemType elem){. }8 z, _1 F, c- x9 `) E% `
if(NULL==(HeadList->next)){
7 q3 _8 V, i5 ?! u cout<< "无节点"<<endl;
: C6 [6 d! g* `- n& ^ return; & J0 v, {# o# ?
} r. a5 A& K" x
Node_cur = HeadList;
5 G! a( A$ w3 R$ R while(NULL!=Node_cur->next){
+ I8 R, M1 O# T+ S Node_temp = Node_cur->next; & T, v4 V- Q& x
if(elem == Node_temp->data){
/ k; T5 P3 T0 t" I/ W R Node_cur->next=Node_temp->next;: H1 h. U+ n2 o" m& q8 A9 {" }
free(Node_temp);
: q+ a! T* j: b& n. @9 X }
$ k# C5 s" {& p7 ~' T, J if(NULL!=Node_cur->next)/ a3 o, n4 t+ o! h; ? j
Node_cur=Node_cur->next;
~$ r- P* `' p }
4 V9 [ p3 j) B cout<< elem <<" 元素已删除!"<<endl; 4 m# Q0 z* {- U) Y+ O: F
} 4 I, ~ h5 n# z$ o Y
$ t, H) }$ ?: b- [8 `9 b显示链表, k: _5 M; v, V& m
7 N% F3 Z; I+ I; M `8 ~! \
void LinearNode::ShowLNode(){
x+ l4 b' v$ s# g! A* s! b, h if(NULL==(HeadList->next)){" F1 C" W( _; ]* U; W7 Z) |8 m
cout<< "无节点"<<endl;+ q, @/ t9 _( B4 S
return;
! m f: c2 Q/ p; P) R }
' G5 B, z; k9 D Node_cur = HeadList->next;
7 [2 e# D7 S' D while(NULL!=(Node_cur->next)){
; h- x& L& C( U/ p- l cout<< Node_cur->data << " ";
/ y. Q! m0 @* b, |5 x. t Node_cur = Node_cur->next;
* P% F' t8 Z* @% v" R }
2 c7 [/ k, F/ a5 |& ^ cout<< Node_cur->data << " ";
6 g% I J5 Q/ L: D5 \ cout<<"链表中的数据已显示!!"<<endl;
9 \; s- d1 W7 L}* b4 u: n: i7 @2 O- s% {/ M; }/ G- s% m
. m- F+ c" D; a9 v# {; ~' y销毁链表
) G$ Y8 d) u1 s
4 s0 G) H8 H, H5 u+ Zvoid LinearNode: estoryLNode(){. T& ^7 Y+ i! C- S: T
Node_cur = HeadList->next;
2 o& T: p5 O. h while(NULL!=(Node_cur->next)){
' E1 K0 T0 ~' O& S9 k" o$ z6 d+ k Node_temp = Node_cur->next;
' U% f- h/ B; M% {0 ? free(Node_cur);) r& |9 q3 |2 Z; a2 B( ~. k
Node_cur = Node_temp;
% A% d; m( U7 z }
; E, @1 H! Q! a. H free(Node_temp);
4 P: M/ _3 r! S& d cout << "数据节点已完全释放!"<<endl;
2 q+ ~! ^/ Y" m6 q: M2 u free(HeadList); // 释放头节点 7 X5 Y+ v. G- g3 S* R+ m
cout << "头节点已释放!"<<endl; # p1 b H# r" b) X4 [" z; t2 U
————————————————
) l" k2 C( z+ s7 z$ x6 ?: Q6 S5 k版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) E- [/ i1 z0 s2 Y$ L
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286. \! @3 K, \$ A, r* I
% N: O, I2 U' i w$ J2 o7 s+ b) F7 T" [5 W
|
zan
|