- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564650 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174618
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
' ^5 P3 D6 Y8 F; t' y
线性表顺序表示、链式表示实现方法及其异同点1 U' [* W* A/ o! T
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。% L) G6 p5 ?" a/ r
% [6 {) c3 ^ A本文采用C++实现两种表示方法。
5 }3 i. ^. N k& S& t1 y4 Q, k/ q) Y; N4 Y
目录
+ f2 W8 q3 h# ]5 v3 W
- l8 t" W6 u, f顺序表示和链式表示的区别:
# l5 t$ O, V4 G& a3 T& I( k3 S& c7 _9 m7 Q
创建方式:
0 [7 i6 E$ l. q
/ f3 C, H9 H, @4 M' i/ ?时间复杂度:
, ^: C& T2 |( Y' @
" b B- {& w; h- i" {顺序表示和链式表示的相同点:
( e; q' Z; C3 X5 F7 @( u
! v- } p* b% Y2 Q删除内存空间:" X5 @7 Q. f! ]; l+ R$ Z
& @3 R5 }" F: f3 w" i* E8 I代码实现:
- o. I$ I- V& B. L7 U4 q, z5 Y# o$ S i2 s; O
顺序表示方法:, J/ {- m2 f1 f
8 M4 [% Z6 b, d, i结构体定义+ a/ W8 v8 k' Q4 P
/ n, N1 D: K8 {# H- |) E初始化% L3 O( ]. F- B! x& {
0 U L) B, ~$ w* [: H+ [7 k t _增加元素
! ]: S/ r0 a- l4 i8 o% @
- t$ H' D% ]( W" j删除元素) ^( B/ ]* R9 f F9 ~
4 Z4 E5 V7 P7 {' L! m& A& S1 y
销毁列表( `7 J7 I* D$ p; P' ~
4 b+ ~0 B. B! W, B5 s链式表示方法
' E1 O3 v- K8 U! u
" {& f; \4 u8 s结构体定义$ N+ ^. `$ T% x+ L! ?
% ]3 d/ g4 C$ g: n( H初始化: z/ D; _/ A; @5 |8 W
% [2 k+ ?1 \# I" B/ v增加节点
* Z: g$ r" P5 L) I* S8 |2 z! b7 \3 Q! ` E! \. ~
删除节点
+ Y6 D5 Q, \$ C$ q: `. e
( x8 V- p3 U! C( ?显示链表$ L" ?; {4 t: D+ I; n; n% Z# |
0 \2 G: B/ _5 I6 Y3 H3 A& E. [
销毁链表
6 T" y ^8 }: Y+ [ Z" w/ \/ I8 V F6 R$ @. g5 V" R
顺序表示和链式表示的区别:7 j( z* ?* E' t
) O/ U+ y# f: T+ z' `+ R# E% ^% E% T创建方式:+ K5 ?9 V% [% x: L5 C8 v; }& d) m
! F: D2 \" B2 x* ?8 q/ W
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
6 \( j6 V: i. d4 ?7 p! m- [7 n+ t/ u7 h: j; H8 \* D- `
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
6 E2 {7 F; X3 ?; z9 e2 J8 g* k) R6 ^% f5 J7 Q
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。* Q2 f/ u# x7 Y8 Z
/ [6 a. k" s/ N2 g6 r6 S时间复杂度:
: q% s$ F. z$ L* \: ^5 g/ V! v! s/ k8 ~. t) T6 x+ w. E n9 v
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
9 z( X* c- @. b7 j* e' H6 j4 Q/ W0 R1 Q$ C7 C! y
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
, d) y9 [: _, ?7 I' g3 X4 I- b' Y$ r; u& v6 J$ ] l
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。( m' L; f3 S5 V3 w
0 D8 p) k3 D, ]# Z修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
3 Y6 e! s: s* T
4 N$ x# @% ~) |1 [查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
3 k* c# f+ @" [/ S% I2 i
2 u( \) A! F; P4 C) v顺序表示和链式表示的相同点:& [. O" B) _6 l$ j
. M/ u# W2 h( @' O* O, h0 k
删除内存空间:. ]4 S. T0 _8 Z$ F7 |' B' W
% E T. y4 k- {1 r ^2 C9 V
内存空间的删除都需要对每一个存储单元单独释放空间。
; [6 E- P& _' `* u! M7 k4 V7 a7 W0 l1 K$ U
代码实现:$ I5 S0 i6 _- p. n |! s
1 n0 v; E% E$ F- ?! u. F顺序表示方法:6 l; V* T3 r0 G1 g
) g# W7 R, I& N% F9 d
结构体定义
& `- w8 x1 T' Y/ M# N; a$ u# Q. r
6 p& y3 a5 O/ p: n/ C+ Ftypedef struct {
! u- m9 P, \ B ElemType * elem;
6 }( R U9 l) _$ T L; @- g int length; // 线性表的现有长度 * B. x" e" w! E$ N0 p2 n) |" w2 m
int listSize; // 线性表的最大长度6 m2 ]/ _4 S% B h+ v( S% j, r( ]
}SqList;% W- A+ ?9 V( t* D' ?( r$ r
: @% h& o3 @+ q' E
初始化6 P) W5 k( }6 ]
3 g$ o% j9 ^/ i: @& Qvoid InitList(SqList *L){0 O8 T# x, k' T" L
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;0 ]. d% y3 g) J6 f8 ]
if(!L->elem) {, K1 r. m6 P5 J# a; v- G
cout<<"申请空间失败!\n";2 ~. X/ |/ g3 U+ [: h0 @4 s
DestoryList(L);
! w% E" p* \( d7 C4 B6 f; d }, \0 C8 ]; s; d! X5 f
L->length = 0;6 s: ^' y# q8 ?# t' ~
L->listSize = LIST_INIT_SIZE;
7 t4 T8 F2 ]0 X cout<<"线性表初始化完成!\n";
( o& }" e1 y9 {% I}
/ a G0 W' h f) q! H c, |
m _- `: p3 S* T" t增加元素
; w, {4 X& W3 {: |3 \
. D+ E! g9 a) m t+ ?void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素2 s* h# U6 ] J. m; N! z
if(L->length>=L->listSize){
% x: ]" t( Z" J k; q1 \ L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
/ C: B! _0 }8 L1 R: g if(!L->elem){
1 \" J* t; ~1 J/ f$ Y cout<<"增加空间失败!"<<endl;
0 q; N( _ x& Y: U, g4 G DestoryList(L);" t- [- c& {0 B$ _& Y9 a
}
8 a/ g$ _- b; ], `' c/ r }5 \( L* k! g' L& J& c
* (L->elem+L->length) = e;0 Q( g# S7 @8 x4 s. U5 w/ C! x
L->length ++; / E d" X- t( P Q
}
: V F1 j, t/ W
: C: d) N* T9 x6 Qvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
- a# Y+ G9 c4 V: G9 Q. p) c int i;
7 ?2 }; }0 t/ E+ f0 m$ } L->length++;
" p+ O/ b l+ B+ ?0 ~1 k for(i=L->length;i>=e_where;i--){
# D( ~7 Y+ E% w, M( |3 H* |5 p if(L->length>L->listSize){9 `, C* n4 S3 {5 D4 ?
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
2 G+ _/ }% w* f1 F if(!L->elem){) F" u2 F y* q# M; Y: _6 l' V. L
cout<<"增加空间失败!"<<endl;
/ I8 w2 R2 S# {" V$ c; _" A DestoryList(L);
* n0 c) y/ A+ w* z9 t }
: ?( h% N6 r4 \, o8 @ }+ I7 u8 r' `0 S, s+ E) Y
*(L->elem+i+1) = *(L->elem+i);
0 |7 E4 M3 s. H B# a9 m6 p( S) R3 L u }% u% a: a p4 R
*(L->elem+e_where)=e;
, q! [* Q. k3 O4 m; o f cout<<"增加后的线性表如下:"<<endl;
6 y0 y+ v( u# p; ` ListShow(L);
9 u' H1 Q+ \% @' F$ `+ e} # g7 E l0 Z! B, \: m( Q4 W: Y8 l K
5 s' u. U! w+ A& P
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
) M8 a% ]* d d5 T; d) m9 a int i;
$ g% B; f! j! {' x/ X* y L->length++;
) P4 r6 {0 a( J: [2 o for(i=L->length;i>e_where;i--){3 g) a& ?" d2 R9 T
if(L->length>L->listSize){
( y, ]7 `7 H8 Z% X) ?& K: x/ M L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));( o p9 M7 I5 l, }4 D5 Q4 m3 Y
if(!L->elem){
" k. ?9 j! t+ T cout<<"增加空间失败!"<<endl;5 k. R' P! _+ d0 m2 {
DestoryList(L);
$ u: ^$ p! K9 d5 l% F$ d) b7 v% _ }
+ _- i; ~' }$ W1 c( v3 c U0 \3 ^5 ` }7 j! s2 n G* p9 H5 `" I4 v) ~
*(L->elem+i+1) = *(L->elem+i); & y5 W& p3 Z' ^1 Q4 e/ W
}2 q6 o9 |: R' S5 h& b% s
*(L->elem+e_where+1)=e;) y0 x4 u+ @6 r2 p3 C4 u! D6 \
cout<<"增加后的线性表如下:"<<endl;
m2 m) v) c% [$ I* B ListShow(L);
/ j, d! i0 K# e G9 u! D9 f9 i}) l) `4 [* f5 B! N; z! b
1 k: V9 m1 p+ F7 \0 E) D0 C- F删除元素
8 v% @6 I2 w: V7 ]" }* F: n8 s# P( g3 K1 J1 p- P! o( U- D
void ListDelete(SqList *L, int e_where){ //删除某位置元素
- q, @3 J7 f' e, ]7 \' C/ C L->length--;
M( `* f. G3 P5 m for(int i=e_where;i<=L->length;i++){5 u; V. Z6 w5 ^! k; n8 z& _
*(L->elem+i-1)=*(L->elem+i);
6 P$ A2 `/ W' D! ?3 n: R; ^# y# ~: C }
; f8 J! {6 u5 f cout<<"删除后的线性表如下:"<<endl;
* ?& V$ e- l+ G$ W( ] ListShow(L);# M( s+ T* S& M% g( e/ |
}
3 u A: B# U3 ^
W) I: H( \* y% d. ]销毁列表
) s' e* h$ x- }9 P" ^6 F& Z
* r0 | g M7 @+ Q9 Mvoid DestoryList(SqList *L){( U# s7 C z: i8 t& k$ B+ g. i
int i=0;' p: I/ N' `1 J( ^# I
for(i=0;i<L->listSize;i++){! W# ^5 c% ^4 d- \
free(L->elem);
! Y# a% m. \' S& W4 y1 s. u5 O L->elem++;
" Q- V1 ]$ e/ s v& z9 y }
/ }3 U8 G3 |( O: S exit(0);
`2 r! p- F" W- _}2 V( |6 ]# ~6 J1 t8 c* T% b
6 M6 h- F: U1 p链式表示方法
6 Q' w5 }8 x- l) L7 p+ u: {2 h" D3 j3 t$ D+ G. p
结构体定义
9 y/ [# m2 M9 w6 w% h; c) o, @/ e1 |. n1 C0 h* v
typedef struct L_Node{4 S9 b: R; s n+ I9 J
ElemType data;7 X0 b* R# v. j- P, T
struct L_Node *next;. i* ]9 C) n% @( T
//struct L_Node *last; //增加可变成双向节点 * Q" L$ a: ^) J v& m
}LNode;
$ L8 D+ J& o& M2 A, \8 x2 _8 y8 i) Q9 p8 z
初始化
8 J6 O% x& |8 Y0 q, T E
7 U1 Q C0 X# Svoid LinearNode::InitLNode(){
7 X1 M5 n" C. ^2 N ^, _6 i HeadList = (LNode *)malloc(sizeof(LNode));
- j* M, K. x& K/ N' r% ?' b# o if(!HeadList){
1 k4 T* b. A, J cout << "初始化链表失败!" << endl;
! E+ o% O4 x, u) B& p4 R! Q exit(0);
8 o( P* M" Q- g Y" u2 U4 Q } 2 v8 s6 ?- k! Z( n' y. G+ A c
EndList=HeadList;
( O0 u( T w F8 C: i HeadList->next = NULL;! y- N7 l) B/ Z L& A' d5 e" }
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;4 e$ k: P2 C% l0 {& ]0 D
Length = 0;
: T$ u* a: O [* p3 K e_where= 0;7 C; x0 O# s2 I5 ?
}
, J9 V2 i+ j' I7 W7 q
. M5 V( N' I3 r( k$ x: y3 d; O3 y增加节点' G) ]# l+ N2 ~& \" m3 x+ j/ Q- S) w
5 x& b0 Y: q3 f! H& U% L- F# Fvoid LinearNode::AddNodeHead(ElemType num){ //头插法 + m+ U$ F- K3 p b# s( L4 P' a/ j
node = (LNode *)malloc(sizeof(LNode));
6 L% _5 z+ \5 t0 v; v; t' R/ x if(!node){# I$ O, i$ D) E% W7 l- H2 f$ W
cout << "新建节点失败!" << endl; 6 m, a' u' @3 D" c' F2 ^
return;
2 o* g" j9 g: [) P- R; P. _ }
- F8 R/ {6 l7 G1 m2 |8 C# l node->data = num;
' E4 \/ T H# G# C3 H# N cout << node->data <<" ";8 Q6 |- V0 s: n1 D9 U$ T! [) L0 f9 D
if(NULL==HeadList->next){
1 m$ Y7 N; b1 C+ T$ q9 x* [ node->next = NULL;
; ?" L3 v# w$ ?# a HeadList->next = node;
3 K9 f1 o0 q+ \- q3 W. V EndList=node;1 C4 R ?' s( ?" u; |0 p# O
}
% p L( n! j) P8 T( B else{/ `6 H+ e: j" R: D( X, Q, D( V
node->next = HeadList->next;
) Q2 {) p; M+ m1 M% c! G: h4 H HeadList->next=node;4 }) a6 ~$ g" @# |: W1 ?+ [
}
! L2 f% N, G) g Length++;
# q4 f5 a3 r3 h' u}" v c0 a' r* z
1 T4 V% K8 l* Q3 z. Lvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法
* N$ V9 n, G1 p node = (LNode *)malloc(sizeof(LNode));
$ C1 X4 X( q. K* q, C8 v( G( \ if(!node){
7 k2 `# @$ f! o) ?9 D6 k, B cout << "新建节点失败!" << endl;
( Q* X7 a) X/ i+ H& V, ?* [ return; " c. p0 e# v! ?# l. F8 I
} 6 ~3 [! G- [, q" Z
node->data = num;
+ ^5 X2 S H9 }, H5 t3 i; N0 P cout << node->data <<" ";: @- a9 a* ~" v' i2 F/ N" d
node->next = NULL;
" p; K. \8 T! _ [& H: ?6 X EndList->next = node;
6 ?' [$ }6 P# r EndList = node;
# I2 M( k2 p/ D4 T g" C% j z Length++; |% p L/ f1 T# i/ Z7 D0 b
}9 L2 Y0 o" Z- W% ^
& k1 Q C, l% W$ w删除节点
: s8 c: s2 r8 z% P: B% ]3 p- ^4 o8 V% i/ D5 H/ k/ o2 Z
void LinearNode: eleteNode(ElemType elem){" }8 T- d8 e$ l: z- a7 j
if(NULL==(HeadList->next)){7 E" c: D. |+ q e- J/ J* {, ^4 M6 t
cout<< "无节点"<<endl;! j B! m3 u# K+ V4 W+ f& C
return; + e# z5 q3 j3 v5 @8 m
}
' j$ E+ b n0 e. Z Node_cur = HeadList;7 @3 R0 N' J7 G% J0 U
while(NULL!=Node_cur->next){
) v6 z5 ?8 R+ ~6 @ S; o Node_temp = Node_cur->next;
% y2 f J) d5 s$ M+ _2 Z if(elem == Node_temp->data){/ ]1 V/ g" K* X" g0 {8 k! t% i
Node_cur->next=Node_temp->next;
/ v+ X5 ^) s w! A# k. [/ U+ ]* l* | free(Node_temp);
# v5 A5 p6 @- m0 S }
: N2 ?+ L! l" m7 a if(NULL!=Node_cur->next)
' z% f! L& U) s Node_cur=Node_cur->next;
5 H3 ]% `! {3 n% Q! `0 ?7 m- { }1 k& A8 J% y! [7 N# [ q
cout<< elem <<" 元素已删除!"<<endl;
& j( E/ G2 V* V- J} " u* v9 A! U6 |
* W0 z7 E* D2 l+ p+ v
显示链表 D# Q/ a8 h% q, g1 M" q5 {2 {
, b6 w8 ~% e3 ^4 d6 h
void LinearNode::ShowLNode(){
2 c5 f5 Q- i; C( B* d if(NULL==(HeadList->next)){* K; ^, N& I. x1 f, N5 U/ q
cout<< "无节点"<<endl;2 ^: b D* C C1 B) H
return;
5 ?2 ?* m* {3 A5 z: y }$ L( x- v4 j5 Z/ _+ q) m, Z5 s6 `, \
Node_cur = HeadList->next; 2 `" ^9 p( F7 @2 o& J. a
while(NULL!=(Node_cur->next)){9 x7 g% v4 m8 J1 D
cout<< Node_cur->data << " ";
" s8 `2 U7 K" W7 V" D7 c Node_cur = Node_cur->next;
5 s$ c5 ?) g7 a/ i7 }; `/ Z }
+ j- x, J; W* c$ c: @* {. n m2 G cout<< Node_cur->data << " ";4 t% \$ _) C: d7 P; _7 u
cout<<"链表中的数据已显示!!"<<endl;. Z9 O( k1 ?9 Q5 m# q
}
' u, x2 J7 {( B- u& A# ^2 c( J) x* t) o2 B# y3 x
销毁链表0 K3 K- C/ L% f2 Y9 E, m
: H$ W5 c( P7 z
void LinearNode: estoryLNode(){" b4 l1 o% _% p1 J7 U
Node_cur = HeadList->next;
" s1 w9 {, R, c$ _' f f' t% D" O while(NULL!=(Node_cur->next)){
& {7 e: \5 d* O* Z7 x8 h- ^ Node_temp = Node_cur->next;- N# K4 Z# O, b# u, Z
free(Node_cur);, H( _# |7 v& C% O; N" Z7 O T
Node_cur = Node_temp;
- @; U+ l/ T7 y; a9 o }% V) m: a7 H3 F) H' m
free(Node_temp);
$ E/ b" X+ n# ^* e' M* y# k: |5 N cout << "数据节点已完全释放!"<<endl;
8 ^ Q5 r: a6 b' v' y free(HeadList); // 释放头节点
+ L& n# d& C& l# z8 Q0 S* q2 G7 ~ cout << "头节点已释放!"<<endl; 8 Q7 F2 r: W; q3 Q t
————————————————* g8 c+ M% H2 [& b# k+ N9 U: `
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( c* P5 h: t3 l: ?3 P# S$ H/ v8 I
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
, t. z2 M2 f& D/ _- S" `6 G
, m7 `( l* E/ T2 l9 W: \$ Y2 p9 c2 H% N \: J, f
|
zan
|