- 在线时间
- 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年大象老师国赛优 |
6 q& ]9 I- A5 o% o线性表顺序表示、链式表示实现方法及其异同点 b& ]4 q* J; j+ s! R# t' D
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。7 ~3 L6 R7 s* M6 N0 m
6 k9 W9 C9 a$ T本文采用C++实现两种表示方法。7 O7 L9 i& @9 s7 G0 e" I" j- E5 m
6 k& n q2 ]# u+ @; W7 l目录
" u" z5 W3 Y/ E# ?3 w: a5 ?0 B& a( r8 s5 i0 P1 Y. d( Q5 a4 A
顺序表示和链式表示的区别:* ~5 l3 J1 l9 n( V) s/ L, P; V
& P- a' {/ R% }5 a7 ^创建方式:
' }: `* i4 m/ [ a
, C' {& W, T8 k$ w8 H5 _时间复杂度:2 W4 P, W2 F' c: n; j
$ i2 H9 B4 c7 G1 _6 i/ \顺序表示和链式表示的相同点:; G( x" J6 u" t" Y7 r( r9 m
8 h/ C4 e6 n0 Q& t; y删除内存空间:
- y" W7 g9 \5 C/ |2 ~
/ R( n g( Y' s/ B5 B% N代码实现:+ i1 V- X- P) Z3 _
& F U" q T8 i' u顺序表示方法:0 v n' n0 J8 `4 W" |9 F* K
' b+ z+ v& P: ?5 `
结构体定义
, C: c5 q( ^4 D }( s0 I3 Q; ?
# |/ D+ [5 h% _6 u: m1 w# p初始化
- S& v) W Z$ b5 K( E' t
$ U+ f; |' ]1 O$ H( e增加元素- @! _+ g7 s( }6 q0 g8 R: R4 z
) B) h% e' [+ @5 y删除元素# p: \4 b% K, i6 \2 p- R
p" q9 W$ Q" c5 u
销毁列表
1 B5 T# |* s( E9 A, F/ _: I% {8 S
链式表示方法* C( U* O; w5 t% A7 o
/ a+ Y" S4 }& y' c( z, H( J5 {' @- d
结构体定义
3 q) s6 p& K- p% E% L8 I0 m$ C0 b4 _0 q* C& H) b. v J
初始化4 C% q8 P1 z& }' @) t( b
8 |+ j% T/ h3 G X
增加节点
# y. i# g9 o8 F( k6 Y1 e6 j3 `' l5 d$ ^% |& e
删除节点& l: Z2 I* X# q
6 P7 e) X' s( r$ R. i显示链表
7 D4 W8 b) [' W9 l3 C O7 {; p; k4 v/ s; P* N% a- o
销毁链表
+ k! C! L+ o* C: a9 S$ A/ x( e
4 M" R, F6 m) S [2 {顺序表示和链式表示的区别:
% o( Y* ?. |1 L% C* @$ }* K0 b2 T9 e) n# W- n; _: i, a
创建方式:
* u6 b. I ?- K& y5 o. `! s! Q1 ~+ L' U. s7 k1 y
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
7 l3 F* i5 e# p5 ?+ ^0 }" h. x( f+ j( r& g5 h* S w: v
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)2 D/ e6 s) G) T) e- I! \* z- F
2 z2 r8 |- L( c% s$ p$ A链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
7 q5 C- ], h1 G) }/ [6 {- u) Z8 p" K4 i6 ]7 S( W
时间复杂度:1 X/ a/ O9 k- O- e
/ z4 [+ m* y* V4 o增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)' o5 Q+ }* Z5 s7 p5 {
# v M" x; W0 u7 h
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)0 U! r3 B( j- Y& j3 ]
* r% ?9 ~( F/ j R( IPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。# ?+ D6 _) ?. D L
9 ]7 }7 M8 Z6 P2 t" `4 Y
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
6 u" T3 k1 f" e3 H' v
g t6 ?# I5 S% B3 l查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
- Q9 a) j3 T% o. {& I& y* h k& F
* `" R* l6 M' ^; @# n顺序表示和链式表示的相同点:
! Y% x2 t# O* w4 Y, g4 S: r0 N9 x& |2 `( t4 F% P* g
删除内存空间:
, N& J% k" M8 I# r& v4 V1 F2 p9 v, A G/ E
内存空间的删除都需要对每一个存储单元单独释放空间。; |0 x3 \3 h4 ^7 n; ^' N, [. `
/ [) z9 q" V# l; V: M/ T
代码实现:' z' `0 Z [1 e4 I; j
1 C* ~; M- u f/ C5 X& A0 r顺序表示方法:
5 x% v t0 U! S! }/ p6 H# n
' k+ q" O5 m$ E F2 [% P; v' [结构体定义, e4 x0 ]$ U d+ g
! J7 U+ _5 l4 J$ {% z
typedef struct {
) Z3 g9 d* W$ I1 g ElemType * elem;: K9 Q0 s: w( ^2 S5 P$ U$ i
int length; // 线性表的现有长度 3 h% \8 P, H: G, x" X# o
int listSize; // 线性表的最大长度
5 I% `" L: S$ r0 S# o& b}SqList;
7 S8 S2 C) Z" l% ]- E& e/ P f2 f9 t
初始化
/ L6 \% h2 ]* T; H& w1 u! |7 Z4 g6 b8 D9 E0 L
void InitList(SqList *L){' R" Q; ?: K! X) O- P& R3 k% O
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
' |" U2 K, Y( Q if(!L->elem) {4 A! O% h: W5 n: k! I
cout<<"申请空间失败!\n";
w" a' ?$ ^- h: U8 p DestoryList(L);
, s) O- }, s; K3 Q* U }
) b% Q4 y, Z8 Y% a L->length = 0;
8 A" g9 e8 m" d a6 \: g: J! q L->listSize = LIST_INIT_SIZE;
+ R' V P4 b0 J1 \. {! ?: q cout<<"线性表初始化完成!\n";
" W, e8 f6 k$ f$ H4 Z% e2 f$ J}7 A4 B; }) a6 `; C8 B
/ s( C" O/ c! ?9 @, E
增加元素
) r+ m5 w% A7 \, f! `" q6 _
. o0 m$ |. A$ S1 u0 p: Nvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素& _/ a/ y* y' L. ^# Q. y" U: B" A" j \
if(L->length>=L->listSize){
6 K! u4 O0 ]3 |% t L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
' C" B% g, u: _$ d9 E if(!L->elem){) p% _1 y6 O6 m+ X
cout<<"增加空间失败!"<<endl;* _% y$ M9 M0 ]* H
DestoryList(L);
1 H9 C! T: R6 X* \) f: g H Q }3 G/ i$ o* m# v0 ^" ^
}
" F" o8 D$ f2 h * (L->elem+L->length) = e;
6 h( s. l8 p' u/ E% l+ Y8 |) T L->length ++; 6 x0 R9 D! R+ n# \3 k
}
9 h$ n2 v: X6 U2 z& V/ W1 W
0 F o$ _4 F2 r- ~" H! A& N- Kvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
' ^( _! c# T& \" @9 |3 b# |' I$ h int i;
0 e( D* Y4 x( [' Q& ^ L->length++;( M% [$ H; [+ c
for(i=L->length;i>=e_where;i--){6 s& a1 a5 W' |0 Y$ F
if(L->length>L->listSize){1 [/ l1 A# i" B
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));/ x, _& |: y! ]6 d$ e
if(!L->elem){
~* o) H4 y/ O- p2 \( s Z; u cout<<"增加空间失败!"<<endl;
% r+ ~+ _, n; A2 D DestoryList(L);
+ K6 T8 @. |: b$ E }
- K- \+ |* q% q2 z+ h$ ]3 n, l6 H }2 N$ i* ?, [# U7 b1 Y- L* H( P
*(L->elem+i+1) = *(L->elem+i);
' ?# i# D5 P% X9 U, W3 _. ~1 J* f }
, m) _) C( [/ O *(L->elem+e_where)=e;- R/ a. M8 | J. E5 j8 T
cout<<"增加后的线性表如下:"<<endl; . c! q6 {1 n& Y4 U4 |
ListShow(L);( w7 k/ Q% v5 |+ p
} 1 }) e8 i2 E9 Y
5 x' p0 K4 O5 m# g" j {void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
( c8 s+ @' {+ o! B int i;
6 P5 P# z2 l3 D$ d" C0 o L->length++;
4 }( y6 P, f6 O for(i=L->length;i>e_where;i--){
5 U+ W' k# D$ f9 } if(L->length>L->listSize){! l; B! }0 i3 l7 ?! c9 G7 g
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));, C) ^& Z+ p7 V. `1 D5 M
if(!L->elem){
2 S+ q, c- N' M( j cout<<"增加空间失败!"<<endl;% C7 P4 M7 q: X" M
DestoryList(L); , D) r7 k- i' Y! E. ~% w/ e* y2 }
}
. I. f" T, d9 e: U4 a. k1 T }1 ]: C9 r5 E/ |% J
*(L->elem+i+1) = *(L->elem+i);
" S2 \' R/ |4 J' E { }* b; C& P$ f: L2 _" u
*(L->elem+e_where+1)=e;
7 w+ O* K. l# r4 h" ~ cout<<"增加后的线性表如下:"<<endl; . @3 m8 d# v; j8 _: w3 h2 L
ListShow(L);
( s% v, h+ x ^! [0 L7 R$ n}
% d) r' {/ A- R+ C- E
3 [ j4 k3 _* K8 P删除元素
) V! S5 L* H6 L, a5 @5 Y- x; [) o g& k
void ListDelete(SqList *L, int e_where){ //删除某位置元素
# C* v* E+ G- J0 K% A L->length--;1 `8 ^6 e3 Y1 A. S* w
for(int i=e_where;i<=L->length;i++){
/ }# ?& u1 q1 x f; B *(L->elem+i-1)=*(L->elem+i);
( ^% }: ~9 h, M8 \$ H' D5 v }2 M8 ~4 x. J" |
cout<<"删除后的线性表如下:"<<endl; " z7 `- d" C9 c0 J+ s
ListShow(L);
9 ?9 t' f& x! f* g: y- |9 J}. k" C- G& f5 u; d; C
8 K2 N8 ~$ f1 k) i0 L9 P v2 Z) j7 B
销毁列表" h. y1 X8 u9 _3 @, l
) ~2 v" O3 c7 E* [6 U' u
void DestoryList(SqList *L){' z! j0 V' h8 W+ }0 Y5 D* b$ _
int i=0;
' r6 C( J( c7 x: W) G: P: b* W for(i=0;i<L->listSize;i++){# M8 s5 |$ c& T. q6 d+ \
free(L->elem);
* H% h" e, ^" o9 r' K! u L->elem++;
v D. \2 `3 F! Q4 E }
0 y3 f' H: A" z2 T: }0 H exit(0); 5 D( t" M/ I9 q
}
! X, W4 e! |3 v) k2 Q4 A3 n) m( p, e
6 d$ A: r" F6 h- h$ p) V5 m链式表示方法
5 z5 T1 n; R; N0 b. \- I9 d2 W! W
结构体定义. d' g1 H0 C( J
5 r/ O& Z8 t" F# R5 i; Otypedef struct L_Node{
4 `$ W8 c5 j9 p ElemType data;
0 _# f5 A. P3 P8 O struct L_Node *next;
8 P" w% r6 }" V2 ^ //struct L_Node *last; //增加可变成双向节点
* M- |5 k9 d& [6 h6 x) y}LNode;" N5 l F+ Y! s+ ] R' r$ }6 j
% t3 x. a q" J" n- B6 u初始化
# a: [$ k! K# o
1 K: [( W9 p7 g; {! H; dvoid LinearNode::InitLNode(){
3 p: `5 {: j1 M; u2 q- | HeadList = (LNode *)malloc(sizeof(LNode));8 b$ p+ \' g; I7 ?. L
if(!HeadList){1 D/ O0 u# F G
cout << "初始化链表失败!" << endl; , e4 V; p* X! n
exit(0);
/ [& z H% J; l } " d7 Y( A$ V; k& g' B/ K7 a
EndList=HeadList;
/ N" ?& t/ }& p5 Q: M6 C' } HeadList->next = NULL;
2 p! C/ W7 h' M2 @, ~ cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;' A& @) y% B+ ?3 g
Length = 0;
5 V3 r) Q5 g6 I2 m e_where= 0;
R' W( v% L* ^# B4 t}
( v- s2 u& w" B, C# z/ e+ c) |! u: a) W% R: _+ [
增加节点
) J1 h/ `! y1 }! i2 [2 X1 k3 ^. V" e3 F% @+ g8 o
void LinearNode::AddNodeHead(ElemType num){ //头插法
& Z6 p, e9 v0 X$ r node = (LNode *)malloc(sizeof(LNode));& c' B2 P. T+ P9 @3 j9 ^+ w3 T
if(!node){/ _, b2 R# u5 l2 b
cout << "新建节点失败!" << endl;
- T) h; e1 D3 L+ y8 _8 m# ]/ U return;
; J- X3 t, N6 u7 z; E }
# r& O: H" v, n; \* M5 \) v node->data = num;. Z! n4 r+ T2 h! r( n% `
cout << node->data <<" ";
( ^, e+ b( }' L& I if(NULL==HeadList->next){
) a: ]3 N8 d! P# f6 D2 v node->next = NULL;: {2 q6 I4 D4 D( n0 s8 e
HeadList->next = node;
7 X* w+ f. x V) a% k! w7 \ EndList=node;3 \6 r: o3 I% D3 F
}+ }- G3 x1 u7 U5 j$ L' C8 g
else{
. N f- h1 X% w' F- z1 a$ r node->next = HeadList->next;
& ?4 V& u1 e( e: `$ c6 V. a' K& s HeadList->next=node;' r- h% r, V; S8 T) X
}
, @9 m9 g/ A# {1 M) |8 P& _ Length++;
' X/ G( J @& c4 c" s}
0 w( c% y- B0 z
7 Q2 i$ g" }% W" @ y& c- s6 C* Jvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法 9 c. s: E; |9 l: S$ e* Z
node = (LNode *)malloc(sizeof(LNode));1 _3 l9 O9 U0 ~
if(!node){
) H f. ^ u9 u- q9 b0 a* Q" X cout << "新建节点失败!" << endl; : D1 L! v# Y1 s: l
return; ! W, i$ `) B) N8 }
}
2 M' W" s' W3 f node->data = num;4 [/ C8 o4 `3 h D3 g: G1 N# ~
cout << node->data <<" ";/ m0 o" ]* m$ G+ O
node->next = NULL; S: Q5 v3 B, s( x; d0 @4 f2 B! \
EndList->next = node;
: o8 O* x) J8 K$ }* A EndList = node;
: d9 G% a% n- W) {1 V/ t Length++; $ s" B' l. u7 ~) K
}/ ~9 i5 i( L; k5 p" i6 C7 {! ^
- D6 c z4 x6 @6 Q删除节点
& C3 K0 \* O6 p7 r: o2 M8 U, H5 n' H, q
void LinearNode: eleteNode(ElemType elem){* u: {+ m- u7 a {/ M' ]. a4 e
if(NULL==(HeadList->next)){, N6 @7 L2 e9 r2 C6 E9 ]
cout<< "无节点"<<endl;3 w0 N7 Z# [. b% K o
return;
+ ^! ?5 w# d9 V8 O6 n3 ~" j }/ B* c5 h5 t+ e7 q2 i
Node_cur = HeadList;7 }! i- {) h* w& w# b& m# Q. z5 k
while(NULL!=Node_cur->next){
) i5 o5 g3 @8 ~+ Q6 y, T: z Node_temp = Node_cur->next; / r' F4 f: P$ q1 t8 X+ W: I$ n
if(elem == Node_temp->data){
/ a, ~( a: @3 I9 Y Node_cur->next=Node_temp->next;
" ^% b }1 R+ S. d1 F A/ } free(Node_temp);
+ O; ~1 A+ @, o, _ }) R* \ z( l' Q7 L J. K
if(NULL!=Node_cur->next)7 J+ u n' J8 x) c) G; B- }
Node_cur=Node_cur->next;
# p! R% L/ _( z }
$ k: p9 m+ r+ z! U0 j' f cout<< elem <<" 元素已删除!"<<endl; : E* w" r* b9 f2 P- Y0 S
} 9 S$ [' Q: O4 Q5 N
5 v; z' T; t; G: ~5 R$ K3 a. O6 _
显示链表$ u, e1 \2 e; @
1 ~- n+ R7 n+ y/ t
void LinearNode::ShowLNode(){
- |& e3 e% v# h) F$ R# G8 f if(NULL==(HeadList->next)){
- Q! G# A$ k7 ^( @' _! Q cout<< "无节点"<<endl;
r8 F9 o! W- R- L- ^5 X return;
/ ~' N8 ?6 M2 Z5 O0 A1 y- K }! W0 b* ?1 ^4 R: O' c
Node_cur = HeadList->next; ; g6 Y5 @+ g- B' M. K
while(NULL!=(Node_cur->next)){
3 S6 M, z8 l" X3 X cout<< Node_cur->data << " ";1 c7 N) G$ J# l/ b
Node_cur = Node_cur->next;
6 {* Y& b" K, J }
5 J7 Q3 R4 A- d9 n cout<< Node_cur->data << " ";
) ~" @( T3 O/ V8 M t; B+ Z cout<<"链表中的数据已显示!!"<<endl;
) U' u' c& s- M! O1 H}
3 \, @. c, x. i
$ H, Q8 |1 n4 W6 i5 H销毁链表+ e2 W( J# x" p5 t- b2 A
( `( ~+ O( ]$ H+ Y C; _void LinearNode: estoryLNode(){
( ?$ `9 } ?1 l Node_cur = HeadList->next; ) \4 n9 i4 w1 @$ L
while(NULL!=(Node_cur->next)){! p" E$ f$ `0 B- B) w3 m
Node_temp = Node_cur->next;
# b9 Z$ S4 h" t8 `0 y$ M free(Node_cur);
. w2 \- b' y2 p, N, |1 {+ T Node_cur = Node_temp;* k+ ~( u" h: B$ c( {# z2 ~' c4 r
}
6 r2 P+ P: `0 o+ g free(Node_temp);% J( ~, L& z" R
cout << "数据节点已完全释放!"<<endl;
* J; D1 H" J' k) z7 s+ n free(HeadList); // 释放头节点 k3 Q; G) r. C' @& e6 Q
cout << "头节点已释放!"<<endl; 1 C- t" [) N7 d0 V4 D, Q% O
————————————————
% y6 G0 N3 Y4 |' m7 L版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# Q5 p' G7 x- E# L b3 {
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286# z( F. \/ [, w3 H5 u' X C4 h( C
& ~ b: G1 C& F H& G3 C: R' r+ d, F) B
, W! W) a2 T( l3 C5 D
|
zan
|