- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563414 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174247
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
+ k" _" D5 l' w2 Z6 V" m线性表顺序表示、链式表示实现方法及其异同点% p$ v( A# B" O6 a$ A0 V9 u
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。4 b# H4 [. N4 p/ m# Z
5 R5 i' _% W9 D本文采用C++实现两种表示方法。
1 n2 k. E3 ^( z! @
4 M0 D6 O% J+ ?" |! M目录
1 y0 x& G+ ^) G6 e$ e6 E# F- V( F- Z0 t1 D- p
顺序表示和链式表示的区别:2 C P& |) ]) G7 w
( b2 {" K u$ ^ ]2 l* F创建方式:
7 e. L1 T( e; T/ K4 ^* o1 [$ u$ W
8 c5 W( Q5 b1 B# `/ M时间复杂度:
- j- L. i {& V: H
# `; q/ v$ a; C顺序表示和链式表示的相同点:
/ Q3 G) A) C5 ^& ^; P. w. m3 T! ]8 W
删除内存空间: p+ K# Q% `: m/ `- s3 B! p- h
% F# I7 x" o9 f5 I代码实现:
5 p; @) S) j$ F9 d7 ]' o1 ]2 e, J. l) h! D3 O: }
顺序表示方法:- y' `* n* W% i0 T+ b8 R3 V
% L$ S+ R$ o$ Y: F' {结构体定义5 g7 b$ u( r* F4 f2 w
8 U! g) J7 w3 M1 }: q0 ~; p
初始化
$ w% f9 K: B6 K+ I+ |% i; T! v& a6 x& B" c
增加元素1 }& x, Q- ]- A! w5 i7 P, D
6 [4 x3 R6 z3 l% `1 J& ?# Q
删除元素" {' W- q2 J' A* j6 |) q" V
% G6 M9 T( A/ I0 V& C
销毁列表
# ^ N/ N+ X' o
$ X% _3 c% W3 B3 e1 D8 G1 c链式表示方法
1 @2 E$ x+ F9 m6 p
* ^& Z& r$ E0 I) {) O2 c4 [结构体定义6 J& ]2 D1 L; u# ^7 L0 j# A
4 o. \0 t }+ H% S初始化
- x" I2 U3 U" m: V7 o! V$ e, l6 o# R
增加节点
! T6 t& d; l. X6 s6 a$ |
) |( ?/ G, j% u% N- V, G' |删除节点; H# j$ Z: ]' Y
- d: C `+ M; E; b5 F+ \0 \* T5 Q* i. m) a显示链表
* Z4 F3 }" V0 m' l( l1 h$ U }) C: E% W7 n! }
销毁链表" k( I5 J* Q# k& q0 y' X* b$ b" I
7 s- N! N# S7 Y. |7 U
顺序表示和链式表示的区别:: S. R- W8 k% `. G3 @
- b$ X# A' ]: |4 A6 `4 U创建方式:! M) Q: Y7 K# y* B5 W+ S6 i( G
" N% q% D9 @$ |% \- w顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
1 q- w+ J8 U9 E# ]# @* s$ ^
1 n: k# L0 y7 h3 @% q( i P. j( [(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
/ c" J& {, Q0 q/ G {
* P5 F( I7 ]' z Q5 Q链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。8 U8 a9 K5 X( b, z
7 l, {! R: m9 Y9 f时间复杂度:
: N' {' [) J& k
0 k) j2 [( {- R5 c* R) y0 \4 N6 S增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
1 |) _; I+ S$ E$ Z6 b6 ?, C& c! u2 ]. N
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)' N* ] w' W6 p% W1 U
X+ B- N# e% G) \
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
/ h4 H7 ~; _/ I' r$ Y4 y7 m p
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);9 a/ T# h( b$ c
) m1 o+ b5 g9 F, d3 E
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n); T- w3 x8 I% y2 B, O
# g" u- W0 @+ s& g5 G# j; a顺序表示和链式表示的相同点:8 G% M! ~: [3 I. b$ G0 A
' D8 S7 Z b( f/ f5 K
删除内存空间:
L" I0 u/ g3 o A* s
& j8 z8 [+ E4 F1 {" ^* |# s; y1 q- s0 L内存空间的删除都需要对每一个存储单元单独释放空间。4 |0 i9 h+ q& R! b
( ~8 l) o: Z% R- `" M9 j( s: C
代码实现:. L3 P+ e, k1 W: D7 |+ e t+ ?5 g
- a( p" M( B, W7 W
顺序表示方法:
( o1 G+ e3 r. R/ b8 L) {7 W) B# B) D% j; V6 l
结构体定义4 ?9 V. y! N3 E
, Q4 _5 p+ V5 \. @8 \, |typedef struct {8 b. [3 @* A a
ElemType * elem;$ e1 R9 M1 v; j v n
int length; // 线性表的现有长度 3 U4 {3 \" Z: B3 i q# ]4 q8 _
int listSize; // 线性表的最大长度- Y: p* |! s% d4 G+ A
}SqList;5 t* [ I7 x* |* C `
- g6 p4 |) d1 [初始化
0 o! S7 f; p+ I* A- p* a! S4 n- D
. r8 A) l! f% N) s* Zvoid InitList(SqList *L){ N' ?9 m2 P6 m( x- q \
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;) t8 Q, i% E2 S% W! A% [
if(!L->elem) {
% \4 r' {5 C+ ~4 {4 v( d cout<<"申请空间失败!\n";7 D5 h# ^" P. T3 {; X/ x
DestoryList(L);) I2 ]% p% s- A/ i5 l/ k7 }9 w! z
}0 f$ M" y- P: Q
L->length = 0;8 V+ J+ X J/ @
L->listSize = LIST_INIT_SIZE;
3 R7 D+ m$ P8 U" Z cout<<"线性表初始化完成!\n";
; M* K1 v) C" U" m}, B/ C! |* x) |# T
: k) }$ d' A" e9 W
增加元素; E# r+ Q% a3 g& r
; R1 c& E4 ] }/ m( s5 C5 E% pvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
) H+ o' m- Q% M: K, o- Y& R7 m) |0 S if(L->length>=L->listSize){
2 m; K& T) ?: ~' P: f4 E+ b L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
* v! x' g% [8 H if(!L->elem){7 U5 a9 `1 e. X' @; ?) a( u q
cout<<"增加空间失败!"<<endl;. U9 r# C+ P- a. @
DestoryList(L);
5 { h/ [9 A# ]* y& Y0 A }
- a- q; h- s0 q8 ^. ?" p/ w8 D }
1 p4 A4 E# @7 e! c. I * (L->elem+L->length) = e;" }* z/ @( i1 Q L! ?
L->length ++; # A9 \ B- q& J4 k7 ~: y. g
}
9 z5 a7 E* d8 L, X9 [6 H; f* H7 t% ?. N. F' [; c' _
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
0 f: N' @% Q f2 x, [) x2 L' B int i;
' m" Q! \0 Z5 x+ ~. h L->length++;9 I6 d8 [! I j: @# q# S/ v9 r
for(i=L->length;i>=e_where;i--){5 K+ C0 U6 k a* ?' |
if(L->length>L->listSize){$ B* h% @) `5 t
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));( q) l$ U2 L4 H3 o
if(!L->elem){$ I! H! ? ~1 }6 \3 s% n, s
cout<<"增加空间失败!"<<endl;3 P) Q4 j& M5 G
DestoryList(L); ( ^$ k$ w. p$ p; S4 m
}
: V" z6 d, I A% d# B: ^4 G! J }
" M) l; x$ s$ |% Q. U7 M: i *(L->elem+i+1) = *(L->elem+i); & M' ]2 _: t& d! \- }4 ]
}: {/ s, C, `! k4 G
*(L->elem+e_where)=e;
6 F% \+ Y+ L- @; J cout<<"增加后的线性表如下:"<<endl;
1 C( q k# w; T+ v% _# | ListShow(L);; V0 V p0 j! n2 [8 K, u3 C" c
}
0 c8 ^; \9 x$ k# D+ S2 @, S0 B5 u
5 N$ a, G- n3 y% K1 n9 V* cvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
1 O: }6 x4 m( f& S+ u+ y7 d int i;
! c# b* ~1 O5 t* p, m5 t( B" }2 T* X L->length++;
, M4 m' v, h$ l2 z5 q4 ? for(i=L->length;i>e_where;i--){
" [4 @" x+ ^; \, l if(L->length>L->listSize){
* y- n8 P. K7 U6 U L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
, B% }4 C( J4 n if(!L->elem){& _ ~4 ^7 A) |6 `
cout<<"增加空间失败!"<<endl;1 {, _) U0 Y" P8 Z# `9 @
DestoryList(L); # L! t+ t# S( h. V8 V) S. {
}3 Q9 K, m3 X I, C( l- ]1 Q: g
}3 ^9 c) [& }( F, I; B( s I5 o
*(L->elem+i+1) = *(L->elem+i);
) Y2 ^: \% S5 [4 j6 _ }+ A( d8 A y/ z4 C1 R0 e$ z
*(L->elem+e_where+1)=e;
8 a+ G( }/ d4 @1 j6 y( D+ L, Z( V( ~3 w cout<<"增加后的线性表如下:"<<endl; 9 i- q4 a+ V- J
ListShow(L);8 x' z; v$ Y1 Y! v: o- a* Y
}
9 Y+ v" u7 e2 O* X3 `- k2 F$ a( c1 \0 F6 ]8 i% `+ ^4 P" k9 z8 G: D( N
删除元素" v8 ^5 ]/ G0 g$ }# L; ]) \7 J
4 o+ } y& b% n- y$ ~1 L+ j1 r/ c
void ListDelete(SqList *L, int e_where){ //删除某位置元素
* [; I3 Q6 @! d' C$ C* e5 v L->length--;0 H. f6 Q) V$ E0 S
for(int i=e_where;i<=L->length;i++){
5 A8 N }( m1 W" @2 w" } *(L->elem+i-1)=*(L->elem+i);" {% y: G. G& w
}
0 ?# V: L5 {! p% p8 q( A# _/ D+ I cout<<"删除后的线性表如下:"<<endl; ( J) K5 G8 u. r' {
ListShow(L);
( O' R0 t3 _( ^; m}; B1 o. p0 e0 g) I3 \7 o
2 v8 ?- _- E% A销毁列表: l5 q+ m2 m5 ]3 K
r4 I$ F& o1 v* H+ f
void DestoryList(SqList *L){
) |! }- k! L2 u n% j: [# @& A int i=0;7 T3 ~# q% z/ D& G; r1 s4 V& R
for(i=0;i<L->listSize;i++){+ p. M- i2 Q f3 d) }* b
free(L->elem);8 |7 y+ R3 l' O. i7 \, G' O( j
L->elem++;' G9 ~* `) O3 I
}3 r. W0 m; i. D! B" r P+ H6 g
exit(0);
8 ^% b; z" m) ~4 j9 k4 @}
% L g0 F! Z0 I- W" S/ c% {/ @. P) c$ L9 ~' b
链式表示方法
8 O1 M# L) L6 o
9 o# ^" t- J. G1 e结构体定义
' M$ e! t7 L$ Q& Y$ t* s; o" n- J) L3 y
typedef struct L_Node{; |6 L) \) w: ~* C8 {$ T% F0 z$ s
ElemType data;" Y& i& l, c( r/ _4 M2 W Q' N
struct L_Node *next; M- T& y' L& @4 B7 _+ v+ M
//struct L_Node *last; //增加可变成双向节点 * U1 x" u2 E* b( T
}LNode;
& n) F+ M& v1 w" ]9 y W
\: W% D3 [9 U8 d% k! F) J+ v初始化. p7 c. b: }- X2 o' }" L% f0 j
' p2 q# }) C3 r0 u! \ U$ m
void LinearNode::InitLNode(){
5 x+ z7 b1 y0 w$ U' m6 S5 E HeadList = (LNode *)malloc(sizeof(LNode));
- }9 m1 `- f; n/ p; ?* I. n if(!HeadList){0 R2 C2 ~6 N x
cout << "初始化链表失败!" << endl;
7 p2 g! ], p3 K7 i2 J exit(0);
$ t2 t t3 X" E } + Q( |. v4 P- h
EndList=HeadList;2 G- b) u. U o0 |- y$ k
HeadList->next = NULL;
3 }- g1 I7 j; X, G! b cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;3 f; H. o' r$ w9 W5 k( [* G# O' K3 g/ r
Length = 0;
: u, q' b2 O) _2 G e_where= 0;
3 X2 P1 V8 F& _/ E' Y( n; W0 a}
( S0 v( a$ D. a7 w6 P; N! B% I5 E6 Z! s, W N" s
增加节点
' h z; S# ~7 c# q% }. \0 R. J
: d( o8 B' ?1 n Q" w; \void LinearNode::AddNodeHead(ElemType num){ //头插法 * @8 {* ]% e: p; x+ b! j& X
node = (LNode *)malloc(sizeof(LNode));0 s- E' L# x$ q. E3 Z
if(!node){0 q9 q& ~5 W! G
cout << "新建节点失败!" << endl;
; p6 p V; s& S return; ) W: J. k0 U9 w0 W7 I+ ]1 h/ Q
}
( |2 c6 S! K/ I* s- e+ ~ node->data = num;
) l6 t* m( i2 d! B cout << node->data <<" ";
0 i/ }' O T- \9 j: p1 c( l if(NULL==HeadList->next){' [9 i1 f! ]/ x- W
node->next = NULL;
% e4 x' T1 A1 l0 R E HeadList->next = node;
$ y% [6 D+ f* ?$ E* Q EndList=node;
! J* [- [7 F! |) x* |, ~ }
$ N8 K7 ^* y5 @6 P! V& i6 V else{
1 x9 T* y' l# m7 l: {' c1 d node->next = HeadList->next;: F( X2 F$ X3 a
HeadList->next=node;7 j* f' a2 ]/ u. }+ Y
}
* w2 h$ I: W8 o7 L- _ Length++; * Z# o0 ^& q: K0 O Z
}
: V. F7 T/ V7 r" P+ c( e* u) Z4 \8 ~$ K
void LinearNode::AddNodeEnd(ElemType num){ //尾插法 0 [% p7 P. N" U" H9 b( z
node = (LNode *)malloc(sizeof(LNode));
- s5 N' b" ~# ~6 y$ `/ ] if(!node){" ?) f7 Z( Q; m6 _; L9 [
cout << "新建节点失败!" << endl; % O+ X* {7 I0 ~8 j' H
return;
* s: ~ l5 Z' N7 K } + X! K% A+ ~" [; f
node->data = num;' P0 x ~% d5 R2 X
cout << node->data <<" ";# z. B% f' C7 G8 X
node->next = NULL;2 q v0 Q9 o' p' O! r
EndList->next = node;
: e. u8 y1 r( W6 _0 n4 z EndList = node;
, p$ A5 s) A* W9 I# v/ L. u( m0 P Length++; ' M6 q2 U; E! F: I: N
}
+ b* w+ {2 k( W& w7 A8 L% V/ d. f. \+ U* U
删除节点+ r3 q$ q! I( i
' V# b+ b) ?3 |: O u4 `4 zvoid LinearNode: eleteNode(ElemType elem){( A- V7 C$ [) R
if(NULL==(HeadList->next)){2 H$ W- Q' ?* S @& Q: X K
cout<< "无节点"<<endl;
6 _" E" i. O0 b* g8 C3 n return;
3 a# R% e$ U5 r, q+ ?/ v) A6 B }; d! E4 T5 D% p- D7 E/ { A
Node_cur = HeadList;
: x; l; R; U4 ], O" L4 c3 ^ while(NULL!=Node_cur->next){4 t1 C5 p$ t5 j) K) A
Node_temp = Node_cur->next;
& C5 p/ K* o; a! x if(elem == Node_temp->data){
. j- g1 T+ g( b, i$ d3 z9 C Node_cur->next=Node_temp->next;: Z1 d0 _: s1 V1 e8 e/ e
free(Node_temp);% ^) S8 t& ] T& v* M
}( d3 H2 N& C+ J! {; B- i( B; _
if(NULL!=Node_cur->next)
7 ~* v% Y1 M6 _8 S3 q. @; f; T Node_cur=Node_cur->next;( k U. B& A( t# o
}
; B0 `5 Y4 |9 Z" q# ^, } cout<< elem <<" 元素已删除!"<<endl; $ g0 H: } F: q" r* o) k
}
6 G. z1 h; P# {: ^* q2 S- m% X" J/ F# K* g! E
显示链表
* L- `* Z8 w+ i% v( c/ J9 R
0 _5 D! b1 G$ |! J$ lvoid LinearNode::ShowLNode(){
9 |# a& H' w* i6 {, c if(NULL==(HeadList->next)){- n5 i8 i" q3 k3 b/ Y
cout<< "无节点"<<endl;9 z+ ^, [6 `+ H5 a9 F! \9 w) R
return; . i( ^- ~3 r8 |8 S) w3 _
}, k/ ^# r3 y( f8 V
Node_cur = HeadList->next;
; T5 \4 D8 s1 e& |' k0 o) o while(NULL!=(Node_cur->next)){
9 @7 D6 y' g- x8 g' o" w cout<< Node_cur->data << " ";
- ~% \# D$ t @ Node_cur = Node_cur->next;- K6 V8 @/ h+ C ^7 G
}0 Z/ D) A6 I$ q- ^2 u) ~) o
cout<< Node_cur->data << " ";
- t# p7 O9 l5 O) z. p2 x% c& \$ D/ a cout<<"链表中的数据已显示!!"<<endl;
& U0 C- m3 _( |- T}
5 n- t1 R6 d, v9 H* P0 B" r( ^/ s% Q' z
销毁链表
! U6 M3 `0 {" Q: U, T9 i' ]6 `0 ^6 E* L5 V: V
void LinearNode: estoryLNode(){
. [6 W& \# Q' d8 v. _% Z- u Node_cur = HeadList->next; - h! S- F+ _( f- ]4 ^( }% X
while(NULL!=(Node_cur->next)){
) Z, ^' N3 ~: Y' O Node_temp = Node_cur->next;/ E% `1 T r4 H
free(Node_cur);
% `3 S! I @. }. ^) w Node_cur = Node_temp;- W4 b" C& }/ d% u {5 ~
}
8 ^/ ~8 `7 E4 c7 h+ P, O( r% _1 ? free(Node_temp);0 |; g' J& ?, k5 c% D4 @
cout << "数据节点已完全释放!"<<endl;
: \8 \/ n3 ^& A9 A8 o3 b. y% z free(HeadList); // 释放头节点
; i' E% { S# T, {, t4 c2 O. b2 y cout << "头节点已释放!"<<endl;
& [' O# X6 B$ Y) W5 G: J————————————————
3 P" \, _. p/ g$ \- {版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 H* ]9 n# o3 D8 [* T1 W原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
L" u2 q2 f% `! v: c
5 c/ m& @: U" B$ r ^3 J
0 o- o# F9 \; J' e1 b- v/ g6 z |
zan
|