- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563425 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174250
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
. D; H5 Q- z4 k. D# {/ x
线性表顺序表示、链式表示实现方法及其异同点
- A, \4 r# G! i; Q! P n; M9 C线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。" ?1 |0 L( \* l0 i; ~4 B
8 p/ c' T' A' z* p9 D) q b本文采用C++实现两种表示方法。
2 [8 B$ u, ~# y! Y& \
0 p, E% H) I( |) W% o% ]' `* o: H目录- p) z* @8 N6 R& Y4 K
3 \! v) p9 g# R% p. Y
顺序表示和链式表示的区别:
9 y, _! L8 _2 D# T9 @
0 p( ?0 I1 L' D# S创建方式:
% w2 \: o) ?0 ]8 b: o
4 S) u! ]4 V7 b; c7 h时间复杂度:0 ]* b- ]) u( H5 f4 ]8 n7 I
7 O9 |( Z% [" h! t# c. j. K: w
顺序表示和链式表示的相同点:
/ x+ w% c7 C k( Q* \3 N
* n9 g& _5 c* T) i# ^* A( D删除内存空间:& b4 I# ?9 W! G" N+ e
( b9 K, f! H/ E" f [" ^代码实现:' U# l6 W$ q- h6 j7 J% R u
2 l: q; D+ _* U: v顺序表示方法:- K \2 K5 V' O8 D# L, Q
$ T% x; ]; r% }+ y% ^6 q. Q9 ?结构体定义
- b P( d: |4 _/ a. R n, b, J, @( y1 T$ L' {( e% l0 v
初始化
# ?! w Z3 l3 i. E' B) @+ p; I8 F, O7 |% ^/ }) O
增加元素5 u) d$ L0 _ V! e8 \9 ~4 R
6 ?: k7 Z$ X8 `5 [% U
删除元素" V) E; M+ c, h8 r
. w3 \9 M! C9 @# H+ p销毁列表
9 w# ? L" I5 Q8 Y/ Y# S1 K0 b a8 @/ X/ I6 _% k
链式表示方法
' K. v4 v6 V. _) m" m- u5 S! Q n0 L; D# e; F+ ?
结构体定义
8 w- O5 ^3 J& e5 r# z, ^3 Z9 g+ e3 n
! e( D: m8 |/ N初始化, G6 ^' ?4 w6 Q- B4 h' Q
- M, s; c M& m! r3 o8 U+ R2 x, K
增加节点
7 p/ R5 d' z) J6 j/ Z2 S/ w* _/ ~5 ?- N8 w: Z1 m
删除节点
1 a) B- i6 {5 b; D# F
$ G% w0 V9 a) R% B; F$ i8 D0 \显示链表
1 K$ P1 ]4 \5 h4 ]
+ S' p3 {$ ?. e4 W2 N+ b销毁链表
3 T+ r) }, N. f* o9 D3 `$ Z' N' `/ d$ W9 W1 s$ `8 x" P9 p; i8 |+ X
顺序表示和链式表示的区别:) v: Q- J& Q: r$ y2 D* b
. j8 m0 {3 D. \0 A+ d1 h# V( w) v
创建方式:
* u0 g+ C \! M% o5 k% A- K* S6 [7 y. |, ?0 w3 Y' ], D" Z: X
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
5 _& h3 m+ u6 [; b* n
/ g8 }6 h+ e; o0 @) X# c8 [" k(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)2 Y! H+ b2 c! R% T. f
& d" b: i4 P* P链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。1 i: R) n. }0 a5 Y
- u4 | X/ U7 t) ^
时间复杂度:
2 T% |% n7 n' g; i2 K5 k3 @6 d5 J& S" ~% [# |) C+ U1 O
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
9 r0 m- k! X4 d# T- |% r, B) c
0 q3 X- L5 G- z _. n增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)/ B6 U) p- Y v! W. n* [
* {1 N. N( Y, a; O0 O' W+ aPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
7 {6 i2 l! H) W b0 L2 R) p9 s1 u, P4 g
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);( z' Q6 j$ t8 ]% e) }
0 b" S1 `* g0 q% T5 A* |* X$ O查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);. n# }- ?$ S/ g' Q1 W+ ?" c
. V( A, N. k# E, v
顺序表示和链式表示的相同点:
/ P: b; v2 i# Y. ~$ R6 J- |+ W
( s; Z/ ?+ \. e2 G9 q0 v5 G删除内存空间:
2 t! H9 n1 R. y' t W
4 E; l) I: r% @- R1 o内存空间的删除都需要对每一个存储单元单独释放空间。
$ Q8 `- V3 ~5 e# P; `+ A: J" b( p8 e" x+ D2 f7 ?6 B
代码实现:
4 a9 k! h8 A9 Q( ?5 ^' {0 L" g# _; t9 D* S1 b1 N9 V6 R% v
顺序表示方法:
6 l+ F( b0 @0 z0 [9 @" N6 t- \) Q/ Z3 f' E% V5 l8 t/ z
结构体定义
4 K5 w- n5 Z$ g) q/ c0 Y1 f' s1 S7 V* I ~% e! {
typedef struct {" D0 v/ A) ^: t+ T1 d7 K1 q
ElemType * elem;
% D9 k4 f3 m7 P) ~2 Q int length; // 线性表的现有长度 + g; z: a. q/ C
int listSize; // 线性表的最大长度
* X! |6 c9 c! T8 g) G# C$ Z$ ?/ |}SqList;
1 a0 x5 v' `. I
( [$ H2 j- B! {1 z1 c" g初始化
, ?1 c! H/ V9 `3 Z! O9 A* ]1 J( O: H& u
void InitList(SqList *L){6 ]% }. R& Y" x. V
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;3 |: v( L' p# e" T I+ [
if(!L->elem) {
6 ~" t, I" a% H6 l- J o( A/ c cout<<"申请空间失败!\n";
+ z# H6 }* B) ^) i5 z; ?$ S7 o DestoryList(L);% O$ ~6 h4 u) `" ~- Q: n) K
}
5 o: y; s4 p5 W" n, @ L->length = 0;0 g* d" B# ]$ F0 ?( L% Z
L->listSize = LIST_INIT_SIZE;1 R3 c' p$ J+ }; ]
cout<<"线性表初始化完成!\n";+ K0 ]9 L6 K8 x2 f# ~) o7 q
}
, z8 z- i+ d3 H& x* q! @. h3 [, F+ Y' i, U
增加元素
# I( Z* L2 c; |0 V h( Z8 A# v8 [- O! K2 d
$ R( c; C" E8 Y- l0 d8 `1 {1 ~& cvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
" T. ~9 I' {" i: U' [4 O* V' C if(L->length>=L->listSize){1 R# R! A& n' H- d
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
" |( L8 C" X4 ~% V2 {# v if(!L->elem){ s; B& M7 r S. D# n7 O2 L
cout<<"增加空间失败!"<<endl;
5 e7 G; C$ T5 h) u! @# } DestoryList(L);: b7 Z1 x, l4 q5 H/ |% T3 L
}
- m0 L" v9 t# I0 t }; {% U$ |4 J0 o ^9 p# D. X
* (L->elem+L->length) = e;
! @( E2 s% I* s- c3 `* f9 B3 d L->length ++; . ~4 f m0 p: u' g3 U' ^# V8 r
}
7 {2 U- e7 y* }( c5 I1 T
7 `0 c' M* C" c- cvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
- H3 ?- T/ h2 n0 ?- e0 q% ?! F int i;
9 T( g9 E& p! C: `1 V+ f L->length++;
7 r% t& A* i9 k0 c8 O9 T for(i=L->length;i>=e_where;i--){3 h' j5 v+ h6 k7 q! S
if(L->length>L->listSize){4 ?- h. ~1 y! {/ [3 [9 [% z/ U% D+ w
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
* R$ X! s [$ Z5 u if(!L->elem){! M8 L) s6 Z7 g7 i8 m# S
cout<<"增加空间失败!"<<endl;4 E0 I: F* e' S" Q
DestoryList(L); $ b! T" ~! @+ n
}/ g. L) f& U9 ~% Z
}
9 {$ t. O7 S4 t$ t6 ? *(L->elem+i+1) = *(L->elem+i);
7 h# E* v4 g: @2 o: D }
; T+ E$ c3 ~" B9 ? *(L->elem+e_where)=e;7 c4 `0 I1 ]: Y' s0 A. u# R
cout<<"增加后的线性表如下:"<<endl; ( a7 T2 h o6 U" c( A
ListShow(L);4 [3 ^! B, S$ y g. r# H6 Z
} # y* s: ~8 v0 J& P# J
$ ~* \( |0 d* O M$ s$ Hvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
2 q9 \' D/ [0 Z9 ? L0 y int i;
+ C) X t! F! G* l L->length++;
* z0 m* F( D( _( j0 z for(i=L->length;i>e_where;i--){$ t2 s g8 V9 M/ M0 J! f
if(L->length>L->listSize){
9 P; l+ I) n" M U3 j8 h L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
5 B( h. T4 g' V; y7 F if(!L->elem){
4 r+ B- @( T4 I7 a& N5 p7 D cout<<"增加空间失败!"<<endl;
$ `) {3 Y8 @% H1 k, @/ }: [ DestoryList(L); $ ^4 z- u# S$ K) A# L! a5 C1 X
}+ _( ~9 L' q6 B6 O( _$ Z5 Q& A, |4 t; ~
}
' l8 M* J' |- Q+ C9 s7 W* d *(L->elem+i+1) = *(L->elem+i); * C* f" _( T4 Y1 Z& `4 E
}$ L2 ]5 C/ d7 n6 ~
*(L->elem+e_where+1)=e;
; r2 `; G; c' C cout<<"增加后的线性表如下:"<<endl;
' a( f. {3 L X ListShow(L);; } u* G: y/ ^" S/ v
}
; K# g) f/ h3 N0 T. R. {( K# S+ _& a/ ]" _
删除元素
Z! W* z; O$ N1 z
6 t% z6 x, E6 u+ Cvoid ListDelete(SqList *L, int e_where){ //删除某位置元素 , U1 g0 `3 N5 t/ f$ w
L->length--;
1 E4 H2 _! q/ L0 w K3 ^ for(int i=e_where;i<=L->length;i++){5 T9 T4 f2 o2 h
*(L->elem+i-1)=*(L->elem+i);
8 v5 @) j( q; A# a2 { }: c6 \8 o+ K6 U7 `2 z
cout<<"删除后的线性表如下:"<<endl; ' K; F) o8 h2 M3 b6 d
ListShow(L);
+ e9 M) Y7 ?6 N4 H1 ~" D* Y& O}
$ \$ O: ^2 ?! C* j9 ~& @$ o) _& c' Y% @. z3 j& n
销毁列表
3 h5 j& o' ` O0 l2 k$ ] {6 J5 S% Z& R7 q% ^2 x. i* Q4 a
void DestoryList(SqList *L){6 @5 p3 d8 s' X% z* m
int i=0;
- i. s; ~9 G% G. p' B6 w! E for(i=0;i<L->listSize;i++){; \5 O# k$ p6 ?: z0 A
free(L->elem);3 \6 W7 U& r( x8 \0 U* V- f
L->elem++;3 s/ N/ X0 h1 C' Z% |& {
}7 S" ~) K* k9 }( i8 Y
exit(0); 5 N& w/ y8 ], N6 W' r
}, z. O; _7 P1 E1 h
# G" m+ n0 R6 S' C! H! E* ~) M3 t: _
链式表示方法% t. s7 F# n$ Q A5 k* X; F) {
1 T% U- C% X+ Q5 o& V结构体定义" }5 b+ x& Z% ~% U. H4 l' d0 R2 O
% f: G' G% W$ Q" G0 u' Stypedef struct L_Node{
$ [6 N8 o, O+ @1 I. t5 `6 c5 v; C ElemType data;
; ~1 G% ?6 ~2 B- X: g struct L_Node *next; d M0 l- n) _9 `9 d. r; G9 |
//struct L_Node *last; //增加可变成双向节点 + W' N' g9 h7 P: t$ V
}LNode;& V! X# l: P9 i/ L9 v
6 F* [$ q3 ~ g- \+ Y初始化
' _/ L$ \) c. R6 @5 G' z
# h8 l: w3 e: w8 \# z Z- Fvoid LinearNode::InitLNode(){
+ ?8 k! Q% D! u0 Q$ H" X8 } HeadList = (LNode *)malloc(sizeof(LNode));
- _( t' C! g& b' N) Z6 `1 |5 R* z if(!HeadList){
1 \) j7 ]0 o: R8 U: v cout << "初始化链表失败!" << endl;
* T1 o0 O4 e; Z% ?/ K exit(0); 0 d3 i" L1 k, h8 R
}
0 j3 G8 L2 k$ p) G7 k! {) y" {; A EndList=HeadList;
. q. R6 W. M, X# a) {) k5 v1 Y+ x HeadList->next = NULL; J3 r9 {/ a- j
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;& M: o$ j( p8 ?( [
Length = 0;# X) V, _& }+ S" c- R3 R4 E1 Q
e_where= 0;
3 e" p4 S7 c6 t. w! h& f}
5 e/ _! b7 {' V6 Z, N5 S: c+ R6 E4 q
增加节点
' Z% S5 M* [+ m
- o7 k* [! [# P7 [7 L; O& l" Avoid LinearNode::AddNodeHead(ElemType num){ //头插法
. J) d. Y$ G2 b node = (LNode *)malloc(sizeof(LNode));5 ^4 W; |# N' [
if(!node){1 a2 x7 d. f, G" ]: r! P% c
cout << "新建节点失败!" << endl;
' O m: O: `7 b" s4 D: X; c2 | return;
H9 L8 m6 s+ I3 o } + S( z- L. _4 R% _
node->data = num;
, ^3 x/ `) L' m% w1 _0 x+ Q cout << node->data <<" ";
+ F0 E( L8 |. R# R if(NULL==HeadList->next){
0 `. E, t+ C; Z8 ` node->next = NULL;
& t7 n2 J* ^4 P3 M- u1 a t HeadList->next = node;, e8 |( y. G& E. Y3 U! y5 M% R$ q
EndList=node;
; J% x8 c* n* A) d }
+ W/ `* T# U0 u1 X; Z else{! Y- Y6 v7 e B& O
node->next = HeadList->next;
0 Z# g# g5 Q; u" o HeadList->next=node;9 Y: G6 ]' K( U8 [ L6 F
}
( O" P/ f: H6 \( W. O Length++;
. A* M! I% I. k2 b2 [, J}
3 O$ e5 d6 E# s/ l) _6 U' ?& ?
& U( G4 W; m0 j( J5 m" [' c: H5 }: rvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法 , _0 R! T& E/ N- a* x1 [
node = (LNode *)malloc(sizeof(LNode));
$ o6 s# J5 y# C$ h' O if(!node){
: z. D9 ~; w$ |' p7 B cout << "新建节点失败!" << endl; ' V. O' C+ D( Z$ U) j
return; 1 }8 |% h, P! b C* a/ s1 @4 _8 D
}
; i! B* F) B; d3 r2 i node->data = num;' L# a# Z; n5 X$ {8 t3 Y
cout << node->data <<" ";; Q: n" U4 }( a5 `" r
node->next = NULL;0 K7 E! }5 j* Y1 ^+ X* {6 S
EndList->next = node;
7 ^4 Z d& h7 \% W# r; j EndList = node;
+ P) t! k3 S4 ]! V Length++; 2 K- M+ o4 @/ e
}
3 |% \5 J( k( v$ E2 v
}7 m6 l z( E9 y3 }删除节点
- A* y% ~) Q; P* a# s0 t' i: y: G: d3 Q1 s4 T4 A7 E7 _6 T
void LinearNode: eleteNode(ElemType elem){! r. [2 {8 ~$ @' ]2 z8 O' h2 g, @* N
if(NULL==(HeadList->next)){
. E( A- {( q! U0 ?$ H cout<< "无节点"<<endl;) ]4 [! e5 ]1 |: s
return;
, N* e* F. r. F2 I }
* I5 w# K+ V4 F4 A( F t3 C0 ] Node_cur = HeadList;
* R& s" {9 T( a8 `( G$ @' _ while(NULL!=Node_cur->next){3 J" B) u S5 k: }
Node_temp = Node_cur->next;
. I1 D! O9 a" C2 [' Y% b7 N) ?0 b( ? if(elem == Node_temp->data){+ }" h/ ^& G) W& l. {( K
Node_cur->next=Node_temp->next;
1 n% Y6 I% R- [. _$ C7 t free(Node_temp);
* E' Y; k; ~! @+ c$ C7 L" x' a }
4 y2 W3 Y2 Q, f' ] if(NULL!=Node_cur->next)1 S o2 z/ ^- I R% z3 U9 h# q
Node_cur=Node_cur->next;
( Q" ~/ k. z9 @ t0 T. g9 W X }
: A& Y! U6 \ `3 m# B cout<< elem <<" 元素已删除!"<<endl; 3 Q. I' t/ ]7 N. A/ l9 X% L% N, G8 |
}
; P4 W6 e0 k v5 K# j
9 i U# \: u" V1 q/ Z显示链表, K) W& @" H Q, M) o& |
. @' o2 ~$ f- s; kvoid LinearNode::ShowLNode(){: x: D! X+ w8 l, ?, D
if(NULL==(HeadList->next)){
' Y( c' m, C# M5 T% L3 D' b cout<< "无节点"<<endl;
! n# W! y$ L+ c$ w+ X+ }. O return;
% C0 `2 s6 L+ f4 N) }! C9 C6 b }5 n9 ?7 a% ]* t4 p6 m
Node_cur = HeadList->next; ' s9 ?/ O5 h/ N8 q
while(NULL!=(Node_cur->next)){
" N c6 V7 A# |2 q cout<< Node_cur->data << " ";
0 `9 s8 m/ t ^* c5 W Node_cur = Node_cur->next;
2 z0 _, o2 ^) t2 h h }& o+ L4 x: _7 w1 g: z/ @
cout<< Node_cur->data << " ";9 S& @ Q& {2 m: p9 j" w$ B D
cout<<"链表中的数据已显示!!"<<endl;* i! ~* x4 D. Y2 o3 q
}
5 K. Q( C$ J: H+ H4 x8 y, t! {) I8 n, M/ T
销毁链表. \5 Z! C6 @% T3 z
5 P7 i1 I; g8 @4 yvoid LinearNode: estoryLNode(){3 G) t0 s& L. ]- j1 x: a p3 r) o
Node_cur = HeadList->next;
9 O4 q; Y/ ]; r: p1 v9 o while(NULL!=(Node_cur->next)){! [! m& k1 p, @
Node_temp = Node_cur->next;
. j) j8 @, X% _2 t$ P2 n+ [ free(Node_cur);
; m G, M1 A7 c8 w8 o4 \ Node_cur = Node_temp;
" z6 `7 w; C( C8 \ } o2 k3 [& g; S' w J0 d' a
free(Node_temp);, b' j- D/ w7 |' L' W, P* Y
cout << "数据节点已完全释放!"<<endl; 6 W6 E7 r0 V& O6 y
free(HeadList); // 释放头节点 6 J) u" J8 R( M( L
cout << "头节点已释放!"<<endl; + Q% K, s. o' ^# V+ G
————————————————: R B+ v- s8 F# G& ~
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
+ a9 f- ^$ b1 M! b; u9 X原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
6 t; K, l. l# e/ t# L, b, q9 J V4 u6 K3 g0 k! R- D
; l1 v1 p% h" w: l
|
zan
|