- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558700 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172983
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
5 ] n+ F9 L. h# ^- e
线性表顺序表示、链式表示实现方法及其异同点# }9 H0 `/ |+ l! O! b
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
; r$ K; Y/ B. G! N P6 _- ^: C9 C9 ~
本文采用C++实现两种表示方法。
& Z3 w& W# F6 z) U- K% a: M) n3 t; v: w+ C2 z& P" s" ^% w, O
目录& Z7 f- P- Z& n
% r2 p( Z' Q: B$ B6 o7 f
顺序表示和链式表示的区别:
" w, z) j" N4 V1 @( u; R
! L! a9 [9 ~4 a6 Z- t# X& a9 {创建方式:
- u. e& T8 S" v5 D F2 ]- `& _5 ^; e& q
时间复杂度:& t9 R9 T7 p$ X
* M9 ~4 j' g; f3 n8 @: U& y
顺序表示和链式表示的相同点:
+ L% Y- N3 E4 o1 m' C" N: p6 F/ z1 V" j% O) B
删除内存空间:9 {. G' G" V0 b/ \) p5 ?' o
/ i2 o( h0 _2 T y$ Q
代码实现:' [3 |# V& j9 x) J9 W
4 R/ X! D9 m) b9 {3 {顺序表示方法:
. y& E) x+ q' \$ w, M, h, ^2 v5 H( c
结构体定义
0 d p. S# @8 s" v1 ~% w& B7 o
! |2 c2 |6 m5 W% u0 [* s; z# `7 h7 N初始化3 {5 S+ @/ f# _( g% S
9 e* z6 |# h, }" ?# v增加元素
8 F% ^1 r7 i1 T* J% X" Q8 H. |" G6 j# h2 r# a, K
删除元素
* R5 M9 C; s5 k5 o/ ?5 _/ D+ n% |" X' S
销毁列表
0 v7 n0 n g6 j: L2 s) T) y4 E% a8 K# d5 ~; d* J
链式表示方法7 A! G, p; b3 Q. T& L6 S' y
8 e2 u5 {: x7 r( D, m1 H
结构体定义; c# @3 j6 U- z( E( h
2 T. |; O! b, |9 z
初始化8 G' `' }: n4 Q3 a
# Z5 [6 P+ e5 H% g) q9 a; T增加节点
4 P, O9 b: w1 `/ Z: z" C! ^, M# |
% m" H% i7 I; q# Z. ?( G! v删除节点0 H, m# |* B7 W# Q9 \( [1 _
( @) Y$ R) ?# W; Q1 ?* y" R
显示链表' E& ]8 ^* K: }- W' b9 g& b9 }
- y/ B$ I: k( t6 {( V销毁链表
( x) U C- ]! M; n) x, j6 D | I# G) `- j# f, F' F
顺序表示和链式表示的区别:
1 r2 i8 I+ Z' U1 U, d1 `2 b! ?# H* s7 U9 [/ h. O
创建方式:1 T- q- r7 f4 C% E- ]6 p- @
" m- p( m; p+ P- [' W
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。/ `+ Y* d1 ~5 I$ [2 ?/ ^, ^/ I
6 K$ S, A0 O$ r(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
- v) n B3 e2 L: t# K: u9 f4 y( |* q2 y! h$ E
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。& q, m% K6 K4 m2 t$ v
* q% }9 }; L& b& z& L时间复杂度:- }0 k9 y) _- {! \% B, }7 L
* T) d8 E/ M* c9 Z5 ?0 } X
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
% j+ b* Z( ~( F3 C9 c+ H
* Q' S/ F# ]/ h增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)3 Z, \* Y% _+ y \$ J3 k
: m0 q: g% o4 b# TPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。% R1 z9 f9 O. q" l; L3 K
. D5 k$ ^6 B1 o修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);# l9 q4 }# Y; l1 q& w7 c
$ o; Z3 b2 N ~& c$ v查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);6 d, T7 z# [9 b- t9 [
$ W+ d/ e# U2 U3 |) h# l3 ]) F/ J
顺序表示和链式表示的相同点:* K, J7 w! Z7 b0 [& K! v! K
$ `. f" s$ l4 K% a; ?) J/ i" G
删除内存空间:
( M/ t& {' y; Z' ]+ p
7 X. ~( j$ |; {内存空间的删除都需要对每一个存储单元单独释放空间。
( k8 I3 W: ?$ H& U
. |$ }# t. f3 T代码实现:1 o5 s( O& S- k' T3 }& Q# i
. z8 E% j* W* q' l) w
顺序表示方法:
; ]( v7 [& n8 A
& U$ J. _# u0 }# ]结构体定义
/ ]8 d& x/ Y! D8 u0 P7 {% p4 R7 P, W9 l- ]9 y& l7 K% |6 ~# k
typedef struct {1 y8 c) S* V0 g
ElemType * elem;! j, K7 m: F! s! g
int length; // 线性表的现有长度 2 R S+ v, P8 O5 c3 s
int listSize; // 线性表的最大长度" q- p+ N$ L% ? u2 c7 J
}SqList;0 u9 k9 u# `, v8 z
! b9 _1 z9 u; Q& X
初始化
) d& ^% F |4 a2 Q1 e: ?/ o
9 o4 J8 Y7 ]! f' ^( m$ m, A) e+ Ivoid InitList(SqList *L){
$ d- Q3 O& g8 s L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
- ]/ b& |1 P8 z2 j1 g& J9 A! g if(!L->elem) {
" J2 t. F# a0 N) P6 z cout<<"申请空间失败!\n";
/ q8 w7 V s1 ~4 N DestoryList(L);6 z: h) W1 r5 f9 ~; P9 Q/ C
}
" Z h+ \* ?, A# i: t( j L->length = 0;
" D* W1 O( N7 S) O7 J8 u* l/ A L->listSize = LIST_INIT_SIZE;
, H7 U. c0 ^: ?* _5 o cout<<"线性表初始化完成!\n";
9 E; I1 ^; |" P+ i Z/ n) m}
" Q0 W6 a# Q1 X6 {
; z0 |7 f7 K* J3 P( X5 [& h增加元素
2 ]+ X% q$ j; g9 b/ e2 s8 X8 s4 y5 A* |: w- z
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
4 Q4 z+ R! l4 S' O if(L->length>=L->listSize){6 {3 o1 M/ e1 T
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));; [" z9 o0 X; a% @! C2 c
if(!L->elem){7 L+ I6 W( l. V& @
cout<<"增加空间失败!"<<endl;
8 u' v+ Y* _: L5 H8 j DestoryList(L);( E. ^- Z1 _7 D8 ~/ ?
}
; e ^. a- u0 S9 R! ?. E }" }6 b8 E" w9 I5 b' T0 @
* (L->elem+L->length) = e;
2 d+ \9 ]- v8 p1 `/ w L->length ++; # Y3 h( S3 z3 I5 T, `3 w
}
7 d# @* e$ T2 n. F, H5 N! M8 b1 J4 E
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
2 B5 _- Y2 h' Q9 J int i;, f$ U& ]0 {/ n$ v0 j4 G
L->length++;
4 y' m( ^9 ?% C* n for(i=L->length;i>=e_where;i--){
$ y+ e& f2 z0 D$ y if(L->length>L->listSize){( S7 U) L& ]1 E7 b
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));3 |) t5 G6 B2 `4 B5 r8 U
if(!L->elem){7 l& f4 w+ B: \6 d
cout<<"增加空间失败!"<<endl;
# U: Z" Y! ~+ l! i DestoryList(L); / C K' b2 ~* f7 }+ d
}
H) W' ?$ a$ K2 |$ W) p }
2 H% k0 L# x; X( | *(L->elem+i+1) = *(L->elem+i); - J. S' T) ^. V ~2 L; s
}
' U" g: J/ `. r+ n8 K *(L->elem+e_where)=e;1 t% K1 x: }' _2 O! f. O+ N% E' y
cout<<"增加后的线性表如下:"<<endl;
# V! V; c* i; |5 Q4 x. \) v ListShow(L);
1 S! I* W( @8 ~3 C} - v: i+ i8 y1 I7 F& k+ p* b0 k
+ H' l5 a. j8 t4 Y3 R
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素9 b$ }2 m8 o# w* [4 p% S6 t
int i;) ~7 k8 J- v. \- v5 _4 }# A! t; x
L->length++;2 i s; ~ c8 ~
for(i=L->length;i>e_where;i--){
8 T0 K" v9 i. x6 N( l" V4 D if(L->length>L->listSize){
4 P9 y2 w/ j! A' i$ z, Z$ a9 w L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));/ Q% M6 I& ?: e
if(!L->elem){% A8 l. W. |! a) g" [) C
cout<<"增加空间失败!"<<endl;
; z; ^- I/ W; I1 X8 t* ]) Q9 @9 b DestoryList(L); % R( k& i; ]+ ~- G. x. ]; U7 n
}
7 y1 I$ n1 X6 r; y, N }
8 B+ q) f! o: Y# D" L* q. a# V *(L->elem+i+1) = *(L->elem+i);
1 `5 {* u3 [6 F. Q8 B# t! S; Q- C }( I; D* @# G9 @* X# E
*(L->elem+e_where+1)=e;6 J- V- P U& u3 C! D% G8 d! u
cout<<"增加后的线性表如下:"<<endl; $ D9 h% y$ g- e) t9 ?9 h
ListShow(L);% E, K1 ~/ D9 [7 A: n& s
}
* H3 Q* Y' {% L6 v4 r
6 G& M) I- Q" y* m8 }删除元素# l4 w8 B8 T2 Q0 F. s! F2 P% a
0 u, Y: S. b: D6 o3 c) A8 {& U
void ListDelete(SqList *L, int e_where){ //删除某位置元素 , _5 G$ J; J! L/ W* E
L->length--;. ?$ ^+ ?- Y% z7 x) {: d4 ?
for(int i=e_where;i<=L->length;i++){/ B* h0 R5 q5 g/ \( |$ m
*(L->elem+i-1)=*(L->elem+i);
2 V6 D5 }; B" F+ @8 A }
I- z9 ]7 I2 A. F cout<<"删除后的线性表如下:"<<endl;
+ s \ ^' m7 P4 z; Q7 _ ListShow(L);
1 N# m4 w& k& m# X6 U. u* ]: L+ T9 W& I}0 p I$ t0 {: K# V
5 ]0 R. `$ |9 }/ P
销毁列表& \! p3 c+ S9 w( \
& H/ N* ~5 A6 Q: s, y, E U
void DestoryList(SqList *L){
8 `7 y8 \- i6 U" B3 n2 | int i=0;
# Z4 L" ^8 g+ H4 H0 \ for(i=0;i<L->listSize;i++){
3 W& _0 R& K2 w6 t free(L->elem);
6 y+ o9 S- t$ z$ t L->elem++;+ v3 `& b7 I8 T' B' Y) q9 \( R9 z
}* [" m" @" f2 \6 S8 A
exit(0); 3 U- @* ~% M( R- O
}
7 a8 x8 s) c" P8 L/ N5 X) i) e1 ^: ?7 `- S9 r' B
链式表示方法4 d$ ?: B8 ]% F) E n
3 e; F7 M; H! P- P6 k
结构体定义4 n' V7 N2 J( p, O7 E/ o& l
6 B5 T/ c( T" U( J
typedef struct L_Node{! P8 v9 m+ Z; j, K1 d5 @7 N
ElemType data;
5 N9 u$ p+ k% D/ X8 V struct L_Node *next;
# d. L$ e: a, A& x, a //struct L_Node *last; //增加可变成双向节点
. B2 Q, w) p& `' y- U b}LNode;& @5 l. n7 M1 T! U S9 B- K0 B) B
7 p9 t9 _6 _7 g0 ~ F5 l4 I/ H( C初始化
& b: @% ?2 Z1 R+ [& x" `
& s9 ~. i) j$ S" Z# y" A7 j# Qvoid LinearNode::InitLNode(){, S: h6 _8 |7 x7 z
HeadList = (LNode *)malloc(sizeof(LNode));$ t' q: J" j- X; t( j4 j
if(!HeadList){& }1 ]. L! ]* l6 V
cout << "初始化链表失败!" << endl;
5 g3 C0 \9 I2 L P9 Y exit(0); 9 v- l0 }! ^4 W) i
} : V4 b, N, `( P9 y o. [) {
EndList=HeadList;
* ]0 c& J* n! I HeadList->next = NULL;" I& u8 o! i" w, I' V
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
0 ~8 I6 W5 c+ h, p Length = 0;
o- H, f8 n( j& | e_where= 0;
9 h4 A4 l$ v; r1 u}8 m7 m+ c- X' c& }" k
5 j, Q; X5 ?6 L" u
增加节点
; ]1 o3 a2 S9 \, z
5 h4 u- p; |8 u* `' N6 Jvoid LinearNode::AddNodeHead(ElemType num){ //头插法 0 O6 y* w7 Z1 n
node = (LNode *)malloc(sizeof(LNode));" J$ Z( Z# L# f' \$ V
if(!node){
1 L. l8 N% s1 V cout << "新建节点失败!" << endl; ( M, b% L3 T4 ?' T( C
return; ; K5 R9 E7 N! g7 L0 v
} 9 D7 x" ~8 N: q) ~3 \/ j
node->data = num;
. J7 \, ~9 s: q cout << node->data <<" ";3 K" g, x5 Y5 y3 f& I
if(NULL==HeadList->next){, d9 d4 l+ G: h9 A' @/ z% B; f4 h
node->next = NULL;
5 M; d8 c! E7 f; x3 f HeadList->next = node;6 i' l- l' o# X! Z1 s% Y
EndList=node;
- e# f6 u+ \8 y+ K; E! k }
; L4 w: A, v& z* _1 e) ^) x. E, t else{' ?( |0 a) H* G! Q0 F, Y
node->next = HeadList->next;
4 ^5 S9 ~/ x% S6 {! c/ c HeadList->next=node;0 w& h/ J/ L* I$ c
}/ S7 ^5 m" P* N
Length++; : s+ N. s) I& }9 q9 o
}
4 \% q- `! j* f
6 k5 S0 d9 L4 f( {9 e0 dvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法
# x7 H2 P- t% y7 [" h node = (LNode *)malloc(sizeof(LNode));4 f' B! @% x4 e# f
if(!node){( x1 x8 q( ~' ?, Y
cout << "新建节点失败!" << endl; 5 V7 D1 J6 Z) H! u$ h8 b5 v* m
return; t ^/ \% _4 d% z+ O. i; ^
} ! D+ _* }) A! T+ a: ]1 n
node->data = num;
) b; j6 \; T- H. p5 ]0 {0 e( W/ }7 X cout << node->data <<" ";
% N# X- H. D+ |2 t0 U1 y2 l3 L node->next = NULL;* y6 k$ M. n, m7 k0 m
EndList->next = node;7 P( ?' I! b% f- @
EndList = node;
2 b- t. W5 V: ^3 l. Q7 s# U4 K- t Length++; & i' s/ t$ E: t2 y# U. J. {. ^
}, I i- B% w) r; Z* ]4 l. v
9 r2 F b' O+ I4 G/ N2 R% [+ o
删除节点: c. T6 M' N- h
$ T' e5 D0 Y& h3 c( }! wvoid LinearNode: eleteNode(ElemType elem){3 n- v$ r, Z; [% l4 Q
if(NULL==(HeadList->next)){% Y, T, E' A/ N2 r8 t* J; Y& Y
cout<< "无节点"<<endl;
7 f3 U! J7 f2 N/ b2 L! T- K return; 2 y6 S6 q, A Z$ T' M7 |2 r
}* ^+ }& n+ S) Z& c1 |6 I- U
Node_cur = HeadList;
. Z; S+ l1 Y5 L) y/ D8 e' m while(NULL!=Node_cur->next){
! m) R+ ^) O3 ~1 U1 o Node_temp = Node_cur->next;
1 l& d# s& _; ?9 h, c0 v# { if(elem == Node_temp->data){; ^- w* J2 d$ I8 z R: d3 N
Node_cur->next=Node_temp->next;. M; O. Z2 l; J
free(Node_temp);
l) v* C7 `' O) Z% \ }
- h0 [- ~4 ?( F1 F5 N if(NULL!=Node_cur->next)
+ A1 U1 s- `( S: x# l5 u7 I* } Node_cur=Node_cur->next;& Z$ _( U' ~0 y7 `4 X0 T. B
}
4 d- x- [4 b8 H' j cout<< elem <<" 元素已删除!"<<endl; 0 U3 y( r5 P) N. a- k0 @' N. B+ O
}
. N: \; r3 p4 p$ n9 C( m) X# {+ l( Z9 f
显示链表3 T9 Z" }2 R* h7 c$ c9 A
# y2 t: W+ Q; `5 ?& v
void LinearNode::ShowLNode(){( p4 b0 G. R7 Q/ W1 p0 ], B7 y4 \
if(NULL==(HeadList->next)){! b+ |4 Q8 a- F) c, b- F9 M
cout<< "无节点"<<endl;2 H! K2 w+ H$ s, L* R" H, f
return;
) X* W x7 R- L O; y k. T }
% ] V7 P1 Y" d Node_cur = HeadList->next;
3 _4 p5 L; K0 d while(NULL!=(Node_cur->next)){4 G/ Q, j6 a Z8 U
cout<< Node_cur->data << " ";
2 a p7 k7 q% R: W# V& }. @. O: e Node_cur = Node_cur->next;
0 I% H. c8 {3 v. D' C }
3 o1 @1 C% Y8 { cout<< Node_cur->data << " ";
" D( f, f5 |$ Z# @( D4 r0 r4 n cout<<"链表中的数据已显示!!"<<endl;
G/ w% N' R8 c- Z% {}
) V \- f7 m. z& ~( A1 ^% |/ w5 o
销毁链表
- C4 `, O$ u' |, h6 y; \. T- R, d# f$ x' ]
void LinearNode: estoryLNode(){- |. c4 A |6 l( w8 U! F/ G
Node_cur = HeadList->next; ; _1 D; G% K- g. |6 K1 ^8 [6 f
while(NULL!=(Node_cur->next)){; E3 I" D" A) @3 B. z
Node_temp = Node_cur->next;$ {0 m( W1 R# ?% P/ H
free(Node_cur);
0 H4 g2 y- D/ O z* H6 k$ m Node_cur = Node_temp;
' d. I0 X; j( ?9 q$ x* C/ x }% w+ \# e4 H# m
free(Node_temp);6 d# k( f; v4 _+ [& F
cout << "数据节点已完全释放!"<<endl;
" T4 Z7 b$ F; O; J% D w @: \$ _ free(HeadList); // 释放头节点
$ e: |) c/ ?6 P0 g/ ^ K cout << "头节点已释放!"<<endl;
& s Q& b- Q4 S9 M% X/ a————————————————& J/ B: C% x+ N' m8 Z
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 n9 J9 M7 H7 R( O' [. v/ Z% t2 b
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
$ G7 \3 @: |; u! {
5 i# h9 T" r# J/ H2 w4 P& K. X- r! X% a; X$ h
|
zan
|