在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563400 点 威望 12 点 阅读权限 255 积分 174243 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
# S/ A" Q# K/ p a! A7 e 线性表顺序表示、链式表示实现方法及其异同点
" |& n l6 \. P2 l; @% ~. b: w 线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。( ]0 J; M) s r( `2 Q: v4 [+ u0 t1 H. `
, T% ~" Y d) F+ G 本文采用C++实现两种表示方法。
9 Q6 s2 e8 D* d/ \# z ! [( o1 U( b H# q8 e. a
目录# A1 T# d7 W7 L) q7 C# u
: @! q8 p9 ?" D" I0 ]. T u) i
顺序表示和链式表示的区别:2 U% h ~& P$ @2 Y; I0 D
; f$ v$ Z5 d5 C) D$ V
创建方式:
7 O. I! T7 I+ q4 L; s
8 }, n. L! H2 H' C, t. c7 m" H 时间复杂度:
R# U) y- |# I% W4 f1 q
: Q* A" w, J/ C5 x; } 顺序表示和链式表示的相同点:. c# |) `8 J6 U7 s
0 Q% [% x+ C8 Z
删除内存空间:! f5 B+ | S& d8 x P
' C& @! ]) t& j8 ^
代码实现:
3 T9 W/ _% y' G* u b- D& C * z' U/ V3 v& ^& H
顺序表示方法:6 y, b, a- R( u$ \
1 Y$ u7 F* f9 q. \4 b, C
结构体定义
& l2 S3 j* n9 G
$ q! d) k6 I) ^1 { 初始化
8 |7 s( u$ |3 |5 f
$ }5 G* J: {: H+ i 增加元素7 Q) \4 T$ Z9 Z. F
' G0 \* X& }% E0 P
删除元素& a: a2 F' [" K& ]& m
1 o8 X! O, g9 O/ J" I- w. K
销毁列表
$ |" ^5 {- ]; r J" r2 j% a8 |
' L3 x8 k+ B+ ~- C6 |/ v4 _ 链式表示方法 o1 e0 Z+ W- }7 I% V
) u8 E- B) M( @8 U! W6 Q 结构体定义
! J& P" X/ \, Q& A% V% J ) V+ B7 r9 N2 e& L n I
初始化% X! f1 C# ^8 ^ |) z' b4 r0 D
8 F9 K& N* e* N1 H 增加节点( b9 S( T/ g3 `8 V6 |* J
3 t. a! G$ E. R1 T$ M4 c
删除节点8 `% |; L! {0 [- d2 B
; V8 [1 j1 G6 W5 E- p1 c# X" ]2 p; i 显示链表
7 B' {, \* R3 w6 c, q9 O
4 v$ O- J# `7 _+ U 销毁链表
3 D' ?# r0 Z7 E8 h* D8 a8 N 7 V# O e) {+ Z. _: q1 z- y
顺序表示和链式表示的区别:4 m! e- q* P! W& e) j+ U' ?6 t
' b. C0 ^% g. t" U6 f
创建方式:+ s7 v6 k8 v; b) m3 X/ Z
: A, H7 {( }" y T. o, c7 M; c 顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
( @8 [7 A# Q8 D8 X3 W x2 V
0 b, u, e, \5 K2 m; n+ U6 I (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)- V2 ?& d0 K# T7 \+ u/ H5 n- }& W
# O0 b5 X Q. K0 M 链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。2 g0 s' {4 D6 ~8 d% f) @; x z
$ `9 X# I1 T6 V3 o5 j0 T8 K 时间复杂度:% l# d5 g1 Z% F8 g' h, i2 g% ^
/ z6 y2 {9 M! W& D' K 增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
- m8 M! d- z3 F . G; D. s. B4 B- u+ d3 K( ^
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
% c! s& ?# P; ], P" z
- X( K: D4 \ Y: l6 c* P$ }) a PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
/ x0 i7 I$ Q* q2 B' D4 x
- w, M/ D2 R: h1 D 修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);0 P; i; E: J+ a$ A$ L1 p9 Z
4 W6 o. ]; D3 | 查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);( n1 ^* {. y# B# |5 Q6 g
! Z" |& H8 s, x( J% o* G- E8 |5 n
顺序表示和链式表示的相同点:
]) E7 D5 l$ `2 W
8 Q" v2 m9 a) ^* O, ? v' W 删除内存空间:
3 l. d9 D, B7 S" N4 [: O L( p% Y9 }6 L7 [0 l# ?% i
内存空间的删除都需要对每一个存储单元单独释放空间。0 h, X8 C& M7 p/ V# u% w4 D
9 u0 o4 p9 S- k5 ~; v& D 代码实现:4 z4 I0 L6 E& P+ T
$ z6 n3 n$ t. Y4 \
顺序表示方法:
0 t- M, R t7 \4 S& z ( ^ W/ N* Z4 Q
结构体定义& ]6 } t0 A0 f/ e8 h( a9 d
& z) U: I' T! A3 R- d5 Y typedef struct {
% @1 W+ d7 o! X* b8 F" p ElemType * elem;8 A- m/ O& \4 X$ w1 K
int length; // 线性表的现有长度 % _8 g1 j" V: z: P3 J" [/ [- V
int listSize; // 线性表的最大长度
' B J$ \4 L$ j) D0 I }SqList;
, l( m% w0 e' {) U ; U& V% E3 K0 [* s9 M: Y
初始化0 d) k9 J3 y0 [: g, F6 S# f! m T, J
( G e$ n! e" H: d, k0 w void InitList(SqList *L){2 o/ Q/ V& {4 R. M1 F9 v3 O# r! k
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;; L, m$ b) G: U5 ~& K( i
if(!L->elem) {3 O7 |0 S9 n* [5 _
cout<<"申请空间失败!\n";9 X2 S, T7 o n% q2 x" k3 ~
DestoryList(L);* x, b) D& r U: R0 K, ~) s
}6 c# T. E" V t2 K0 q3 G. U* }
L->length = 0;, w8 y( i1 M5 D) E
L->listSize = LIST_INIT_SIZE;
E$ g" ], W- E% l cout<<"线性表初始化完成!\n";
, l' \6 }; T: f6 l3 J }/ u& N: e+ @3 x
* z% C0 g8 ^" w! H& k6 E. N
增加元素
, D4 S, m& U4 w9 r ! G4 I8 A/ y+ y2 o5 ~9 p5 Y
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素( z; s+ c1 e. q! ^! d! R K0 }
if(L->length>=L->listSize){+ m6 g" g$ T" u' V" N
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));: Z: _; g+ W$ ]1 s& N$ \0 F! y/ P8 X
if(!L->elem){! E) V. w |" ?8 d6 G
cout<<"增加空间失败!"<<endl;
; |$ V( ~4 {: m. e! n! f7 T DestoryList(L);
$ y+ O* z" e5 z0 Z3 z3 O }
+ _% `4 f' d% t1 J/ i4 W }3 D C2 I% D6 L' [
* (L->elem+L->length) = e;
) g4 o9 f! Z7 X. D! d, S/ b L->length ++; 3 ?, }& n' V+ k+ M! ?
}' O: l3 ^& | {, G* a
4 o. t2 _ H5 y& P1 F" G: K' q0 a2 h void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
! k( O) @( @- b1 [- K int i;' {/ X; }# f r
L->length++;
m$ o6 o" e' } for(i=L->length;i>=e_where;i--){8 ~6 M/ a) t0 J3 ?/ g% {. O
if(L->length>L->listSize){1 D9 x9 \7 T$ e' W
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));! ]6 ^1 V$ j, z% Q# Q
if(!L->elem){
: l. M6 D& _; ` cout<<"增加空间失败!"<<endl;3 b1 i, o% D! G9 e
DestoryList(L); 2 _0 {' H1 {9 V y9 s) @ H
}
: f H; `! h% M5 f( } }7 [/ t- j! T0 q! A* g' G( B! D
*(L->elem+i+1) = *(L->elem+i); ) v. x- i4 o9 ?0 u7 f) K
}
. O, o2 _& w# R* Z/ Y3 x *(L->elem+e_where)=e;; a8 y# ~* r0 W8 ~# ^
cout<<"增加后的线性表如下:"<<endl; 0 H6 ~4 a, U3 |9 _; d% q$ j, B
ListShow(L);+ O' \& R3 I8 v! G' k2 D& r* x
} 6 F* {' [2 o; E, e" Y' \( ~2 [
- g# s; _$ y7 r% t9 }% o# [ void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素4 h* r5 N% t+ X; L
int i;2 B" d- [8 X. ?* m3 w- o
L->length++;* L3 k5 o b' @' h8 M
for(i=L->length;i>e_where;i--){# O- H1 A% e* a9 |
if(L->length>L->listSize){8 ^; D7 }4 Z3 ~4 K
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
P" ?. C3 Y U1 W2 u2 | if(!L->elem){+ D. ] E0 y# ^. V& `: [9 k8 r3 d
cout<<"增加空间失败!"<<endl;
& G: @4 W5 M# Z% T' Z z DestoryList(L); 9 ]2 h; D7 j$ ?, y1 Z+ L( I
}+ e3 O4 w, Z2 x- o
}
+ G- r, x) O) H. P *(L->elem+i+1) = *(L->elem+i); 1 X+ I( @, e+ L" @- y, J e
}# a; e: }8 ?1 Y" u+ t: Q
*(L->elem+e_where+1)=e;7 K8 g' d6 k9 [! O" @
cout<<"增加后的线性表如下:"<<endl;
: L( k* V6 O7 c ListShow(L);1 i2 M/ _4 R/ f% x- A
}4 O9 z0 y8 H# {4 c% X
( u: R Y; X3 d; ]- Z: g; g
删除元素
) N: m: F% _9 P2 [) G 7 {- x% x I* I0 M) y
void ListDelete(SqList *L, int e_where){ //删除某位置元素
; B g' ?2 M/ ^1 `5 O) v4 y( f L->length--;
3 \) w) A B: s2 s! F) _ for(int i=e_where;i<=L->length;i++){. J, T' A# J( q% N E
*(L->elem+i-1)=*(L->elem+i);1 ~; P- Y: ^- O3 I" X5 J3 |% \; v
}5 V, |/ }8 z' ~! n4 V
cout<<"删除后的线性表如下:"<<endl; ' c, W2 [# I4 {/ y* q* o. j+ N
ListShow(L);- B, c# I# B X6 N9 X+ z9 D
}$ g, \6 F& \# b; B9 D2 G0 ~
0 X- ~) @! F7 J4 x$ R4 m 销毁列表
* q: Z* \, v1 _ ], S0 R/ f! X
& Z5 s9 ?. O& |3 ] void DestoryList(SqList *L){2 f) E% A& n4 _% ^/ g
int i=0;, i' u! N. [; N) a! Q
for(i=0;i<L->listSize;i++){
! ~$ O; \$ B: \4 ~' Y8 [5 W free(L->elem);
( \2 I9 A. t9 W5 n# z L->elem++;5 c2 r# k3 @2 H- M# H) n! {
}
5 _& X) t7 k# L exit(0); 2 K& ~6 y! Y( S3 k( V# v2 K, F
}
3 h) _" q9 |* O: [' e8 Y7 j
6 q8 W; Y9 P+ v; d 链式表示方法
0 s1 X, q; i8 k# O3 z' b
# _& w7 E* T) C7 V) a! g, r 结构体定义
( p$ F+ g3 N% c7 A6 {2 J0 p
5 s1 A# o4 e- e4 M1 W5 c typedef struct L_Node{! P! p! T5 i( H2 v
ElemType data;. T; O) f% P' ^* B( Y% q# x/ C
struct L_Node *next; h$ o+ g, I a( R. p
//struct L_Node *last; //增加可变成双向节点 1 c1 n( i+ ~8 s! L# W: y
}LNode;% K+ q, D: y- j) K, [' p H1 V% {
/ P' F( O0 e4 B/ D5 g% \ 初始化7 \) y" W1 G5 X0 Q, e* K$ i# n
% T5 }* U5 B8 i7 Q0 ?
void LinearNode::InitLNode(){9 T5 z0 p' ], M. ~9 T0 G! E1 u/ {
HeadList = (LNode *)malloc(sizeof(LNode));3 l% G8 V% n. w6 m$ G' w/ t. p
if(!HeadList){9 @0 `; a7 p8 k: `; \0 _- V
cout << "初始化链表失败!" << endl; 7 N/ B0 A( ~( J( v/ Z/ E6 ?
exit(0); " a7 s b6 n5 O
} 4 b& C2 X& Q& q" {+ m
EndList=HeadList;
* m1 n/ B l* X4 ?8 o HeadList->next = NULL;
. a: t2 f! _% O6 ^) L cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
5 G% b5 l6 {& _, B) K5 v& e Length = 0;
! G, _1 m9 Z' J6 h [ p e_where= 0;
0 g+ i6 c" u( l }9 }" W+ |1 T9 N2 t
- z3 @! [: O: n 增加节点" g% x; @. H/ M
* g& a& o f2 M& y# h- _ |* @ void LinearNode::AddNodeHead(ElemType num){ //头插法
* B/ {6 C6 m4 u6 R8 c node = (LNode *)malloc(sizeof(LNode));; M; R. M% f, S
if(!node){/ l; j4 Y4 P0 o3 f: }( Q/ A0 z
cout << "新建节点失败!" << endl;
* Z! n" P) }; R1 {1 S3 {& j return; ; W" [& G- j. q
} # c3 {0 J& x, d) Z8 u
node->data = num;
' K8 j+ K8 V7 q* g C4 B cout << node->data <<" ";# \9 n9 n8 N4 ?9 v$ @0 F0 K" B4 q
if(NULL==HeadList->next){3 D* o# k+ H- V
node->next = NULL;
) g7 M& |. k" d2 ?4 ^& N HeadList->next = node;
5 |6 j6 z* W6 i3 f$ ?! M EndList=node;
) I3 Y/ a/ Z# m) I# E1 H! z5 v4 r }) \ u6 J( z! n7 U5 r
else{6 G; f8 {" \8 e: R
node->next = HeadList->next;
! I8 J! J$ u2 |5 Y' h HeadList->next=node;
: d" {: K! \1 m4 t- J" p }4 M! Z. X, a: l
Length++;
: u+ H* i R6 _0 R }1 _- }' L2 D2 B. O
& D& Y. ]2 i- Y+ J- p void LinearNode::AddNodeEnd(ElemType num){ //尾插法
6 `8 T4 i4 k/ M8 ? node = (LNode *)malloc(sizeof(LNode));
/ j' m5 Z3 A8 K/ @ if(!node){
' R- B6 w$ P( O( Z' j; I1 d cout << "新建节点失败!" << endl; $ q! F/ b ~0 H3 W# \2 A
return; / Q9 i5 n1 M+ c; Z( r( {! T: b4 |
}
( f! o! ~: j, h$ u) s: d* b node->data = num;
3 ]2 T* j6 D" Y6 X1 v* |" G cout << node->data <<" "; e! [ I0 U9 e" L5 `5 R+ ]
node->next = NULL;) Z8 q# k9 \: d% A- {: \$ y+ q, Y
EndList->next = node;
: k! t5 p$ W# _9 D5 ^( X( v EndList = node;
6 k& f* l6 F1 ^8 Q+ l Length++; ) t" X- K2 `. \, y, P
}$ a4 u" H0 X9 K9 X0 U
Q2 r* g; ]! [; K 删除节点* ^' k4 e. u: v1 q- a# b8 d/ h2 i
5 Y: i1 s- ~9 p$ J+ Z
void LinearNode: eleteNode(ElemType elem){! N$ x$ V$ y6 X' A
if(NULL==(HeadList->next)){# X% E( |3 B5 I4 T
cout<< "无节点"<<endl; j$ d" E) Q* t V1 t3 L% {
return; & h" z+ {& C7 E& d
}
- w- E' o& X$ H- F5 p' o6 s7 { Node_cur = HeadList;2 n$ e2 y% m0 ?, z9 D3 g
while(NULL!=Node_cur->next){
% f, ?4 L6 o( H7 A$ Z3 `# ~6 ~- z Node_temp = Node_cur->next;
* }. G' x% o1 \0 K; v4 _6 { if(elem == Node_temp->data){; u; z" E9 `; {* k5 M @8 m& F
Node_cur->next=Node_temp->next;7 l j s5 c: D/ h v
free(Node_temp);
8 {; }, [4 G9 A! m }
& t# g4 |, v' a4 A' t if(NULL!=Node_cur->next)4 i& Y5 c9 k0 f2 i; \- n, F: u+ @. r0 ]0 H2 i
Node_cur=Node_cur->next;
. ?3 D: b p. d$ @8 \$ Z }
6 Q/ t% o& w. s7 t, i cout<< elem <<" 元素已删除!"<<endl;
) ~! [9 c: O, U' S% V4 \# p( g }
' s$ [ _9 O2 V- o/ I
. t# v9 c t+ K/ f 显示链表$ b7 j3 ^& F' R8 L$ g% z! J9 `& V
& H7 F5 |! ~2 W+ m6 I void LinearNode::ShowLNode(){
" f( s/ Y4 q" u% U; G if(NULL==(HeadList->next)){& d% j' W- q3 ?6 L$ E* C
cout<< "无节点"<<endl;
0 z+ }5 M% E0 W$ W0 f- } return;
. G% W |7 a8 M }
+ R: D) g) v3 I2 [7 ] Node_cur = HeadList->next; 4 h, x3 a' U* o( h# z
while(NULL!=(Node_cur->next)){; e- n, L0 `' x( i
cout<< Node_cur->data << " ";5 M/ b$ j0 i6 q, k. \
Node_cur = Node_cur->next;
6 M" I" W) k; k0 G9 E0 i }
1 P4 C U. x5 i' R; M' W cout<< Node_cur->data << " ";( |/ ]( F6 Q+ E. ]$ r
cout<<"链表中的数据已显示!!"<<endl;2 W% k* c0 E3 P$ y
}
9 j+ G% N4 S) j( [2 s
( }& Q9 j/ d, ^9 b: l3 q 销毁链表
! X p: c! |+ E, X. d ' [' M" d0 }! d' h6 O
void LinearNode: estoryLNode(){
, _( q/ j/ D6 A& Q1 [+ W Node_cur = HeadList->next; ; U$ w& S, D' e R w! _$ {, q
while(NULL!=(Node_cur->next)){8 b* I( Z0 c* \; F7 q0 Q
Node_temp = Node_cur->next;
3 C) t( S2 d: B5 X7 I4 y8 M free(Node_cur);, I i, B$ {4 d& r) f6 p' w
Node_cur = Node_temp;! [4 g4 O6 G2 ]
}
1 C. R! K; s; Z* U9 l! G0 z/ s free(Node_temp);
& k4 ]; I7 K- m; z# W# H0 ]7 z cout << "数据节点已完全释放!"<<endl; ( v2 M3 x: N6 W1 Z
free(HeadList); // 释放头节点
: }. B" Z8 V' w& u/ |7 u9 _3 _ cout << "头节点已释放!"<<endl; ; I" g+ r: m+ I1 p l$ V% {4 ~
————————————————
5 r% R) l9 Y/ k! }- M 版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 @2 W! ^4 ?/ O; L 原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
$ d- n3 a M" Z9 e5 }, [, J; b0 s. R
! K4 \8 F4 ~- v: Z
; R" v, B! A: [. z! Y
zan