- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565542 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174885
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
7 B, f3 [8 L3 F) k9 x/ g, s: A: q2 o
线性表顺序表示、链式表示实现方法及其异同点6 E; g( H& M) f: L. P) j
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
$ k) \# Z* c* l& I; e) v- i$ }5 Y6 b! }( g* }) h
本文采用C++实现两种表示方法。
8 u. @! v* ?6 C: [1 C9 U
6 e8 J' |, ~! Z$ c* J8 H目录
8 v+ s$ f w O5 N: q; P0 v1 Z; l5 O# u8 {/ A" f6 L
顺序表示和链式表示的区别:7 _) z. t' m) i* j" _+ |/ o
5 I( O* b' Z+ S1 y7 I
创建方式:) C1 F& I7 s, y7 Q: M
# Q k$ E+ a% F: j+ B6 y
时间复杂度:) f. c ^, Q! U' g8 s5 ]
2 N) V1 ~, t6 V+ D
顺序表示和链式表示的相同点:
% u+ Y! ~, H/ e8 m
# [. z$ ^5 z+ {# m; i% W5 f删除内存空间:
4 M9 {" K& K- T9 w
! r$ M2 ], B8 O* i+ \8 I/ Q4 K代码实现: e" Y( G1 d4 w, J' C( g3 w
9 N3 `5 B8 h* a顺序表示方法:
2 c( L! p' W5 Z. P- Q, _/ J$ R) T* H& |7 R& R
结构体定义' H) U5 J' r# I" B
7 D! p/ A4 [* y& U# V; P
初始化
( F w1 b; l0 V& g; @- Q7 f0 ]( T1 T. V. g
增加元素2 `8 M9 W! c5 [9 c! w( z8 E9 K0 i
$ ?, L* S: n& B- p4 u( p# O
删除元素
' S7 Z/ q7 F$ o N: d; w1 l& p C( F$ |' d3 \
销毁列表) p& t2 f% p, L6 Z5 i
, @5 b* {! x x9 C" N! x链式表示方法; b+ ]: ?* h7 h' k, R
8 `4 W9 Z# c' |结构体定义5 W- o2 `- r. g0 a% U( f
$ f3 ?5 v$ {. e' k1 L7 m
初始化
; Z7 I' A' a$ L- U. l" A, v
( ^; w1 T+ z8 v增加节点1 @, p* o8 r8 |, Z _
' Q/ T1 B4 g7 T* ^. r删除节点
- L0 v# }4 l; E# M8 q) b
9 q \. Y% H. w% u! [9 T0 n5 U8 ^4 S$ P! @显示链表" R) b5 a1 L: B1 ^
* S5 T5 @- e; V Q0 J; J销毁链表+ f6 E6 y$ u [, z1 x
- Y" b( ~+ h! K" O0 o
顺序表示和链式表示的区别:
0 \" Q- X `( G
$ M% ?& S& k0 f7 g创建方式:6 E1 I! M3 F: M) q
& g( P9 i8 ^0 Q( p顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
$ ^: R O6 N/ Z& D M/ x6 t6 W1 n5 o% a4 A2 m2 r6 `
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)8 \8 j# j/ r8 H1 h$ m1 i( u
. B7 N/ M& \2 g
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
+ v4 G/ m8 k3 L3 p- k8 O- G. c' W* [9 \
时间复杂度:6 d9 p1 Q, N% B/ B+ u
1 {: F4 Z$ [2 ~# D1 E& ?4 l& ^2 T增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
+ w; I1 c. Y" \
8 w3 P- a3 b& O; ^' Q8 X# V增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)8 K: |2 R( _* r! w" M7 x: X9 t
: @3 `, e7 s9 t- W
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
" p) x* m, v" h1 x4 j3 _9 y
" H. |. l0 ]( f. D- T/ ]修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
" `4 t6 Q( p( c% I2 ?! z' j
) ?% ?) q" W( E! M2 M查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);/ P2 L+ j4 y: X. `3 Y
3 I& @: ~1 j4 u% O( g顺序表示和链式表示的相同点:
, M. H. S% q8 Q- c# c1 U+ C$ A
删除内存空间:' B2 p( v& ?3 l7 V2 c! W; {- h, X* S
* N! R' l+ u2 T, s& @8 Z; Z, [# [
内存空间的删除都需要对每一个存储单元单独释放空间。
3 C: T+ Q5 u2 S" q! p) t+ R
, G( {- {) U7 [* k& J2 Q代码实现:
" d+ C- @; b9 _: u
$ [) w0 f& N, j! f/ g顺序表示方法:+ J( b& w* C" o' L, R
2 P8 h$ M, R' V4 e/ t! Q结构体定义
$ n0 w* s% a9 h1 K" u
8 ]4 w2 {& T' t' M2 v8 O) Dtypedef struct {
2 z( m& H/ {5 l4 \$ n ElemType * elem;
' F1 m8 j9 ?' U) V3 I int length; // 线性表的现有长度 * q9 [# x9 S \" H+ o& M- V4 d
int listSize; // 线性表的最大长度4 I' k& ~$ Y R/ y* u& g
}SqList;3 }8 d4 ~4 P1 j, N
' r7 V% U! i1 i6 S& c4 z& l) m初始化
9 E7 i9 r- \0 P) o ~5 Z' j) ^5 N; |2 Z' E6 O0 N# a/ C
void InitList(SqList *L){
i$ {+ @; I3 x' \2 X; O L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
8 Z3 \' `7 V% c. x! ~ if(!L->elem) {* _; F: g6 P* h& w: |1 G9 \0 H
cout<<"申请空间失败!\n";
' j$ B5 y9 A! D" l DestoryList(L);. J# M$ ~1 f# U8 e/ i
}
2 J& B" R5 |+ ?- O( ] L->length = 0;
+ ?7 C0 F- j0 u0 w3 h8 m L->listSize = LIST_INIT_SIZE;
) s& e( q1 R: T5 F8 w' C cout<<"线性表初始化完成!\n";+ C `* |6 M$ V' r0 x
}
5 {) @# Z1 Z9 y0 g# `# ^2 R# u# J0 }( b: U8 o4 r2 P" b& z( A
增加元素
$ j1 s8 m. w" `, C2 x( D! n; r" G9 m4 E+ E/ q, E
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
1 @. ] i$ ~4 _. m$ p if(L->length>=L->listSize){
5 Y. m \1 E+ O/ Y$ U0 ~& b L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));$ l& Y% A& A5 x
if(!L->elem){
3 |* Q; }' Y* |8 a cout<<"增加空间失败!"<<endl;
# x3 ]3 ^5 ~- O+ y+ C4 s7 W3 l DestoryList(L);
4 E! K* o3 p0 |6 v$ G) j* z. ] }/ M7 Q+ g8 `, ]$ b: k& S; \
}
@/ @+ u% {& z3 R, Y+ @) v * (L->elem+L->length) = e;/ l, Q9 j) h* B9 p9 } |7 F+ @
L->length ++; ) e# o7 g, V& O4 w5 w) t- f" E
}
$ O3 d% T% b! E" B9 U7 X7 u. c! J( e0 _
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
( U0 M, i. `) \/ l int i;6 U$ I( Q( j8 G' L( Z
L->length++;: T# l( ~+ @5 W# x+ D8 q3 k- b
for(i=L->length;i>=e_where;i--){9 G6 `8 G- W! M6 C
if(L->length>L->listSize){2 l$ M) m8 K# I% m
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
6 _# M1 }( Q" B- `! \ if(!L->elem){
5 r% }6 l9 b9 {8 s7 A. `# K, a) i cout<<"增加空间失败!"<<endl;6 Q+ j$ {4 x+ ?7 E$ Z! b
DestoryList(L);
! i% Q) v( M0 o2 m }0 E1 i/ S4 B# v o1 E8 I# [
}
7 L5 K4 y W! c* z6 L i *(L->elem+i+1) = *(L->elem+i);
# O( {8 x7 }2 n' I+ N' ^ }- W( F6 @7 d0 {7 `2 J- Q
*(L->elem+e_where)=e;/ K/ X: q5 a' N `8 f* Z
cout<<"增加后的线性表如下:"<<endl; ! o% Z* A$ q: V Q9 y
ListShow(L);
. _/ x" a, b& |* P9 |} : |& c+ i/ I3 |7 b- _
6 F) L. |: M9 ~& ?: N. ^4 S' M
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素: f* _; N! ] j
int i;: Z4 @5 C9 [( W
L->length++;
$ T; m' C2 q( G( ?6 Y7 F3 V for(i=L->length;i>e_where;i--){6 @. O% i. x6 |; d# Y; }9 L
if(L->length>L->listSize){
$ Z2 D n! F( M L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
/ K9 p( A+ h: s; M$ i2 j0 \ if(!L->elem){
, Y9 B4 Q5 K% X8 Z# L1 x5 P! Q cout<<"增加空间失败!"<<endl;
7 Z$ V! \! \2 ~+ Z2 m+ P3 B DestoryList(L);
7 N" o4 n# D4 }4 a$ D: y: Z }- w( ?/ N9 O5 F+ R; v! b; P# {
}
% k0 n5 @' x" k6 [+ W$ z6 {9 O4 ]% j( d9 L *(L->elem+i+1) = *(L->elem+i);
; I$ w1 o) j3 [% b% U9 j& H }% l8 C# P1 L" \8 k
*(L->elem+e_where+1)=e;3 a, t' B, U9 V0 f: n/ F
cout<<"增加后的线性表如下:"<<endl; & Q) K1 j( ]4 r7 T) A" k# T
ListShow(L);
- {& D% P" ]* \6 ^" H; x3 J}
" I' `1 \+ c5 R
" @- b' s+ H6 s! Y j" u- I4 @7 S删除元素
8 l) r+ F/ V1 ^" Y
3 P2 V6 g* E7 q5 t1 G2 ~9 ]8 lvoid ListDelete(SqList *L, int e_where){ //删除某位置元素
( Z3 }5 F* H/ T L->length--;
) _$ ^, {* ]% Y; q for(int i=e_where;i<=L->length;i++){
2 x+ D0 b: y" h/ W; X *(L->elem+i-1)=*(L->elem+i);/ u! U% c0 g! D! C8 Y: A
}
9 Z a/ B1 r, C. s- ^: [/ S2 E cout<<"删除后的线性表如下:"<<endl; + ]. w' h7 Z# N6 @9 U H6 X
ListShow(L);
6 E1 a% Z4 i; s9 A4 y' R}) X) Q# L0 z9 T# m* ^. I& I0 G) r
2 g/ Y! Z2 [# F0 r销毁列表
\4 _, X( r$ O/ g6 @5 q t: K- o4 r- p) ]2 f1 a- J7 K
void DestoryList(SqList *L){* C `! g7 S& k. u5 a& ^' w/ W
int i=0;
% W0 m4 j( I1 R* N' W- p1 p. p6 ^ for(i=0;i<L->listSize;i++){/ H, i1 z6 d9 _) }1 |
free(L->elem);6 L A7 d9 ~: U! x# p
L->elem++;1 x3 n" H+ @' X, l4 F6 ~" c
}5 @7 s, }6 \) q/ Z
exit(0);
+ \* b# s# i" B}
# m" l4 v L9 s# J* y2 `; K6 X0 s
8 ?) l) ?9 W! z) L链式表示方法! Z$ S( K2 y" b: j, X! w H
* M2 e, Q! s. }7 t
结构体定义4 j7 X. y j& k/ f- M( T& ]: {
3 ?: A1 |( N$ _3 K. Y( d, N3 Etypedef struct L_Node{
+ C1 T. S' I3 ` ElemType data;8 L- O ]6 n( m) q8 u$ r: n' q
struct L_Node *next;
h ~* g! L$ ]- \. C3 q+ K! L1 S. U //struct L_Node *last; //增加可变成双向节点
% F# o c/ I/ O}LNode;. ]+ f! [* S% L8 y0 C$ B$ n% C
( Q; O, }- | W' ?2 ^初始化
% s' o3 K* `6 c- a4 P5 B3 Q9 m0 X6 y0 h- \/ A
void LinearNode::InitLNode(){
1 R/ W Z+ M1 @; C0 C( c HeadList = (LNode *)malloc(sizeof(LNode));
' s1 t2 ]' L, v5 o if(!HeadList){+ d3 @% v6 I. k* r3 f: k
cout << "初始化链表失败!" << endl; I4 V' H/ F1 G- K9 ]8 f
exit(0); ; Z6 @# {% s, h% \" _% l$ ^# J* B
}
' U# { Q7 O, N; P9 a EndList=HeadList;
2 {. x, {% f' M3 R+ d HeadList->next = NULL;4 g# X* j$ g; ^& Z, B9 s- O
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;9 E4 |, T3 `5 B, Z1 _! {6 b2 t
Length = 0;/ k5 o: _! o- [, w3 e6 g0 H
e_where= 0;/ N! f' O4 o7 A! Y) ^
}
+ ]9 |+ R- c2 _$ c- y# m: a. v
# J8 @! h( x& c1 ~0 [+ w增加节点
8 O. ?1 T- F- m2 S/ L9 M3 a" f- H$ r" M) P4 o
void LinearNode::AddNodeHead(ElemType num){ //头插法
; G; F3 J/ Q+ k n5 t node = (LNode *)malloc(sizeof(LNode));* J/ i0 x8 u& g P' l
if(!node){
4 r5 O6 g3 {8 G; }5 l0 A8 E cout << "新建节点失败!" << endl; - t, f- [& G+ A: b) `* N
return;
* t/ Q, F: k9 U4 D8 [ } Q+ s" L- W7 ^: H
node->data = num;) Y% b( Q( R |* t- m' D
cout << node->data <<" ";
% B1 {! V+ l0 M6 v) _" ` if(NULL==HeadList->next){/ b' J# { F: T+ t+ I4 i1 k& Q" @4 H
node->next = NULL;
7 A: A0 K) M! p HeadList->next = node;
( ?3 J2 I9 E n! c EndList=node;
! R, C; T! m6 e, h/ M8 M }
8 e& r1 J. \1 ~. U+ G" ? else{
5 a9 n m7 `# K. H. A+ {7 A node->next = HeadList->next;) K9 W0 w! C& Y8 ^! j
HeadList->next=node;- u1 h2 l- I0 }# d
}
6 @+ g1 L6 V+ O4 C6 g% K Length++; ; c& p8 @7 i: |0 M" z% m; Y7 k
}/ W. N" f" z4 E
; [8 w/ R8 a( Y, ?9 Y
void LinearNode::AddNodeEnd(ElemType num){ //尾插法
' I. R) o3 W: u$ w( S5 F node = (LNode *)malloc(sizeof(LNode));9 F/ S- |9 z6 r
if(!node){: K. R; }! h l l
cout << "新建节点失败!" << endl; 9 m& a/ t( N; `! w, e9 b
return;
. J9 q8 f4 W$ j, l9 [$ k& s }
% T' s/ l' @2 t1 t; C2 K. V5 Y node->data = num;
( V) X1 f2 X1 L, i cout << node->data <<" ";
% V# D4 o5 F. P* e0 @% F3 [: F node->next = NULL;
0 B% J. K9 j' a" h' ~ EndList->next = node;
2 ~4 E4 s# F% D5 ~. U EndList = node;& q9 g6 J5 T* g' Q3 G
Length++;
1 O3 G$ Q! R* f: D/ g; K: t}
0 m ]" B- ? g) r
S2 w6 q# z- }( n& B9 C删除节点; n8 I' T# w1 t3 T t/ m
l1 c( `1 v% u+ V% \9 A6 l( j# L
void LinearNode: eleteNode(ElemType elem){
2 L+ ]; C2 Z* N% J* K( O* C: y if(NULL==(HeadList->next)){6 I% x. _1 P7 v, G; G
cout<< "无节点"<<endl;
: ]+ S4 A, S% M8 h9 ?, n& z return; 0 Z2 u0 g( ?. W$ R( [1 }) i# }5 s
}
# q7 ?$ N, g) [. @ Node_cur = HeadList;& a2 Y5 Y; ?1 [5 Z/ L
while(NULL!=Node_cur->next){% V0 l8 V- F& Z8 M3 s+ f
Node_temp = Node_cur->next;
+ ?4 k4 W2 x; j7 T5 k9 e if(elem == Node_temp->data){
0 t0 q$ u; n5 ?! B6 J# Z Node_cur->next=Node_temp->next;4 m, C: m' }( _4 j/ c Y- _
free(Node_temp);0 g3 |4 Q/ z2 _8 h$ {* O
}
5 W# j- P) f" l% v1 m if(NULL!=Node_cur->next)
2 N# F: d0 {; @3 u! ?: e Node_cur=Node_cur->next;) q4 N8 S5 C8 i# w
}
6 M- `" l* C5 C$ v+ t3 R cout<< elem <<" 元素已删除!"<<endl;
' V: ~- ^" M% m" C! z}
, v. i- c+ S8 k$ h- t7 y6 x0 L" O7 O4 M6 }- j D
显示链表) L7 o8 @+ u5 g8 q
* X# U* z/ @: R8 P+ [9 B' Mvoid LinearNode::ShowLNode(){
0 m" o0 m. H4 I) D" ?3 l if(NULL==(HeadList->next)){
2 N+ u5 S+ w& c/ d) _/ b w& Y- k cout<< "无节点"<<endl;
0 W# m# d P% u9 I0 A+ q return;
' N! q" c2 |0 P" @ }
& G! ~. G& W$ @4 L5 E# R/ V) E Node_cur = HeadList->next;
1 k) ~4 J# `1 K- b while(NULL!=(Node_cur->next)){
" `7 \1 G3 z3 i! o5 M$ v9 Q cout<< Node_cur->data << " ";
5 n/ U" `! u* e/ r7 N Node_cur = Node_cur->next;8 N- ^ }3 q: l0 A( ]" X
}
; ?1 |, g; C2 G cout<< Node_cur->data << " ";
7 n: `* v6 b7 g8 s" e cout<<"链表中的数据已显示!!"<<endl;
. X# }2 ?6 F2 Y0 Z* T+ V}
2 E5 u/ O# Z0 L8 A2 g+ F- x$ V0 p- q4 j! f5 }
销毁链表/ v9 j2 t( Z2 R
9 n, e# v4 s0 D7 d1 w/ d2 y2 o+ yvoid LinearNode: estoryLNode(){
! j8 ~$ T5 Y3 ^& X; B B0 b& a# R4 W Node_cur = HeadList->next; 1 O! t J4 J+ y1 k3 H) I7 P
while(NULL!=(Node_cur->next)){2 i% _/ l) a R1 q
Node_temp = Node_cur->next;0 S! |! g w2 ^0 e6 } J1 q
free(Node_cur);$ \; ?2 V L. u8 `: ]
Node_cur = Node_temp;0 R# O! b) H, B* q
}
( S/ z1 w3 P! W8 _ free(Node_temp);& V Y) R e) j$ E: Y7 j( j% V
cout << "数据节点已完全释放!"<<endl;
% J7 f8 f8 O& M2 `, x free(HeadList); // 释放头节点
' T( S/ |3 `' @ cout << "头节点已释放!"<<endl;
# G, E+ R1 R1 i+ @# m: J. ~————————————————
3 ^3 ^6 A, H7 k2 v版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: U# `0 {2 B' V. |- R
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
# \& U I9 [0 o7 V5 C7 J2 X' C* \' s# Q
\2 \. y* c) Y2 a) \
|
zan
|