- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564647 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174617
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
5 @- F! a3 [6 [+ S线性表顺序表示、链式表示实现方法及其异同点( I7 z; j% p( }' ^. V
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。; s/ a3 q2 j0 [: a! X' Z, s/ n5 j
! E) G+ b3 B7 ]4 |
本文采用C++实现两种表示方法。& ^" k; H7 A8 @" J# [: z
6 \6 G& u5 u; Q: {/ b( H1 m目录8 |" P f* W7 Z) X: `. M" v- K" r6 f
! c7 W8 ]8 t1 J% b( H' O顺序表示和链式表示的区别:0 b$ B& B$ L6 q' z/ `9 |- N1 E! U* r
! v/ ~; C( x0 T* q3 A, A, Q" r9 h创建方式:) h" A d" p7 O
1 w6 h( N% v' z: @9 [
时间复杂度:
, V! \% H4 E& E( ?5 @% z+ n [# d) ]) V8 X- G3 y
顺序表示和链式表示的相同点:
- q. V- m9 s; G W. I0 w/ o- l& E4 N% Y; W+ Y4 h) v. S% W
删除内存空间:. @' z& i" S; q- C, H# @
7 e2 j5 e- `& a- T- Z
代码实现:
& p3 v8 l8 B) F) o W# L7 s5 {2 J2 T& I( a
顺序表示方法:% C e2 l: T* V; p8 K
& e; Z! {3 i( h! g6 I结构体定义
2 e" M3 R7 w9 }8 p8 j
# E/ N5 `! \3 T r+ Y1 @8 R6 w初始化+ C; E7 }2 C1 j5 `- u- e# U: ]6 B
$ E/ [0 x- s* J2 Q3 p
增加元素
5 M# ], C. O4 `: E) D+ ^; C" ^0 R+ j$ ? @& T
删除元素" _* G% \; E. ?' M$ L
0 c7 i& d* G& v9 C/ R销毁列表5 J( r: r; z! t7 a _2 Y
$ U" Y# z9 S2 V! \9 O; ^链式表示方法9 f+ c" o0 f5 C" E
! B- p' G" ~ X% B) ^4 }* V6 _" e结构体定义; }& ]. G. y* T5 r( M: }
, O$ M* M7 o t/ {3 b- r' F9 I初始化" Q k. u* c) C2 l% R
+ X: A' z7 m& ]8 W# @% a; J0 o+ ~
增加节点
0 l7 {( M" K% M8 H9 M: j# m
( l9 F, j! U- t- c5 }删除节点
5 X5 p1 u) E3 m o& H) M$ H/ O0 @8 K j6 k. [6 v. ~# Z
显示链表
& A4 Y+ k x/ R0 d/ p: C! g1 t
1 H6 c* j* p: B; L% O6 B- O销毁链表
& `8 _, U$ \% `9 x( Y6 ~' ?4 s/ V! V3 S# M
顺序表示和链式表示的区别:
2 F% C! E# i! M& N+ u+ [! B* |; l: X! M4 B$ z0 ]; l
创建方式:$ G! ]9 |1 A# A" O+ m! }
* x, T$ l! b/ f ~) t0 f5 i
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
/ X: { S' q! ^% [- n, G
* e8 K+ |. P* X(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
) }8 ?# S- ?& z8 n5 w6 C6 b# D; U
. B2 E$ w: k" `$ }$ z) F( T! ]链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。7 c4 b5 ~% H' i
" {- l2 Z$ N+ w& @' T时间复杂度:
+ u! @6 _% V+ r; C- ^. `( O% w8 L2 g
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)$ T/ E: Z- @8 C
5 K+ |9 J, E. V; w9 q* `
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)# q6 S2 f8 l, p
( L4 v; n8 m ` OPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。8 H Z# S4 S( \$ A- ^
, p1 y7 z: @9 E4 d* |# ?3 Z$ K: }
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
- a% f2 ?& [* b7 j3 J: h
' e$ `& @3 i3 m( D: B- a4 y查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
4 F, {* P( j+ q
2 V/ c3 V. I& _; r/ |8 f顺序表示和链式表示的相同点:
" r/ Z2 L8 k' z) x) n P l @! [+ E# j# n8 C3 J6 P# `
删除内存空间:4 u/ I0 r5 F: }- w
Q! p& o9 I6 L+ q内存空间的删除都需要对每一个存储单元单独释放空间。: d# a9 q$ \0 j: O5 \0 z
8 Y+ ~- y7 o& t% J代码实现:) L5 b9 [* c6 L: v/ g. `. G9 L$ p. b
3 G: a4 m. G+ Z' Z) r
顺序表示方法:
; U8 j6 Y; G N5 y7 l6 F9 ?- Z9 C9 r/ ~. w" W& W' d/ W
结构体定义
0 g5 ] W/ A6 n3 q5 X6 s& }5 o' \5 ^1 N/ u
typedef struct {- A; S# Z4 _5 j) V) O
ElemType * elem;2 S1 `- x0 ?0 ]8 J. Z$ E) V
int length; // 线性表的现有长度 % D; E0 U/ t- Q9 Z4 K3 ^
int listSize; // 线性表的最大长度2 I6 t& X9 C) ~1 A5 J& N
}SqList;
1 M2 ]7 O" y, y8 w$ ^/ e
$ @+ n$ k- ]9 I; {3 K1 L& h初始化) {$ K. x. G) _) _
8 H- I9 E5 e" I6 F {: u1 Y$ C
void InitList(SqList *L){
) J& b7 {* ]+ b X1 D, f L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
, u0 s- Z7 |7 q& `( a if(!L->elem) {9 N/ a2 O! F2 d Y: x" z
cout<<"申请空间失败!\n";
7 s$ u/ c: M- d8 B2 ~ DestoryList(L);
J" O ^7 e! j! ] }4 F' s: w: J& L, r5 x
L->length = 0;
d5 m9 T% \6 c1 C5 ` L->listSize = LIST_INIT_SIZE;
" D2 {2 [% S5 S1 n) N) u! d9 e cout<<"线性表初始化完成!\n";1 o# d$ N) y" Z$ O7 b1 Z4 d; M$ _
}3 o8 o4 I+ A4 C" q3 } ~
+ ^6 ?0 [, C1 w2 I0 `: X7 e9 N) G增加元素/ Y/ e; ?- c/ D6 n0 h
6 U2 n4 X1 K9 s# @! {& w
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素( ^5 K7 J$ v p C2 ~
if(L->length>=L->listSize){
% {" E# u1 W G. k, M$ P8 Z L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));- f7 O- D1 t5 `- E$ C! x" h
if(!L->elem){% R, u2 e0 b+ s. N
cout<<"增加空间失败!"<<endl;
% u# J ]- G: r DestoryList(L);
+ ^ s+ h0 r [ _ }" ^& f$ z+ G3 z0 m& D
}
! t0 @: d& H: r% `* [ * (L->elem+L->length) = e;
$ ?; h: W4 v% t L->length ++; & i" [! _( F$ X. H: f# _$ ^" p
}) L/ b$ t9 z1 O! x+ S
- t8 S9 g9 v9 Y) e$ ?% W# Ovoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
9 X& M5 W1 @: w' e' { int i;
! u' a( S' l, Z, l9 ^$ [1 S* y9 g L->length++;$ _* r& }/ N8 z. I+ R8 [& M! z3 x
for(i=L->length;i>=e_where;i--){9 T) h0 O' C9 S( A3 S
if(L->length>L->listSize){! f+ ]2 N9 L6 Z
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
- N* r( Q/ @# `. u0 Z5 ] if(!L->elem){
+ Y# r7 W4 Y" q& |+ G cout<<"增加空间失败!"<<endl;
; W W1 T* d5 T" c DestoryList(L);
3 _5 H8 @/ g2 Y% B$ m }
0 D6 m/ J) y" y6 m/ f }% l+ r1 P! Z* ^( ]: I Y
*(L->elem+i+1) = *(L->elem+i);
9 V4 j, }7 b3 Y( h/ ]4 y9 U5 h2 N }
. D; q% v0 p% i, H% V+ Y$ s, o *(L->elem+e_where)=e;
A; ~8 G0 |6 b cout<<"增加后的线性表如下:"<<endl; 2 C$ v: h! B3 K6 L( }" z
ListShow(L);* H- {) c/ J n H, O0 X
}
1 M W( o( b# p2 K, S/ e6 c8 _1 Q- u; W. ^4 o2 s
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素" q! T5 d r! [2 c- q* J
int i;
* d' ^4 a" J @+ B7 M L->length++;8 H8 x! `7 \; m7 ~! Z+ k4 c9 N$ k' O
for(i=L->length;i>e_where;i--){/ A1 S$ t9 d% ^* Q8 B9 [; c! [
if(L->length>L->listSize){
% H/ k7 r5 r1 x' |, Q* g6 v r. x: P L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));2 [0 G5 ~$ g7 _6 R6 `7 E9 L
if(!L->elem){
+ a; X1 @- y0 ^2 K# W# w, G, K2 k cout<<"增加空间失败!"<<endl;' X5 d+ [. p" k/ n: O3 O
DestoryList(L);
. t/ Q1 x6 M5 Q7 P7 s* | }0 U) a* c- p; x, C7 G/ c1 F) t
}
! I0 C2 ^$ U! z$ V) R- l* M5 l: \$ A *(L->elem+i+1) = *(L->elem+i); % c/ u8 H# w, `6 m' o4 S
}
# I4 J& B% D8 I" @' v4 ? *(L->elem+e_where+1)=e;
% w+ H3 V1 q2 I cout<<"增加后的线性表如下:"<<endl; % M! |% P/ L# k2 Z1 d
ListShow(L);" }$ D- P, m, Z" Y: ?6 c
}
9 `1 `" j& z9 M2 [ p5 W; W3 y- c+ K( \) o/ K) p
删除元素
& Z: b, F& y7 h/ S3 m+ Y
4 a+ v0 r$ H: O' i" X2 Cvoid ListDelete(SqList *L, int e_where){ //删除某位置元素
/ H6 i# M2 C1 x& e9 W. m7 \ L->length--;) e* L e/ H* C- E4 `
for(int i=e_where;i<=L->length;i++){2 e6 a( m# M) {$ K0 v6 S4 P. w4 g' c
*(L->elem+i-1)=*(L->elem+i);" }" f. ^% d! J# D
}
. m! k8 s# I+ h- H' f cout<<"删除后的线性表如下:"<<endl;
# o6 `9 @* @- g+ L6 `9 q" C ListShow(L);& K) D9 q+ ?- Q3 T; g* ?$ q" z2 g
}/ [6 m: E# I' H$ j% F3 P4 [' d
! `1 w. W: G+ y5 x销毁列表
. S# {- c, I1 } j- Y; U! b9 L& l" j3 ~5 U9 B- P& H: V
void DestoryList(SqList *L){
9 r+ W# N8 @& `, x& { S! U# d int i=0;3 l; W7 s. ^4 ~' [( \) v% z
for(i=0;i<L->listSize;i++){$ W8 |3 j7 p; k/ v
free(L->elem);
2 s2 l6 y: \, _4 u# n' ?$ o- f$ d L->elem++;* K+ Q& G1 S7 N1 O. v
}( t# n; u4 Q& |) h# Y
exit(0);
; t. N9 E& \" Y% x, w/ J& D+ O}
' _/ X6 q- _" j; h! g; o; @
7 u, v6 e' N( C8 f9 i7 i+ u链式表示方法
$ T, A) r# d6 A! E& Y$ E
D7 Q7 x* j6 s$ j; ?5 I( n' w/ s结构体定义
5 L; T" j% I8 Z3 ?" j
" E- O F* w4 i& B* f7 r8 C0 Otypedef struct L_Node{
% t' ?% Z' h# n# h l$ b" r! o( l ElemType data;8 y, o* c) l. C4 N% F1 q3 A
struct L_Node *next;! _* l. l9 N- M+ a
//struct L_Node *last; //增加可变成双向节点 - b/ X% B8 q! ^
}LNode;
' j; _. s+ C; T
6 U: n4 V5 [) c初始化
# h! a" o0 I5 K! N" |% m: j& J1 b: e* ~3 K
void LinearNode::InitLNode(){
8 ~, h" B2 B8 A3 M( ^ HeadList = (LNode *)malloc(sizeof(LNode));
# J, o& ~3 O: W, J; S0 m2 i5 I if(!HeadList){
* i. ]1 K6 z% |8 x cout << "初始化链表失败!" << endl;
- o. c3 i+ m5 |3 B$ K( `. E exit(0);
. A5 t: c8 J- _" `0 n o } ; O; f9 [7 }4 r5 z. ^. d+ Q
EndList=HeadList;" k1 X0 W, _4 |( P- l2 y
HeadList->next = NULL;
3 R. A4 \( W8 V3 m2 p" U cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;3 v# X0 i! D( k
Length = 0;7 @5 ^% |" @6 A8 r
e_where= 0;4 W' R( z0 c& x$ k; q6 e% m6 J
}
( R/ Y" ]4 |* v: l
) [7 t/ v9 X8 e. J! z增加节点
# J- ?& p0 ?4 F# U' b! k+ g
# C2 }: i2 k0 ~' J: @# tvoid LinearNode::AddNodeHead(ElemType num){ //头插法
" Q- N2 v9 t! O! z5 ^ node = (LNode *)malloc(sizeof(LNode));' \' r* Y! O3 `6 P- s3 o1 ^6 J
if(!node){
% O0 ]* v* ]5 H3 s6 n cout << "新建节点失败!" << endl;
( v* K+ \, f) ` return;
! O o# {" C* z# z } - `3 Q" O' v" I+ S* x$ y1 a
node->data = num;7 `3 T$ p# u# K+ ]( U4 n1 D
cout << node->data <<" ";
# ]5 L. _; Z! T/ o! N5 q; g0 k if(NULL==HeadList->next){
! W7 U1 \, Z) W& @# r node->next = NULL;; @$ W- G- L( v3 {+ k
HeadList->next = node;
' s/ M0 W6 {& ~* i/ o% ~: r EndList=node;( J' a" v1 N# U* N0 h4 d8 H
}# d% C$ E+ h' ^$ S. B y3 d1 y
else{
# ^# h0 J( o. n1 b) M# H node->next = HeadList->next;) _: z( z* J. d% W4 G
HeadList->next=node;& P0 ?4 ?( o8 b
}+ i4 t) z3 Y& r
Length++; 4 K7 @: o c; x3 o- [7 p
}8 K) c" j9 Y! x2 X& [# L* q
, Q7 L) y% A) \void LinearNode::AddNodeEnd(ElemType num){ //尾插法
- f4 p: J: M+ K0 ?5 k node = (LNode *)malloc(sizeof(LNode));* D9 G+ ~* o V* w
if(!node){! l; b1 q L" M7 h% C
cout << "新建节点失败!" << endl; 6 d& R9 E, M0 v7 @- R
return;
! d8 W3 Y$ S2 Z% ], g+ c. f }
2 [$ E9 ~! I$ ^4 r node->data = num;9 p; q( z/ H, h1 @
cout << node->data <<" ";" L) V2 Z8 U- H4 T. {# B* W
node->next = NULL;+ _9 s& O! X3 [$ n9 n
EndList->next = node;7 r0 f+ o, H& X1 B, v; {& v/ U
EndList = node;
( z6 {( P: _8 ]# l- ^* s' i Length++;
1 W6 k9 ]. W5 q' F/ \}( z0 I) N1 \' Q, X l8 D! n8 I
& |) ^3 ~: t1 O a7 S; H, s删除节点+ M% {' O/ L: D8 N. K. ]; Q# R
) O; G, u/ b" X; {- E4 A6 fvoid LinearNode: eleteNode(ElemType elem){
( y+ O6 E. h* v6 o f if(NULL==(HeadList->next)){- A, _& Q6 |0 ?0 ^3 y, ~6 l, r h& Z
cout<< "无节点"<<endl;
. b: O6 \& R5 A! r2 O return;
6 _/ g2 X0 V( `# ~9 Q# k, n }
$ B: T4 [8 h# i" W& z# N Node_cur = HeadList;
/ L5 t! Z2 C d- _0 B6 F& n while(NULL!=Node_cur->next){
( Q, K4 ~3 }5 a! A Node_temp = Node_cur->next; ( Z" o! L( s7 e! ?
if(elem == Node_temp->data){ Q2 v" Y0 I) ^" v4 H
Node_cur->next=Node_temp->next;
# u/ m( O f2 b3 m& }9 ` free(Node_temp);* \' n l8 \* k% m6 C
}; H" y6 A x& u S L( Q
if(NULL!=Node_cur->next)% u: G0 M- E+ _( q* e7 h0 e4 ]
Node_cur=Node_cur->next;
# I: K# C- D5 G6 O" G; q }
- U$ F& H3 }/ e% L/ {6 _ cout<< elem <<" 元素已删除!"<<endl;
+ W' t! v! m y, h8 i2 r3 e+ T1 J! y7 w} 1 d9 a6 e: N" x5 _9 k* m" R
& {! F' _ g; `3 A& [# W) ?8 u显示链表
2 w- z: u( D' e9 }8 ]% ^0 D0 C- l
) Q+ T- j. e e$ ~8 p: kvoid LinearNode::ShowLNode(){4 X# D0 f! [/ J2 h" f
if(NULL==(HeadList->next)){
7 H# u# d- t2 x7 g cout<< "无节点"<<endl;
. y1 `& ^3 J6 \! N& C' G: o3 u return;
5 k9 r0 u* P: _. q- U }
+ {3 b( v4 x5 U2 M9 }: U Node_cur = HeadList->next; 8 K9 f6 ?8 A, J( L
while(NULL!=(Node_cur->next)){
8 S2 y7 H: |8 O+ U1 ^& p+ l cout<< Node_cur->data << " ";0 U$ |: l& h, d S9 \8 f
Node_cur = Node_cur->next;5 b! S- i: B3 a' }' B
}2 j {1 z8 p2 Z- P/ m/ \3 Y. a
cout<< Node_cur->data << " ";2 s( f* O/ n1 O! n& q' g
cout<<"链表中的数据已显示!!"<<endl;2 c; D) s P8 H2 [( q4 p) Y
}
$ e& o7 k% f) I7 A( e1 B V0 i8 E6 q3 c6 j! J
销毁链表
4 ~ a. M, e8 z! m( y1 a6 `. x6 Q1 R# }
void LinearNode: estoryLNode(){' [. f- ?) n: _: B: _! H- x
Node_cur = HeadList->next; % w; I' i* X# t, t% p8 g
while(NULL!=(Node_cur->next)){
& |/ s) ?3 F8 R; n2 ` Node_temp = Node_cur->next;
0 | l6 q" b d' y' X free(Node_cur);) b. o# u E3 B( l
Node_cur = Node_temp;8 `* i9 e% i5 k0 @5 L% g& t2 Q, P
}
4 [' n% P, m1 s/ X4 h) j free(Node_temp);
2 m x8 M( S+ j r0 G4 a cout << "数据节点已完全释放!"<<endl; 2 A8 h) o) p7 K+ \+ l- k) C
free(HeadList); // 释放头节点 $ o( f! ]6 f, L$ T' H$ F) d
cout << "头节点已释放!"<<endl; # O- O, {" C+ _1 b
————————————————
5 ~( T5 Q5 \( e: ?3 B) l- V版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 ^7 z$ i3 G/ ~- q% a
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
! T; R, d% U% I, N6 {7 j' i3 h! ?% K4 K P
8 T/ p* O8 B5 F6 I7 t
|
zan
|