在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564687 点 威望 12 点 阅读权限 255 积分 174629 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
0 w& m0 Z9 M; p5 a# x; h9 y4 c
线性表顺序表示、链式表示实现方法及其异同点 ; l# ~2 f1 r' r$ j, I$ u* P. ^
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
. J/ e( G# o2 ^
i+ k7 \4 _# c2 O5 E 本文采用C++实现两种表示方法。
. E4 B" z9 @2 f) k. ?2 U
# [0 f4 X5 C6 S! x i2 m" w 目录% P3 s# {# O- b( ^ {& Z5 A
, X0 X8 n% f8 H 顺序表示和链式表示的区别:
6 _2 D$ [' E. [
3 w$ u* K8 ^0 ], w. c+ x 创建方式:4 ?8 P5 X8 J% D% E# K, S) o
( ]# m$ e) a9 q/ i, {8 H; Y3 ] 时间复杂度:- E) ~1 `7 ~4 J& {: F$ X/ R
7 U$ v' f# O3 z$ I" [ 顺序表示和链式表示的相同点:* M$ a" @* R5 w, o- t& ]) i( z. M5 h! S
* r! w+ P. X# b8 J8 V6 H 删除内存空间:
, y$ n( z8 W3 }
; q" J5 Y5 J: p' t: x9 N 代码实现:
& u) \) W0 s3 m% f' ], I6 N
& X# `( O B; w# Q, X- ^ 顺序表示方法:3 m" x; F7 L" N+ o- B; T
) N6 N4 S) Y4 b" v 结构体定义; j; z C1 |4 g' u/ d! }
X& o4 _' p8 C4 |
初始化8 N1 h; R% M; b) [* K
9 j2 h5 ?1 a. ] 增加元素
0 E/ O7 D: D4 a- F% X ' W! y" h4 B/ [0 W
删除元素
4 i& q u) T8 ^0 q 5 E* I: z0 Y& N+ f, t
销毁列表6 [8 B* [; I: N1 k: [- ]( m. a
; h( ^! x( M$ @; q/ ? 链式表示方法
1 i/ ?7 d# k, h. l ]9 J ! a Q6 d- [# f. a* `
结构体定义8 z8 j9 N( U$ h0 F& m% x; X
* M8 w! f7 W' L! R) j k 初始化
6 a# ~( E. _/ Z. x4 ]$ E7 { 9 c7 _, m+ n1 c
增加节点
" ]8 z0 `9 \, x! W- f6 } 5 v. v: T. R. Q$ s& M
删除节点6 M; f" K. C/ H' f; x# A" V
+ {, c: g: o- O6 i3 H1 ~
显示链表
. ?: J( v% ?1 H8 T3 a$ B( |
* Y4 \1 f* E- F. o% [6 ` 销毁链表- w% P3 T7 j+ ^& l
9 x7 O- y8 g, {
顺序表示和链式表示的区别:
3 S: p1 q, }+ T1 f
2 h7 t5 i3 n% L( z8 K' ? 创建方式:
% [/ |0 W) e" N$ h) r0 t" l / |; |, R! U7 g5 e4 o0 U3 ?
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。8 |) Z2 C5 v5 D
C$ k* Y8 d% o4 _5 h' _1 i9 E/ i
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)" a3 w: E, U# I7 q q p8 _
' @0 ]' e0 P/ b- }1 E y, r
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。: q% A& I+ w( M0 f. o& r0 x! B4 R8 d
- C; N7 T0 U M) C 时间复杂度:
3 H( q, i M" m' c
' |8 h$ K2 w. z# [, a: @' ?( z( h 增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)/ l3 z; L$ Z" ~( q. F. x( I
; d6 F R3 N" K0 r 增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)$ a% t) q0 p5 O" z: p6 U
. Q+ ^; Q# i9 L+ u& U- Y PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
6 k) T" ~+ Z1 Q! l. J/ F' A / F9 O1 ^# ?) ?* r8 |1 B% U1 O. x
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);0 x8 N2 |2 @# h/ F' e
- p$ Y' w( ^& E: \$ O0 I
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
) u) b" J( [6 N! r; u3 T& K7 B- y
' y& i+ @! F% w3 M 顺序表示和链式表示的相同点:
# Q3 M7 ~; M% f4 h9 {. L
- e1 i! A* c: r9 H3 I) k9 O+ L( ~# | 删除内存空间:
/ m& V' v; ^7 E3 z5 H. q Z2 ]
3 `; D: S1 f4 v. U 内存空间的删除都需要对每一个存储单元单独释放空间。0 |* O5 @7 ?7 h
; w2 d7 r! I s4 G 代码实现:
+ X, ^. S4 n1 d2 y# d
: k h# X% d. j) E6 y+ o 顺序表示方法:
7 |3 l9 O7 y7 O6 Q( B . E8 R) z6 D- r1 b; \- }% @! n
结构体定义
* X0 ~+ \: A, v* |8 a( G; I) W
' D R, w/ a5 }5 X3 n typedef struct {
8 a9 p+ |: Z" \" u ElemType * elem;; M' i. K8 I2 D: T1 K
int length; // 线性表的现有长度 9 I) c1 x, W6 F4 D
int listSize; // 线性表的最大长度% C! E& D& G/ ^3 z; M I W+ U% W9 [. V
}SqList;
0 s- y7 F$ N/ m6 @, i' {/ \$ a" ]
( L$ w( }3 y4 [ g 初始化5 d/ F/ Q6 M; C( {
. f) ~/ e9 L0 v# y void InitList(SqList *L){
3 j( _, L5 u: S: k1 y; w L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;$ B/ j3 v! F9 u
if(!L->elem) {
5 z3 \- K6 I! P* [4 _% C cout<<"申请空间失败!\n";/ n( v4 W& P' {+ i- A/ |( d
DestoryList(L);
" t* A7 x$ f' k }
0 w# \: n; a/ a8 w+ a& I' B L->length = 0;
0 L# O7 O4 Q7 D- X9 _2 B L->listSize = LIST_INIT_SIZE;
% I* L, r; E; L, t cout<<"线性表初始化完成!\n"; N2 e4 D: t- {
}. M0 S, F. l- e, M6 ~& E! u/ e
6 i3 _3 `! \9 g; D) O: E- S7 }" K$ E 增加元素& L6 G; Q- y8 N
( _% z1 n- q7 Q& }( {$ V; |" I void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
" j4 F p8 z$ P0 S, i3 c, L D0 j if(L->length>=L->listSize){" M( Y/ R/ i& k: ]7 y
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
! H+ m! d- N6 F% Y/ T1 \% P* x if(!L->elem){
) b/ Y6 F! d: b( k- U/ a cout<<"增加空间失败!"<<endl;. T6 J, A; w2 b2 [
DestoryList(L);5 V( A; o& j/ _
}
; j4 [- Z! `2 l4 o }
- ~$ p6 r1 Q! P * (L->elem+L->length) = e;
6 d. ]! _% r! ~0 l; w; n6 v L->length ++; 9 q0 N8 \- W4 R* G& d% P
}
6 f) \- D+ e$ j8 O8 e2 [" P5 w3 D/ y+ D
0 n1 _+ m, J" U void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素5 h; D/ S$ L' S+ _& A7 m0 G; N" Y9 ]+ ?
int i;; X, O) M8 m3 C
L->length++;" k3 C. a$ L* j
for(i=L->length;i>=e_where;i--){
0 W1 n+ W9 [- d2 x# m if(L->length>L->listSize){
% {. R7 u- F& J2 e {$ X$ u1 } L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
" ] W# t: Z- h5 j/ F if(!L->elem){
& B7 b" g( h7 v! U cout<<"增加空间失败!"<<endl;
3 H. M4 k: _0 l: Y DestoryList(L); 0 [3 e6 h- ^& n
}! A" g$ H8 {3 ^: `
}, r1 s7 T' L0 Q& r8 R1 P1 a, `
*(L->elem+i+1) = *(L->elem+i);
( w0 K- x7 q7 H& N }9 P! \9 ~4 S5 F5 N6 U2 U
*(L->elem+e_where)=e;% \5 Z3 x: i# S% m( _* B p3 T
cout<<"增加后的线性表如下:"<<endl; ! \0 I( I; B. C
ListShow(L);
9 k0 O V) ]* m: j; `8 j# c1 H }
) V$ [/ a. Z2 j
& Z8 V. [5 R+ ^6 { void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
4 O5 q' ?' w& m5 q( f! e+ u8 o2 B0 b int i;
7 g0 z3 r% C8 \/ q* D/ ] J: a L->length++;+ [5 F5 I3 h- A3 d1 O0 e
for(i=L->length;i>e_where;i--){
0 L* q) i1 G. m* D if(L->length>L->listSize){) L% L0 z$ e3 r7 A
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
7 X+ I1 T- }5 l if(!L->elem){0 E+ U" u3 Q) \) e: x4 A& S
cout<<"增加空间失败!"<<endl;
2 Q+ ~1 w, f& B! D7 a3 p& e. O DestoryList(L);
; t% S& d2 G: q3 F# m }1 p. F3 [8 q, Y' E
}
3 h- u! p4 s3 j0 G *(L->elem+i+1) = *(L->elem+i); 8 d$ h. S* y n: n
}
* x7 h# M4 _- C% ~: G% y+ J *(L->elem+e_where+1)=e;9 C" c/ |# R4 K3 [7 B
cout<<"增加后的线性表如下:"<<endl; 1 F$ R, ]- `% F0 G1 Y, j3 Y8 N9 N
ListShow(L);- P8 ^4 |' Q. l" u
}
. o8 V2 N& E2 a2 x/ s& x5 W + H& k' y4 ~' C, ]3 m/ g. a0 o
删除元素
& B, U$ |/ U0 U6 y. n
% x& y: K: D- B- D- ]6 q void ListDelete(SqList *L, int e_where){ //删除某位置元素
( f/ m, Q9 B S/ Q! S, y L->length--;% d8 M1 c1 l0 V1 R
for(int i=e_where;i<=L->length;i++){7 k8 `( V4 ^: N8 A: i
*(L->elem+i-1)=*(L->elem+i);: N0 I# x F; j
}
' }' x2 ]: ^9 Q: H6 Y# { cout<<"删除后的线性表如下:"<<endl; ' X6 b( j9 i$ G7 s; w
ListShow(L);- z. B' @0 O3 c* [7 O* E
}6 R$ T7 y$ L- z& Z& r& e; F
+ c* R. V) i8 f
销毁列表
9 i$ ^2 p9 F5 }4 ], l1 D' E % e4 W8 N& W- I$ P
void DestoryList(SqList *L){. ~7 x# X1 `- q6 U$ d7 U
int i=0;8 a. q' d0 a9 `3 N5 B* A& O
for(i=0;i<L->listSize;i++){( O/ A1 i: J$ r
free(L->elem);
! J1 a) r6 d: }9 U0 y1 @ L->elem++;, v, f7 @8 j' y$ i' z/ r2 w& M
}- l% s$ G. e9 y# Z9 u
exit(0);
- y) D' x9 M& Q( I( f& Z$ P* ]6 r+ y }
% V& ?8 K0 P' ~9 Y* z/ S% z9 S 1 ^. d( F9 N; J, ]6 Z. F
链式表示方法
% \8 F! s0 G) u( O, o
9 g/ p+ T( Y) J& W2 L: v N( B K7 @1 j 结构体定义
0 _5 P+ y7 |, x8 l1 q - @! \% @- j# [% R2 l( c
typedef struct L_Node{
8 d8 P; c' ]9 a; }$ z; E2 k ElemType data;
" F- @; k% r1 C* j4 S" B4 s struct L_Node *next;
1 b5 N, {$ ^5 d9 ] //struct L_Node *last; //增加可变成双向节点 ' P% C$ r' c; J& E2 M$ U3 A: |+ l
}LNode;
5 _8 W9 m$ Q7 n6 s( q6 o+ n2 ? 3 x3 Y( k+ _5 V# }* B; x
初始化
8 ~2 h" N- g. M, h" i0 e. m, D
. q& `* R, \& r4 G$ J C8 b! ` u _ void LinearNode::InitLNode(){
+ a8 B% X) E2 w( y% D3 m HeadList = (LNode *)malloc(sizeof(LNode));% U( h- E: |2 M0 {: `' l
if(!HeadList){
. O: \9 M* H! Q6 ?; j& i cout << "初始化链表失败!" << endl; 8 b7 m. r( i8 K x, l8 C, Z* I
exit(0); * L1 l* K; K; K
}
& e: M7 E' L8 h EndList=HeadList;
# n$ o. O k; f8 h8 y+ C4 y HeadList->next = NULL;
% F8 g/ j9 F) |2 C, o* K' Z+ t6 [ cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
) N& E' H- [$ O9 s Length = 0;
3 ~$ [( \( y6 D. n7 J e_where= 0; A9 k' G7 r" E9 [$ w. f1 y; d5 W+ N
}
4 N( O4 n/ v* i% k8 w; h% Z , r. R V3 P+ g% U" B
增加节点
1 {: x& v0 @& J0 F" g1 q
4 V' ]+ u& N6 l! n# |0 B void LinearNode::AddNodeHead(ElemType num){ //头插法
! l3 F1 T& }' [# | node = (LNode *)malloc(sizeof(LNode));2 S- F5 m( g: K1 D) T
if(!node){
% E" p* h2 J2 y7 q+ r$ [) j# y cout << "新建节点失败!" << endl;
- D; c% Y+ h# S, i return;
# G) Y7 x; k9 R5 P0 j0 v4 z9 V } + _5 L: F+ i& J! Z+ C
node->data = num;3 p! ?8 X2 x8 w& ~+ _, A0 g( G
cout << node->data <<" ";- L! f4 e h! Z. i7 T# \8 T, q
if(NULL==HeadList->next){6 T4 U) I }5 X4 v% d6 u/ [, U
node->next = NULL;2 T/ o/ G/ h* {0 Q/ L
HeadList->next = node;
. |/ X3 ~7 g6 ? EndList=node;
1 J/ }2 R% E; l }+ P. \6 Z) y( j) [9 q
else{$ ~8 l$ R. ?& [* _2 [
node->next = HeadList->next;; D/ ~% V$ ~9 w' X
HeadList->next=node;
6 Y& b3 J7 n2 V- C8 D }" M8 b6 c+ f; t) X, `3 A) q
Length++; . K1 x3 A5 ?' N5 a* Q" ?
}
9 V& T! R/ [9 I0 X2 L$ q
% M2 [6 i+ ~' I4 u5 p3 f8 y void LinearNode::AddNodeEnd(ElemType num){ //尾插法
5 ? V' s# r- a+ U node = (LNode *)malloc(sizeof(LNode));
4 Q8 r; L" q/ F8 c1 ] if(!node){! M3 ]# b, t" S w$ S
cout << "新建节点失败!" << endl;
+ ^6 S p# u; Z! P return; ! O6 L5 F0 m- ?# ~' x3 f) E% e5 E
}
0 k8 c, o. n; p. |& U! F7 o+ r node->data = num;
* J4 U+ X' g' G6 P8 p cout << node->data <<" ";. V" ^ r _5 q6 l. l
node->next = NULL;
! v4 Y5 U) G4 k" s3 M2 _ EndList->next = node;4 X+ F1 y- H$ I: I1 w( F
EndList = node;
. x$ K+ [, m5 Y: E: L* x Length++; . l+ {7 u! w% U
}
k; F6 ?2 a: B , E# J& v# s3 N5 K2 u, R
删除节点/ M- |) t3 ]1 S8 k* r" e) G' h4 @
8 X# L# y% }' N; ]' x8 j void LinearNode: eleteNode(ElemType elem){( U# j: C; e. ?/ s
if(NULL==(HeadList->next)){3 z2 ~! e+ y6 H. z6 I4 X
cout<< "无节点"<<endl;
" ~- ~: T7 u l f% ? return; 7 g2 T: B9 G; l& N& s* T% ~
}
! ^( n# C& u1 R Node_cur = HeadList;
6 C& u, J1 ]7 s* \9 _7 S/ f* |- \7 H while(NULL!=Node_cur->next){
* {! L7 Y) w* h( j2 Q9 D Node_temp = Node_cur->next;
( h6 [/ i& w. r/ J6 J if(elem == Node_temp->data){+ U. N0 K5 ~, B% A" N5 M
Node_cur->next=Node_temp->next;
' x) O# {) ?4 B8 |" Y free(Node_temp);
. F3 Y: `, {+ S2 Y$ u) ]6 I! E2 a }
" p3 J( _: F* R, S' t8 V/ \ if(NULL!=Node_cur->next)
* X; x! L2 n, k7 [: j8 i- N Node_cur=Node_cur->next;
. f. {3 l5 o& a$ d3 q/ t2 m: l4 C# p }
4 f3 v5 m- p$ c$ O' I cout<< elem <<" 元素已删除!"<<endl;
# B; p, s H1 l8 ]! D9 T8 x }
3 Y2 L* l) z; M9 W! N, J4 ^" Z) m 8 p# ^' Q3 Q3 x- m0 i E8 P, E
显示链表
3 j. r5 q x5 t2 n8 C& f' N; i
! F1 I- p D6 @" w* {6 c$ ^ void LinearNode::ShowLNode(){
7 l0 }4 L& U# J" _4 w if(NULL==(HeadList->next)){) o; W- n3 o3 w1 I7 J
cout<< "无节点"<<endl;* A3 s% _0 k; b2 d
return; 3 N& ~( O ~ D: Q D) K- Y
}: ]5 v' D3 T" f2 o: m! a4 Z7 S b9 |
Node_cur = HeadList->next; ) j% }" ?! D0 k2 y
while(NULL!=(Node_cur->next)){) `) G! Y( g3 |# j1 _3 k7 o# ~( Q, Q
cout<< Node_cur->data << " ";$ N! r% M1 g: Q0 w
Node_cur = Node_cur->next; M3 ~! z3 \! ?0 W( D2 h& S
}/ m" f6 W+ m7 W) V! o t: c' e
cout<< Node_cur->data << " ";6 d" v1 _# `* H3 o! [& E
cout<<"链表中的数据已显示!!"<<endl;+ a& l; w, r: S4 E" ^% Z3 Y5 e1 i9 V
}/ L5 ~8 J* @( F2 C4 X5 o3 X( t
& i! M( @6 b; C4 ~ Z
销毁链表7 d- d/ t7 K8 `1 w! |
9 |& @; [ X( E7 m: Z
void LinearNode: estoryLNode(){5 t! s4 O- S" }2 _5 f1 \
Node_cur = HeadList->next;
; P- y' c: m. _7 Z& t0 P* v while(NULL!=(Node_cur->next)){
" p+ h/ B4 Z$ L& ~9 f' C Node_temp = Node_cur->next;
6 }9 D5 m7 m/ R$ U( p) Q) h# ~1 y free(Node_cur);
8 Z/ j7 x+ t# |- F6 M" Q, D# s5 m& q Node_cur = Node_temp;
+ e7 p6 x% g0 r: ^. H+ @2 E8 { }
( J( p' r1 F* o9 @3 m, ~, o- Y free(Node_temp);2 z7 e/ W5 _, l1 ]2 U& k% N) B8 g
cout << "数据节点已完全释放!"<<endl;
; I" w. N8 A% q7 o free(HeadList); // 释放头节点 |4 d* ]$ I, s" X
cout << "头节点已释放!"<<endl;
; @4 @7 |; p! ?+ P ————————————————% R! k2 [6 n5 g" N: F2 t
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) u( x1 g" S" [ 原文链接:https://blog.csdn.net/Baimax1/article/details/1060362869 Y- @7 O: K( V3 z8 o- y
# M; C1 p0 t: S: i1 N$ s; l$ m# P : d1 A4 I: w( m* p
zan