- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564648 点
- 威望
- 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年大象老师国赛优 |
8 e# ^' I( c9 d4 `6 l- N
线性表顺序表示、链式表示实现方法及其异同点. t) d% q, r" R0 n) b* x
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。+ i* x: W) P! w5 r% s$ ]
3 k1 N9 h% J! D. M# \) N- g% H$ b
本文采用C++实现两种表示方法。
3 f2 F7 p0 p* r: ~7 b# G
! N: O, W3 O3 y5 ?9 n W! B, h目录7 J0 F" W2 W5 O# g$ ~
! x. h% x9 k5 v* ~# Z
顺序表示和链式表示的区别: P: c* B* v8 J' l; J5 R J Q- r
, e9 `' a( J" p8 K/ a
创建方式:
, k. P6 e U! I* L$ [
1 K; U8 \% n6 x. H9 a3 E' ?时间复杂度:( Q& s& p9 ~; u
$ \) D9 M* @4 c2 m) W6 u: u
顺序表示和链式表示的相同点:8 F2 U- A+ u# q! R
; {3 Q% X7 w. o( m4 \
删除内存空间:: L% w2 V! u- X O
p! j C1 ^$ T+ A0 e
代码实现:: T0 P( F# o. N
# S. p; @, D% `
顺序表示方法:
v' F0 @9 _% h7 v
" _! v2 h) @0 F8 }2 n* |8 i结构体定义
, S, r5 E9 C( D: X
% n2 _9 ^; @% l& M2 N初始化
8 B! d, Q+ x9 N5 W
9 h/ D0 I' k+ l1 U, L, Q/ `( y9 A7 O增加元素
' T* z# B0 G) v. b6 w- V
* t2 Q8 I+ b/ m0 b; S删除元素
0 ]4 Y7 l& B' d* k( |- i( }8 Q8 F8 ^5 _) A0 F6 U8 i
销毁列表4 |' L) H, `& M9 L/ z
) U* F+ W* [/ G- B3 F- M2 C链式表示方法% L* x. p, `4 Q
4 }) D9 \: N/ g) T结构体定义3 v2 z% N1 {! B# u% T8 ^
' y4 _2 b' I. p0 G& u
初始化5 B) j; K5 j7 m: q4 R7 `3 Q
6 Y) X- a% c3 z- [& R( [" N增加节点
8 \! h5 L. U5 {7 ^) }& U2 p0 _9 @2 r$ Y3 ?5 U; q" P4 Y" l3 N
删除节点
+ ~4 Y# b Q# G" Y
, H5 L) r- s& }0 P. o( f- Z显示链表) x& J; {; o3 _
+ v& y0 G- `# [* G销毁链表
5 K( x" }6 k- t' e+ o4 u: Q
, @1 s# d7 o+ Z$ D顺序表示和链式表示的区别:
P% J. u7 Y. _' w: d$ Z, Q& `
* D( r; a' `! c0 m创建方式:
4 z$ r! y, q) F- p B8 }) U3 A: M$ _8 E s
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
, [ D& c7 e. L( z7 x0 X5 r! P: g( W
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
7 T3 e- a) p$ C3 q+ ^5 g# L, o7 R0 P1 P# ?& i: s! u
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
. ]" {! O, h4 O9 \, [+ P4 A- ~3 d* a% ]# L# D2 X0 b3 M) b8 C
时间复杂度:
) y) ]5 q4 |4 W( t7 b3 r/ p9 b: h4 g% t% X2 a$ U h2 U
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
- q- q( e3 z# o# x- a) f7 x
2 d2 \9 D8 `3 E H" Z- |2 A增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)( r! c M7 m! s5 `6 G# D" }
8 |+ R& e6 c9 f* yPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
3 C9 G# h6 j# R- l' Z' j' x6 k
5 r) X4 l- |/ m# b5 c. H1 H修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);# t. R3 H6 o9 e1 u% w0 d0 h
% L/ V3 _2 O, {; Q, x; s' t查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
/ m- t$ o, N, A! v; p, K$ M, Y% F: i% L5 Z6 G
顺序表示和链式表示的相同点:" ] F" H& S' R- ]+ q: v7 s
5 `9 d! y: N; `! \1 T! k/ t3 |" H. }
删除内存空间:
* }4 r$ Q( {, H" N5 `5 T& C( |# k" W/ K, v! D' k
内存空间的删除都需要对每一个存储单元单独释放空间。
! @: @5 ? {% M5 l& l) `& u8 u6 f n0 q7 S- C. ]
代码实现:, R1 Z; Y' [& o9 B
3 w" f6 \% y! I+ D2 x1 P顺序表示方法:
& f" A! M; ]9 u1 N8 m4 q: Q+ o3 B' a% M
结构体定义
9 P" L9 d6 Y7 x9 l% q
0 _. Q3 s( M& i% Jtypedef struct {
! F, F8 e! `/ y2 z& \' v ElemType * elem;5 ^& u$ t$ B0 O/ u) v* s
int length; // 线性表的现有长度
# C1 k! x: `- o* M3 a int listSize; // 线性表的最大长度3 ]3 l+ [9 f1 J% A u0 C7 }; Y5 o
}SqList;4 E/ |# R- {; J& _4 X3 b* f! _
: i8 I M x" g/ C0 h初始化
$ G5 F! @, Y: ^/ q1 Q1 G( d) _5 u% w' a
void InitList(SqList *L){
% h& {$ M3 {1 I' J L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;- _3 n/ J; _# \: S
if(!L->elem) {
6 S& S# b$ P9 R# C1 \1 M cout<<"申请空间失败!\n";
# f0 E/ r6 z1 n/ k' t7 f# n, Z DestoryList(L);
7 V \( N+ } W, T0 f5 S }5 p& c9 c) y# B( U y' K2 n
L->length = 0;
( b1 C+ e. ]0 E( c0 _4 N$ b L->listSize = LIST_INIT_SIZE;
5 I8 M& r4 \: c, w cout<<"线性表初始化完成!\n";
8 ^" D" E% a( h}
+ b' t& T3 d$ c3 N5 ~! F1 _& |
/ }- X4 c/ D9 a6 s增加元素
) ?: Q% r+ W8 Z) [8 q3 [2 Z! R! q! E0 f) p
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
" C, g7 h) b; X if(L->length>=L->listSize){
6 o& p. y$ `9 b5 h& y& R L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
. J/ W; g& _0 P2 ^) y$ G' K+ U if(!L->elem){( J0 M) @/ r$ G( O
cout<<"增加空间失败!"<<endl;) U5 r: n, ~) J! c$ E$ ]* K
DestoryList(L);
: a6 E5 M7 E2 E. I. S5 c }
: x# N7 u w, e2 M# o. } }. R3 G+ Q/ S" p3 I+ B+ m0 ]
* (L->elem+L->length) = e;( K' `% j0 Y3 p1 u0 E* A9 }! J
L->length ++; . k! Y/ I. U9 l9 I& P
}
0 F& H# O G; c. ` Y( K( w8 ?/ O5 j
& [0 |& o3 L# |, Yvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素' V! o7 A* ~$ C( S5 Z7 E& q
int i;0 w- U8 }8 Z- `6 X+ _+ i
L->length++;8 ^3 ]/ U8 h& i, x5 }6 E2 Z
for(i=L->length;i>=e_where;i--){& @% a6 W c& ^0 t8 `& e1 J O
if(L->length>L->listSize){
G; @' b! X; j( s9 z6 q: h3 m L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));8 p8 [" f- C& u6 g% f
if(!L->elem){! o5 A$ ?/ e2 N1 M
cout<<"增加空间失败!"<<endl;
7 U4 B2 m3 W5 S% n& x8 o8 N; T, d DestoryList(L);
2 i, C( K5 x" C) ~2 ? }
" {- }- S7 X! r( W/ {- a7 u" g, y }1 P7 ?+ Q8 Y+ O/ L
*(L->elem+i+1) = *(L->elem+i); 5 `' q/ X1 t. a" J
}
; D% R0 F$ b1 p; ?- Q6 a% a+ V; f *(L->elem+e_where)=e;- C. r+ s2 q7 x. a
cout<<"增加后的线性表如下:"<<endl; ) ~4 k) J+ {; n0 o2 U. M0 M
ListShow(L);6 n. G2 K# A4 I* ]4 L7 \6 C3 J/ b. h
}
) X: u6 r8 o7 U- Y9 ^ o. I- e# k7 N- U. l
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
' j# F8 I# }2 H int i;
% o6 o' Y5 h5 j L->length++;
0 Q s$ ?6 `, Y, _% x. O7 U for(i=L->length;i>e_where;i--){
4 |, s q2 `! T; r; b, o if(L->length>L->listSize){
' g' E* y3 l7 D8 ^; j# _ L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
A( B- h4 T( x" U3 u/ Z/ c! O if(!L->elem){- l' P9 C, F* @
cout<<"增加空间失败!"<<endl;# \& ?- \( }/ }. A- c& Q/ W2 T* G
DestoryList(L); ) J: C+ t5 z: ?& D9 F
}
$ _7 N5 s* x2 W$ W, G( L Y0 J } P/ F7 [0 l, \2 K
*(L->elem+i+1) = *(L->elem+i);
: n$ }4 a0 }3 x U }! H! L; S B# Q7 H6 N
*(L->elem+e_where+1)=e;+ T W* U/ Y; r, \1 F9 B
cout<<"增加后的线性表如下:"<<endl; % |+ G: A- ]+ z" q4 Q2 Y
ListShow(L);1 h4 d. U( o7 s* X
}
$ J& D2 K+ \- [
) ^4 p8 [! [. y* }' [删除元素( a; o, m, t& n, q
9 D J) y8 c; B5 h$ E9 g) Svoid ListDelete(SqList *L, int e_where){ //删除某位置元素 , g6 Q3 e7 T7 V; d/ r, S1 E
L->length--; t7 [, Z s' |- q
for(int i=e_where;i<=L->length;i++){
# W5 r _/ k5 R+ D' H+ _% t* c *(L->elem+i-1)=*(L->elem+i);
6 ?. @/ h9 [5 ?2 A% G }# W$ a" e, e1 O$ D$ Y
cout<<"删除后的线性表如下:"<<endl;
& R- I/ j v, Q: [ ListShow(L);
4 p# x# q/ y3 V$ {) k* S+ d) F2 n}5 ^, I9 \1 }0 ^
) j' `, b: E' U' `7 l( I8 P
销毁列表3 q* H* V' h$ T9 x8 r. `5 i/ _( Q
a% P8 @! F4 }0 |void DestoryList(SqList *L){
, }7 i, q8 S4 X& s* X6 | F int i=0;, l4 U0 ?, j' M/ I1 q
for(i=0;i<L->listSize;i++){6 x3 i7 O) T1 z0 T3 e0 N
free(L->elem);9 g" |1 W' l# L
L->elem++;+ ^- \1 P; Z% N3 ~7 C4 d8 E! g
}
( E7 }/ J- ^8 Y0 `2 l' } exit(0); + ^; N# O7 `* Q) p
}
1 I6 Z$ V/ F+ z# {( I; G
& T7 e! k; b m$ C7 F# P: D6 N: v9 U链式表示方法
. n( c+ P S) k
' D: o1 n) a( {# }' c- Q* @$ Z结构体定义5 `; F# @# U0 _) s9 p7 F7 o2 ]
+ I; H0 x: s' n, H3 }4 _
typedef struct L_Node{9 g6 C! X* W; p/ F) o
ElemType data;! v _, F J8 g6 D( F3 r4 S; q
struct L_Node *next;
8 c( M+ I+ f- v- y //struct L_Node *last; //增加可变成双向节点 # Y+ \6 e3 \5 `7 e; v% \
}LNode;; A. ^( q# n# v2 L- L ?& x
5 J, j: B" D. y7 @, M9 U- i
初始化
# A/ x" u/ g! p1 H. K& A4 v3 H P
5 D" U* F. [% P avoid LinearNode::InitLNode(){
; `; d$ A4 O6 e1 E HeadList = (LNode *)malloc(sizeof(LNode));, c, B1 y' U- G) O: Z6 |5 R
if(!HeadList){
- N# M1 P( C) s' l" M cout << "初始化链表失败!" << endl;
& V$ q. K o) ~ N% @ exit(0);
# X& |3 ?3 n7 c }
: }8 U$ R& O) j7 K' W! R EndList=HeadList;1 W/ a3 Z: C! i6 N' c0 ^0 Y
HeadList->next = NULL;
' W0 b0 E4 v* I4 l cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
" W3 U% {" F8 K# `+ P; b/ E Length = 0; l% v6 _5 h, H8 |
e_where= 0;* }+ S. W) S5 \6 e8 Y+ G
}1 Q* @: M9 M) a9 E
$ j3 Z1 |& V# a0 L: r. l9 m; I" I5 W
增加节点
$ }1 |, ?8 T6 P0 L n9 y/ E) c7 A, F9 @& X* { ~" v
void LinearNode::AddNodeHead(ElemType num){ //头插法
6 o" }8 L5 {3 @" ~5 {, } node = (LNode *)malloc(sizeof(LNode));
3 g0 I! S, G/ @; N; O" O/ I% F# e if(!node){' j: [5 J& B" v/ h3 s1 m8 R
cout << "新建节点失败!" << endl;
( X$ V* s: |: i- [3 @% k return; ; d9 X$ I S6 A9 S4 d( h% ~7 l% c7 o
} " A5 ~, _+ I9 {
node->data = num;
( q; O$ @3 [6 q2 Q; [ cout << node->data <<" ";" p6 S# m# p7 d: N0 `* b
if(NULL==HeadList->next){/ m; M# _# P. v& m' T/ i. `
node->next = NULL;; b* y; e2 a# X* y% q
HeadList->next = node;. q) [. Z) q- g' X7 v7 t% d) M/ G
EndList=node;
M- F; A3 X& r& | }
9 \/ E; }+ [/ J* d8 [$ ?! l else{
& x6 R$ S" j' H4 \ node->next = HeadList->next;. u7 m5 ?1 C& v# ~( C8 G* E
HeadList->next=node;% X4 |2 R- z2 H4 m
}
9 J F2 x' s0 i+ U! X J Length++;
* G9 S+ c$ Q5 v5 A}3 F: S+ k I9 B& \# z
- g# f& U, ~1 s, E# X$ rvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法 5 I% h4 L) R% T, F1 y9 \
node = (LNode *)malloc(sizeof(LNode));
- ^+ f$ y' Z* n if(!node){# @, Q( K! x; l. y* m U
cout << "新建节点失败!" << endl;
7 Z& ]1 q+ @' a+ i/ ^& Y return;
' o e" m' L y: _5 e- } } ( P8 i$ J: q$ }( D$ I4 u
node->data = num;
! o- A' n% y2 E3 `6 k1 `: k cout << node->data <<" ";
- w& O+ T) O+ P/ r node->next = NULL;5 Z3 w! L& g' I7 q: {# ^
EndList->next = node;
0 n2 l* J5 w9 p& | a2 M7 ]8 L- A/ x EndList = node;0 r o4 J2 I% \6 t7 Z
Length++; " ]3 k& F1 |6 \1 \1 \# ~$ Q9 [
}! Y2 H/ [/ n; L* `" v
. n* c9 T5 e% C* X& ^
删除节点 u/ Y% e) o" D" }2 _: x% [: B
8 V% J3 G0 C4 s( f/ |void LinearNode: eleteNode(ElemType elem){
2 h* A! H# w* r* Z if(NULL==(HeadList->next)){
" A4 H4 h8 O2 } cout<< "无节点"<<endl;
% P% L& I0 i7 `, j( O( A8 e return; 3 [1 d8 S' ~2 Y
}. V! K2 t3 T! ?6 O
Node_cur = HeadList;+ t9 ~+ X7 j9 n
while(NULL!=Node_cur->next){3 }$ h4 L- ]+ ]1 A6 L
Node_temp = Node_cur->next; a2 [; h8 e* X
if(elem == Node_temp->data){
" D( `8 M8 s" u/ ?5 k+ s* z. I# Q Node_cur->next=Node_temp->next;
# K; |2 e8 _( z; }0 \) j: ^ free(Node_temp);
) I- D/ R( r# I8 R# f }6 b. @$ X- Z$ Y. t" E
if(NULL!=Node_cur->next)6 [- p9 h2 R" r2 [1 }2 V& z0 i3 {; S
Node_cur=Node_cur->next;. a2 Y8 I: [- {2 j
}: J% w) `+ e2 N: s4 R' ^# C
cout<< elem <<" 元素已删除!"<<endl; 6 T, i* B4 i: D1 x% C+ [+ \! h
} 6 P) P. A/ {# ?3 M8 L6 Z( B2 T
, P1 v1 E/ g' c
显示链表
* U2 c% D: `$ X: a
$ P% h* f/ V: {( y8 G4 v! C3 Xvoid LinearNode::ShowLNode(){
: d! d/ X& ?; B& @9 {8 i- z if(NULL==(HeadList->next)){7 R: }/ Y1 n# p7 ^
cout<< "无节点"<<endl;
8 \# q2 K: K, x8 a return; 4 d, M$ E8 o6 k0 N+ f K4 U; q
}
6 f: l( A# R/ A3 ]( b Node_cur = HeadList->next; 3 p! H+ r1 o- m" u) t8 O8 p
while(NULL!=(Node_cur->next)){
4 F& h5 ?# v/ ~) X* f h; H' e$ Z! f cout<< Node_cur->data << " ";4 i* J8 f( d* k0 p& L
Node_cur = Node_cur->next;
3 Z$ N9 H z( ?6 u* M, [/ k1 r5 e }
$ _* p+ F6 M9 N0 V' f5 h( | cout<< Node_cur->data << " ";/ a! ~. c6 C$ R( q* Y
cout<<"链表中的数据已显示!!"<<endl;
) K7 y* J$ _7 x}
- i6 T) V# d! u8 s+ D% _4 I- t0 w
销毁链表9 t7 {: N2 @) Z. \& W2 E8 U- ~6 g
j# e6 F9 _, m4 B8 ~void LinearNode: estoryLNode(){
6 s `. n9 g3 c Node_cur = HeadList->next;
* ~3 L# a6 \4 f5 @2 X: B# X" i while(NULL!=(Node_cur->next)){( h. F) s" q4 F0 {5 h
Node_temp = Node_cur->next;2 A" T1 u& ~4 U5 G
free(Node_cur);
' H) \5 Q, B6 m1 ]( E* L Node_cur = Node_temp;
2 r( z' M( D& }* j }, w; i% [2 G: j" e3 E5 ~
free(Node_temp);) z: c& ?* U7 M, A. a. S
cout << "数据节点已完全释放!"<<endl; . f2 V+ ]$ I6 e( f
free(HeadList); // 释放头节点 ' m" X5 Y/ c( U& J8 x) h
cout << "头节点已释放!"<<endl; 7 y# V3 P' F) I7 k- Y- {4 G
————————————————
. W' T4 [5 `1 y; f; `3 l- \版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; Y3 K' z4 w, {. E* b0 P* ?
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286' ~: T( [7 b7 ~9 E1 T
7 M" V& z' u4 n9 L) F O" l+ r7 V& u0 F
|
zan
|