在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 565678 点 威望 12 点 阅读权限 255 积分 174926 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
- Z- \3 j. S Z) d 线性表顺序表示、链式表示实现方法及其异同点 1 k. ]! I+ [' V8 a: X5 w8 \# X
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
; O' x% T3 r4 s* |& t2 [
. }# I3 z5 l; {( P 本文采用C++实现两种表示方法。" m9 Q' z6 P8 E d5 D+ h y; W @
* L. b4 q2 m; M6 q, T3 ~- Y
目录- g! |4 ?% R0 B) Q1 W/ w8 K6 K( E
+ I2 k" k X/ i! j3 D; J 顺序表示和链式表示的区别:
$ j+ d' Z! q2 I9 X* J5 g 6 ^ {' L" l) g
创建方式:
' q9 I V& Y$ O z( |
: _# o# k+ ]* r M, u% U5 } 时间复杂度:
- C' G9 c L, ]( `7 k7 O2 F2 Q3 ]: D$ m
! L; K7 k5 {6 ^ 顺序表示和链式表示的相同点:5 P+ ~2 `1 l* {. q4 t. L) Z
! P5 a' I3 {2 {* b0 A" k; I2 @
删除内存空间:) V9 s! Q, t' s
0 f+ y' }' V4 f, G
代码实现:0 I: U* m# B! d3 f. {7 J) z7 V2 Z
6 G y. G+ U5 J5 N; ` 顺序表示方法:& o- }; w4 E1 ?4 e* q8 W1 D
$ j$ E+ k5 f j: R5 f 结构体定义, ?- [) ?$ Q4 ]( u7 D, t$ k/ J
+ j# d# p, D% Z6 p' N# d 初始化
+ S$ _" B4 S8 s! A
* H8 r# d1 x5 W( s# }* k6 r 增加元素' i; `2 b/ j, F" F3 `0 I
1 F! c4 u4 {4 h6 J2 V; M* q
删除元素
. W0 s( G# A. t( n/ t
. V) d. \0 K( l5 m U. J5 V- R6 ~ 销毁列表
; B7 K) o! c8 j/ k O5 |) J8 O$ C! H w- f$ t( r( W- p
链式表示方法
. r5 _1 n- l8 D6 g$ f0 \8 F$ Z4 I4 w 2 a4 U' A7 L: H/ z; ?
结构体定义 u* N- W# m$ U, `
) K4 t1 h2 P7 N- h 初始化
2 Q' a" g+ @' _: P3 b0 @: k 0 U1 p& v1 D% [( a& e
增加节点4 u# y* L' x% U8 M4 ~
5 E w/ O9 _: x. w" T2 Z 删除节点
$ c& o* p* j5 g" a 6 e% |- o9 T7 j. J! g
显示链表
3 l; m2 n# a9 @* U
+ G5 E {* V6 \, t 销毁链表 F3 z- \7 i" s/ G
! [9 b* s: i0 q4 Z- m 顺序表示和链式表示的区别:
7 ?! b0 E; y0 M; {3 W' \* V
! G6 K6 ~7 I% V 创建方式:
: M y7 c: c* M9 {" m! }5 o+ b + b1 C5 o# j, f) z* k" o
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
9 N9 @6 a* ?2 A# z5 X |7 q* S 8 O: r' T6 x, v U4 K: W5 m3 Z
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)) T; j3 b: l3 i7 }4 t) F9 d& c
# D. Q1 _5 H6 C* P' ]& `4 R7 b 链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。; C3 B( W: T9 M, W/ m7 L" k
" m+ P) j" B% ]- V# K+ |) v. ^' T
时间复杂度:9 ^5 K% h) J! V$ s% R7 I
6 Y7 `" H) x4 w( x
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)( r# f* |3 }. c% p. A8 w b
" y8 ~, m8 V8 t: P% \8 J3 `, L1 R 增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作): I; y8 A4 v3 @
" n5 B- K5 ?8 x0 w D: J# | PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。7 z( ~# y% B4 q; I( @/ i" Y
, {5 D7 I6 T/ O3 J4 e, G
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
' M; f* A' k& S* V$ O# M' ~5 x ; ^ ]5 _) y% i) H2 ]1 y6 M& z
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
7 C! [; n& N2 X , n2 U3 A! s+ k* m) I' B, W$ ]2 O
顺序表示和链式表示的相同点:0 E9 I/ Z- u2 Z* q! `5 d
$ L Q& R3 I* P
删除内存空间:7 U v* a- ?5 s1 z$ X( \% H# ]0 q( Z
) x: m* o; P7 A2 S
内存空间的删除都需要对每一个存储单元单独释放空间。
+ u( D4 E4 p" Z# l- p& |
6 Q8 U# v g6 }3 C6 _, |& e 代码实现:5 {# M+ a) J) m) c+ |) @, X
2 ]. a' I. X6 v
顺序表示方法:0 H# T; q B* u X; s6 D
! E8 U; {. ?2 o( F) z/ N* P5 O 结构体定义( N/ o* u! X- k+ Q
# J( m6 `: Y' {! m1 p typedef struct {0 {' H0 B7 U7 L- @* S0 H; s
ElemType * elem;
% \ H: D1 O1 b8 v# N int length; // 线性表的现有长度 1 @! _0 c$ |; j; l' o
int listSize; // 线性表的最大长度& V) p* L: u# z( S: w$ @6 p2 ?% G
}SqList;6 z9 g8 }# u5 m
6 n6 e* m5 [, [% j6 L 初始化
. E% R; x0 p5 W! r B$ f% H7 `" r3 {1 I, o
void InitList(SqList *L){' C: a* E; U8 @, N( H
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
" p0 n$ _9 t6 f, p8 ` if(!L->elem) {
1 ?/ O7 b' w9 V& D* g8 a9 d cout<<"申请空间失败!\n";
) H' A* b1 i6 w- ~% _. G& ?. @# q DestoryList(L);1 q6 U$ V) x+ D% C# m( z* f
}
6 O2 v9 V8 q* z5 Z( U( L L->length = 0;
& a6 s1 B" ?4 j; q7 q L->listSize = LIST_INIT_SIZE;: G: {( N1 r2 v
cout<<"线性表初始化完成!\n";) b f6 C1 k% d( \! l
}1 M) G ~# G+ {( G; h* G, d; f
3 ?# @0 ~- w4 a* e, I
增加元素# K8 ^; Y/ b" ~' ]$ q C6 R
. ^8 l* @9 q3 T- U2 I2 g void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
a" Z# T. _ O5 G5 w if(L->length>=L->listSize){ a$ k" @0 [! [( x! V1 {! x
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));% g( { ^7 b5 B, j; ]. }
if(!L->elem){
+ I! u: W/ j3 g# [" t' M cout<<"增加空间失败!"<<endl;
- N8 S$ F3 V2 X DestoryList(L);, m- t' h3 N* B: d
}
. x2 d8 D# }* C" n) S# u' P9 k, o2 c O }
/ E: _# i R1 [$ E- N0 ~- J * (L->elem+L->length) = e;
. L! [# P5 z/ a: v$ f$ I L->length ++;
; H. o( s1 O1 B2 J- A }+ V6 h+ ?3 X& l' K% u
1 Q$ h8 o1 Q/ S Q4 P. l
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
) o) x7 }" A7 a5 o( O5 e6 W$ p int i;" y" ~' ]" N* i8 J/ Z; ^
L->length++;3 j0 U9 e9 `: W ]4 w" [6 K
for(i=L->length;i>=e_where;i--){
2 v' T; y6 d* `2 X1 B& c0 ^ if(L->length>L->listSize){' L7 i" T3 Y. C3 J* K* _$ a& V
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
* R: W* q- l$ b/ i6 ? if(!L->elem){
# Q& |' x! ]; ~) r4 p cout<<"增加空间失败!"<<endl;
/ w. g# ]- p+ U, u% u$ K6 D& e% E DestoryList(L); * e( P2 g$ q. a' V( {3 k% X% F
}
9 n% O5 { _: D. J! y4 J+ H2 f }9 L1 O. \) Q5 E* h5 F) ?; W. h
*(L->elem+i+1) = *(L->elem+i); ) s9 k; o- ^: c: C; Q2 g
}. b- r. l3 O2 x8 c/ T$ R
*(L->elem+e_where)=e;0 c& I4 m+ B N4 I. I5 M# x
cout<<"增加后的线性表如下:"<<endl; 7 c3 O& b+ a6 Y6 @# B% H$ w
ListShow(L);
. c7 F1 \; ` v1 f4 r$ r5 o2 B* { } % ~7 x0 V+ s# r7 u3 D( G
6 _6 b+ b2 h; u
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
* t3 i, `* G! r1 h- p int i;
+ ]* y A$ d" z% B8 g4 h9 h2 r L->length++;) H) w, _6 l! s0 @' Y, i4 E4 p8 o
for(i=L->length;i>e_where;i--){
7 } F4 ]* V2 T if(L->length>L->listSize){% p M. V0 f) P5 d8 B2 u
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
5 d3 D$ q: b4 h* N2 G; R+ T% [ if(!L->elem){* x3 _: a+ H: e/ ?
cout<<"增加空间失败!"<<endl;& w! S: |- O) M4 @/ _" T
DestoryList(L);
8 T ?4 m$ B. b8 B P }
9 n4 g1 g1 \$ V }
9 p6 G$ @7 Q Q" b. t1 b/ I1 A *(L->elem+i+1) = *(L->elem+i); . \7 U t, ~2 H, b8 K
}5 \. T! j2 j6 I1 b# H' _
*(L->elem+e_where+1)=e;
! K/ H( @1 l$ Q- [* y cout<<"增加后的线性表如下:"<<endl; ! v$ S: g, ]% c) d# s+ m
ListShow(L);
* j& I' @; d) b2 W; y0 E$ ]9 } }* i |6 p1 _3 s
# Z3 a/ q& a& ^* D2 q
删除元素
8 X! c+ G1 S0 i; l0 e* L5 U
( R# Q& D# o$ L void ListDelete(SqList *L, int e_where){ //删除某位置元素
" m" w; }4 K: ~% @% i9 i8 p( M L->length--;
0 y9 ], Z$ j+ e, g* M: e for(int i=e_where;i<=L->length;i++){
6 |8 G% z9 M+ l/ P *(L->elem+i-1)=*(L->elem+i);# y2 y) v$ w8 J; p
}
9 [* F) R6 a& g$ [ cout<<"删除后的线性表如下:"<<endl; 6 V J+ g8 b( H# m# \! k, I4 ?- U
ListShow(L); \# ~" b" I( X' W
}
5 j8 l, `+ R% Q1 y) r4 w ' r2 [* r I0 b4 b
销毁列表
: Y* o7 U: k6 @2 L8 N3 U9 V/ n
z6 E+ m& s5 P3 i; ] void DestoryList(SqList *L){
7 ?$ O: u4 v5 v; Q7 j int i=0;
q- M- I/ m% V# u0 d for(i=0;i<L->listSize;i++){
7 ]; z, B1 A, `1 t( g free(L->elem);0 P6 ]" n8 s' A% E( K" |, \3 p5 T% f8 x
L->elem++;
! _% S2 v2 ?* ?, K }: ~# q/ w* R+ ^6 j4 f/ @. C! [: ?
exit(0);
2 P9 V& _, k5 T* x" P }
2 H; a3 r. `2 h) e7 ^ " i) O9 f' B) i- ]) g
链式表示方法
; N+ L, u% ~0 e4 s
& V$ D: g2 \- `: ^ 结构体定义
1 }3 G7 y3 G4 i' R / H! z' R# J2 ?! u; v8 G' H
typedef struct L_Node{* S! i6 v# }/ ^ {
ElemType data;
. o% Q' g. z1 k struct L_Node *next;
7 n) N* B. g4 Z( J5 U$ H' n7 B //struct L_Node *last; //增加可变成双向节点
+ A5 P8 H2 d3 V }LNode;8 }' z5 d. D3 v5 @
7 S, }6 g; G/ ~! P/ x, ^
初始化
2 k' [6 T' E. \3 d9 V ) {5 L# O z0 {" d% P
void LinearNode::InitLNode(){
4 Y0 k! I# Z* [/ [) ?# ]8 ]5 I HeadList = (LNode *)malloc(sizeof(LNode));
. R! x, `1 o9 I' j' p) l if(!HeadList){5 ?# X+ f5 [8 }& Y
cout << "初始化链表失败!" << endl; $ A. L- f& V' P. s
exit(0); ( l" O, i1 x. Z4 B6 H+ `
} $ i% ~& f( Q5 R6 B5 f6 f& M
EndList=HeadList;' l5 Y( j3 l$ U8 |+ h0 Z2 s/ L
HeadList->next = NULL;
9 q+ d4 p. a, g( X: D cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
" ^8 `* W5 Y/ x Length = 0;" s+ E9 a+ m& p6 G# t' _
e_where= 0;$ N9 K! w; f7 `4 p6 B
}! @$ g- V+ C+ g' `0 y0 K$ d
' y' m+ p5 t! ^* P5 M G6 o
增加节点: v7 y/ j" f; K+ R1 D
7 t8 U$ O0 H: T: i3 [' q- k; P void LinearNode::AddNodeHead(ElemType num){ //头插法 # {& L# W! `+ Q- Q; v
node = (LNode *)malloc(sizeof(LNode));/ s7 B3 q, d( O- s, s+ x8 C Y- G8 E
if(!node){
& {3 _8 O( [3 k' h! G cout << "新建节点失败!" << endl; & y- W2 Z* s" Y) q: U
return; ' R8 c) y' B" V, s0 ?
} ) N G' m9 Y; X) Z$ e2 V
node->data = num;
# W# L+ ?+ s1 e: S" _ cout << node->data <<" ";
; U9 L* }7 k) p( G1 R: Q8 Z6 h3 J if(NULL==HeadList->next){4 S- }% J w, @2 l
node->next = NULL;
5 {, P' V3 w* o- ]; g0 \! n HeadList->next = node;1 A n* S7 q9 r! C8 W
EndList=node;
5 z+ A+ w" q" W* Z* B }# [8 M/ \1 Q+ Q* c+ K
else{
) h' @3 q" v8 y node->next = HeadList->next;
6 p! P7 U$ l z HeadList->next=node;
, b+ f, T$ }/ k0 w }
9 ?% \% x" c4 u9 k$ o: F Length++;
2 ~! V- `; ^9 d3 W3 y1 ` }8 y& y# `" d3 t4 e! p! Y
, g* Z ?' Z2 K8 ]( ]
void LinearNode::AddNodeEnd(ElemType num){ //尾插法
- d5 w+ K; q ~4 ]: a7 K& T+ m node = (LNode *)malloc(sizeof(LNode));2 A. E$ Z# c a2 _7 q! o
if(!node){
0 [; z c+ U3 a' t0 ] cout << "新建节点失败!" << endl;
4 n* p3 F1 e- `* L$ a( | return; " P4 L' Q# q7 x1 o7 \
} & G3 m$ C4 J" Y8 l3 a, H: v$ @
node->data = num;# L! H# x* | e! M* w. d
cout << node->data <<" ";; Q( u k0 V- ^9 d h0 R
node->next = NULL;
% O) H9 r" Q- G, A- T# k EndList->next = node;
- {7 Q- J5 _- s5 U EndList = node;8 D1 g6 W y) g7 A
Length++; ' K( v" ~1 u ^6 h
}
) L% `: u# E8 Z+ V# V ' j, Y$ J8 z a( f' d9 ~. U
删除节点& m. s: l* d2 J8 C" \) E
* }- f! r1 l9 u$ Y) b: H void LinearNode: eleteNode(ElemType elem){6 M4 ^0 t3 j+ S8 O- g) x
if(NULL==(HeadList->next)){
7 U5 E, P5 {+ {0 n5 L: k c/ R cout<< "无节点"<<endl;
" ~' w$ S$ E& B. A+ F/ }( H5 h3 B# U) U return;
^+ s) p' V$ H! ^3 o- q }
8 J/ V3 k: `. U/ B; i' Q Node_cur = HeadList;
- m2 Z9 m7 Q+ ~ while(NULL!=Node_cur->next){* }6 g, G3 n) F
Node_temp = Node_cur->next;
5 N2 E8 g$ |/ F5 v if(elem == Node_temp->data){
/ g* L* m, e. R4 n; L Node_cur->next=Node_temp->next;
$ @# V! U$ |) X) k) y6 b! v* T7 K5 Y# k free(Node_temp);
3 y) I7 i: k1 f# M) q9 r4 Z }, `4 z1 H9 M9 F1 w* l8 U: ^
if(NULL!=Node_cur->next)
) r' c; s/ z2 [3 k' k Node_cur=Node_cur->next;
$ w4 T% ~# X0 ^- K! n+ l }
% T6 n4 f9 N7 t5 e1 a* J cout<< elem <<" 元素已删除!"<<endl; # I$ A3 ?9 X( n4 @
} ; \$ P, B" v/ N1 g
5 m3 I% d+ I% B; A5 K* L4 v- g0 o
显示链表
& k& u9 D" t4 f 9 X. y- N) [: u% }, U5 I
void LinearNode::ShowLNode(){
7 z* x/ W G# D1 C4 V if(NULL==(HeadList->next)){8 B: U6 c) D+ W. v$ v& K H
cout<< "无节点"<<endl;
, E& r% {/ q' x% } return;
c4 l6 {; Z1 Z) F$ K" S }4 f+ D& d0 M; z
Node_cur = HeadList->next; % M/ p4 |* T. S/ s1 }6 k; I( m
while(NULL!=(Node_cur->next)){
9 w' J+ | \/ m& G5 n cout<< Node_cur->data << " ";
9 P1 ^/ e; L0 O* `7 c' ^ Node_cur = Node_cur->next;
3 @' a$ t' |* l7 C+ ~' S! B }
0 T: G+ c$ ]% _" h% y v cout<< Node_cur->data << " ";
* K% y) B3 E: o+ @! H cout<<"链表中的数据已显示!!"<<endl;
, Z* J/ t, g$ a$ Q4 t }8 }; s4 V [* P: D: Z
2 z) y* R W. `/ @8 s" x2 P$ R
销毁链表% f. F4 l0 V5 c6 f2 g+ R
( c$ @# i5 h- c3 D# R6 Y7 Z
void LinearNode: estoryLNode(){
3 C% R0 P2 q2 k! Z& G1 Q Node_cur = HeadList->next;
1 o( r% k( F! A& e2 C" x6 V while(NULL!=(Node_cur->next)){ o0 _0 a3 K: e5 D9 O7 u+ P2 u2 i
Node_temp = Node_cur->next;9 w8 J) n9 Y! }+ g3 [
free(Node_cur);7 b0 a2 p. P G! f o% i" F7 `6 h% ?
Node_cur = Node_temp;
F1 T) q( K# Q; a# X1 } }& L. ^5 h5 w, P* c; E
free(Node_temp);
6 a% [3 J) K: N; T6 S4 k cout << "数据节点已完全释放!"<<endl;
' X# N0 u/ D8 \% H L* H free(HeadList); // 释放头节点
+ k% j' M, O4 y) G cout << "头节点已释放!"<<endl; 1 o/ s# e+ y7 F
————————————————0 l! G: \* M& A5 p5 P* K
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; X: o0 |0 {' ?. J6 W# N 原文链接:https://blog.csdn.net/Baimax1/article/details/106036286. K. ` _; A. Y$ u
% u# b) y( |* t8 T$ q
( U' ]/ p( l5 f% o* {3 u. u0 M) V) m" u
zan