- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566703 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175234
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
0 [: x1 s7 o. M9 f" D, R2 ~, ]
线性表顺序表示、链式表示实现方法及其异同点: I3 B7 L5 u2 z$ X
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
; y1 X5 T, {, H1 @$ A* T5 G6 p+ ^/ r$ _: x. @" N
本文采用C++实现两种表示方法。
2 O2 m b" n1 v8 A# Y
4 o" P3 b. A4 g/ [目录3 v F$ Y: t1 T- j! Q* E
# H- L% k3 _6 \) [
顺序表示和链式表示的区别:% B# J* [* w0 c0 T+ O$ B, {
2 n/ z' S" {" a- c- X
创建方式:
2 T- S1 y2 c8 V3 L- ?1 l2 V$ q+ J' N/ s+ J$ i3 R- z5 S6 j
时间复杂度:
' c& H9 N1 @) Q3 b. w3 Z
% l) |6 w; F( K* N1 i* u顺序表示和链式表示的相同点:2 S/ U' x! W6 h- g/ M# n7 B& ^
4 C" O* D9 @" I2 M* C; T( I删除内存空间:
. s' |8 W4 k1 v" _- S: I: @* s8 d) p# F
代码实现:
2 V# ]2 o* R G/ l# ?/ c2 V5 k3 j4 S! g& V
顺序表示方法:
' f5 F. v! S* b2 z+ Z, W$ F
$ [3 M9 A* R7 k2 ^5 e7 d* p结构体定义
6 \' P* y* T$ b# b: ~# M- [. K3 \5 E( M0 G2 M! g
初始化
6 S' S% Z, b5 ]2 I# X; y8 Y) b) W$ q) C9 o, r+ n
增加元素6 _9 l3 F2 c% N6 h/ X3 Q) [ {
0 H6 { P$ _: Z( J; q% w) T
删除元素
4 A# e/ @1 o8 \
7 y5 T6 o7 f7 W4 w0 ~* L% Z销毁列表
! O! q0 c" ~% m' }1 z0 a( I
! P7 K- Q3 c3 N) J3 n链式表示方法
: \" ?: A% y' T$ Z
6 u1 m5 d' n; s2 f" K结构体定义
. B% m2 H% F) v( g- @7 [$ A
8 ?4 W, f9 d! i$ Y0 C初始化
6 y @' y8 l0 @* \6 v6 J
# Y, t& k! n" `) Y5 O( N增加节点
" V, x7 x: K/ b' b$ a b6 J+ T4 G
5 j* ]$ [* ]& q4 p$ F$ v删除节点$ g+ G1 P P5 v, D1 d# w# T; E5 u0 o
0 n! y3 Z3 Y; M2 T+ p: H1 c D! N) m* l9 C
显示链表( ~" o0 C( ?: d. ?% b4 q7 m1 _% ^7 W) H
# d8 P k9 M/ D$ J) c
销毁链表8 T m$ K1 ` V
/ w' z9 k! i% Q: [7 m- m9 t顺序表示和链式表示的区别:! s0 z0 ^3 M1 o. v+ C% I$ a
5 @6 d) X2 g# ]$ ~创建方式:
$ I/ n; L* C0 o# m0 F: w9 L, n, \6 g) G1 n/ e
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。) ^7 A9 a7 k, |/ H0 Y0 P% `$ X
& w7 i& b6 a0 @3 ^+ L# O(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)* G1 }% ^4 X* Y; }) L
, Z* x5 j6 v9 ^3 J: _5 r. t! H) O
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
5 m1 ~/ Q. c$ s+ x8 y% Y2 T% I, k5 o8 c8 U8 N5 i4 n
时间复杂度:' q5 O1 A$ u+ k, n1 B. k4 g( H
Y0 i, x$ X: [1 P增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
$ B" P1 c0 |/ {1 b7 M! z6 k! c2 C# L, r; j- A* v8 ~
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)" H* x9 E; R4 a6 S6 W3 z' f
. R: E# I A$ `+ i kPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。8 I Q# W, X# u7 a. C
9 V8 a% U# G/ [; v, l+ |修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);/ G' G5 U# M5 N5 d/ s
( g9 Y. A7 O+ ^& r* I
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);$ x" O8 c m5 S8 T# J$ q5 Q
2 F/ ]& }' J: b5 g顺序表示和链式表示的相同点:" g) X+ w3 y9 R- C l
* R5 O/ H3 ~ V3 u! e9 e
删除内存空间:( h2 x/ z: P) F+ w
+ g; Z0 {" Y. A6 P3 Y6 @& k" c" H- _内存空间的删除都需要对每一个存储单元单独释放空间。5 M* F! E2 D! j$ E
0 _3 g8 i! h$ w( D3 E, f" \' e代码实现:
3 ~9 a) R, i# \$ X
3 G& {; d' ~6 f) u0 R) [$ `顺序表示方法:0 ^, b. c( D7 d) v; G$ v
& P" ]5 q* c! O% T, i! a8 b
结构体定义4 p/ \4 R& i6 e$ Q, O9 P: A
; e) Y1 K; j9 Y: O% H9 btypedef struct {
; r$ D% i3 o& L, D) r ElemType * elem;
) G$ h: C- ?/ Y- t8 B int length; // 线性表的现有长度 0 V9 \$ ^; h3 Q; g1 N; P
int listSize; // 线性表的最大长度
: t0 S9 `* Y- e}SqList;' o6 y% s- U2 A* U' h
4 e2 N5 E' Y) O7 K: w7 A
初始化) V9 z5 s8 H; T) a! {4 o
+ n2 F# |0 E3 _9 B# F$ e
void InitList(SqList *L){
4 A& V- K3 N; y. P9 x L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
/ T" f& l5 y& M1 b; | if(!L->elem) {0 Q+ c5 Q! Z$ b! s$ t
cout<<"申请空间失败!\n";
8 D" j+ N8 G, ~* N1 r$ c DestoryList(L);
$ [1 Z4 W; m5 R- T/ k# y& [) R, B }# l- Y8 k$ @2 E$ \7 ^. m
L->length = 0;4 k& l2 t; b( S% U% s
L->listSize = LIST_INIT_SIZE;
& \2 \: G6 h0 r* \/ o, i7 f( W cout<<"线性表初始化完成!\n";4 Y6 W1 z, p7 q( N2 B' y) N
}; ?) B7 s4 Y9 u' T) ]# }
0 n% f* m. v# }* v7 h& m
增加元素
6 `9 g I; g9 O% Z" |2 i
2 [7 P, x9 i+ m' j+ W1 U" g8 Bvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素5 B' ]9 \) T& c/ q0 [
if(L->length>=L->listSize){6 Y' V( E, _" q. i7 V% O/ [$ c
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));9 s9 U( U) d- A8 t1 k" [9 Q3 j3 C3 H$ y
if(!L->elem){
! l! Y' |7 L7 i& ~- ~ cout<<"增加空间失败!"<<endl;) H' D0 E* w" j
DestoryList(L);
/ g7 ?: j; u; J' R }5 s# Y3 r$ t* |/ T
}
1 H) e, u7 n! y. Z0 ` g5 \ * (L->elem+L->length) = e;. b( _, ^# t2 l1 D; C
L->length ++; ( y8 s; S- Y4 ?% t& h
}: Q) g4 x9 |5 J
- q! G& h- a: I O6 svoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
! n6 u5 X) w% F# ]; K$ e ^ int i;( x9 K: U4 u: M7 W: @/ N, s
L->length++;
; U5 }6 i: ^0 {5 O, [2 i4 g" j for(i=L->length;i>=e_where;i--){9 D2 P* ?- b- [7 U$ r( y1 m2 {( l) F2 M, `
if(L->length>L->listSize){
, p5 q9 D9 Z& q0 p L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
1 I8 M' U% x' \) ` if(!L->elem){; \0 p& c, I' p# t5 k9 M( m% U
cout<<"增加空间失败!"<<endl;
8 Q( s* Y1 U$ H, ~; s5 Z" G DestoryList(L); 6 q0 G( m! t% ~
}
5 F( C* Q9 Q0 O* i! c9 g# u& l: J. Y }
6 t- P+ q o, K E( W+ m *(L->elem+i+1) = *(L->elem+i);
- E" N7 P& X$ \* M) L4 g/ z6 w$ Z }
* y% n! ]% Y# c( [- ` *(L->elem+e_where)=e;
2 N G- w, x- ? cout<<"增加后的线性表如下:"<<endl; p+ E! p# I& W6 Y- q& u
ListShow(L);
. _9 p5 {0 x! v' V: r. T} S/ Z) S( J+ A5 k J' Z& G
9 _6 @5 t" v1 D/ f' R" q4 T- rvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素9 t, `! z% J2 K+ n* C4 S7 H$ ]1 t
int i;
{1 w& L {- Y6 b& Q F% k$ I L->length++;) j+ y! p# l3 S' r4 J2 B' q
for(i=L->length;i>e_where;i--){
$ C) T) `& ?0 M0 h5 L if(L->length>L->listSize){* ?) s$ C7 q* k
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));3 }2 Q! X! e6 Y) A& {$ \
if(!L->elem){3 q( U, E7 m/ j3 C9 e( j/ E
cout<<"增加空间失败!"<<endl;
# y# k) L/ a5 Z DestoryList(L); 3 _/ {7 b9 ?- k4 ?' L
}4 H# {0 K% c: o, z7 Z* ]$ K$ S
}
1 o. f% |: p: n& {+ N9 D8 u) `8 K *(L->elem+i+1) = *(L->elem+i);
5 i x8 B2 d% t1 ^$ m( N }
_; c$ b8 q$ p1 L# z9 w *(L->elem+e_where+1)=e;! w8 l' D# n M/ H' \
cout<<"增加后的线性表如下:"<<endl; 5 r. K8 e! R( Z$ x0 I
ListShow(L);7 s7 S% I+ H% A& b& s; t; R) z
}+ q9 {$ M! C4 W- o( M
- h4 y) N5 O1 D# u删除元素# Z% ~8 {2 b6 z6 H
6 ?4 ?4 |+ d. W
void ListDelete(SqList *L, int e_where){ //删除某位置元素 ( d/ O: ^' | t- K! i) I. D5 l$ @
L->length--;+ N& O2 }, m& _9 W g$ U" O
for(int i=e_where;i<=L->length;i++){
" g" r, c; j3 @3 z *(L->elem+i-1)=*(L->elem+i);
& H7 J; G0 f# L8 J' H! V }% u- N% V' f$ s! T ] z% A
cout<<"删除后的线性表如下:"<<endl;
1 R) u6 ^# V, k. U; s% z, ` ListShow(L);
& d; ]- I1 n+ j& l* m}. }( D+ r7 g" g9 I. g( C
0 B# i5 Q' {/ n' p6 @. k
销毁列表
) A1 y( g) {& _! P4 k6 u1 t
9 o2 N2 Z% q* _" ]# Q+ j+ rvoid DestoryList(SqList *L){
" g$ t7 E U8 x4 W0 H int i=0;/ S, x$ Y, s# ]; f* G3 M
for(i=0;i<L->listSize;i++){
: N, k7 J6 V1 T$ N5 v i* q- A free(L->elem);8 F* a+ G1 B0 N- I7 S
L->elem++;
# o; a( O i! ? }7 j6 z/ r/ V2 U
exit(0);
7 o3 U) |7 v! e2 x! Q& [. d}
) Z' t T$ d: L: D4 l
5 \) m* B, |5 @( d7 n! U( O链式表示方法8 f( c |8 M4 `
( G2 l- ]8 n$ x( d+ _7 G Q5 a
结构体定义
1 n3 }2 r5 R# ]) F, |+ J' K+ t- ~. A
typedef struct L_Node{
, Q6 H0 l' s6 u( D. p$ |- H4 X ElemType data;$ l! l: G9 s: x$ k
struct L_Node *next;/ a% H/ w, p3 T3 ?9 b8 X* B) k
//struct L_Node *last; //增加可变成双向节点
) X2 Z) s/ l1 S }) \}LNode;6 L" \' w0 ]4 D! @# t/ o! C! Y0 c
5 } u, }; o" n3 h. L& X$ \
初始化' G- X3 w6 m* k% ~" f
3 X* ~3 F5 S" o1 q! y: D
void LinearNode::InitLNode(){: X- f7 u' }& f* i9 O
HeadList = (LNode *)malloc(sizeof(LNode));- e; y& Y( l5 q) x$ T* q
if(!HeadList){3 D8 E9 f) j' [+ Q( D" K
cout << "初始化链表失败!" << endl; & `; `+ ?9 H i$ a- b
exit(0); ' \) a+ D8 O7 x4 O' z
}
9 B2 B% F& z9 f( F l EndList=HeadList;
4 w- v/ R# ~& S9 [& M HeadList->next = NULL;
7 ^! c" l, o+ T7 A& q cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;. ^1 @+ L) c1 @$ ~9 ~ f9 _* ^. s
Length = 0;
; R; z, a# D' G* O. w e_where= 0;& o! g; z9 \2 l: m0 E4 o* c* @# h
}' U$ ^5 z! X8 Y3 v7 @4 q* ~
9 l& n" c8 `/ h9 V$ J
增加节点
5 k) J1 E0 j- I
. Q6 g G& ?1 z7 ^7 n8 Dvoid LinearNode::AddNodeHead(ElemType num){ //头插法 & a# c" C- s0 }! f. A" C
node = (LNode *)malloc(sizeof(LNode));9 n+ O$ R; F( E0 W: M x" a
if(!node){
. z5 i% l- y( W( P' ?3 {5 K' ^ cout << "新建节点失败!" << endl;
4 S# d% M& A( {9 u7 M; [) J return;
" g9 B3 j( P( F0 Z0 A2 Y6 w7 z& | } & L. x4 i8 ?$ L$ x3 i; `/ |
node->data = num;% ?0 c2 m; t8 J$ j
cout << node->data <<" ";
1 i2 a6 j3 V; z' h/ p" n( b) |$ m if(NULL==HeadList->next){, W* u2 b# F* I# y
node->next = NULL;
% q/ U/ \! _7 Y. H HeadList->next = node;
/ g; N" T0 Y( c& k! r! c1 g# q EndList=node;
4 k, q# R, q' V$ }, {8 o' [ }
4 q8 ]: \# a) Q) ?; u9 ]+ b else{7 ?! d2 f; x6 P$ `& g! [4 Q# A
node->next = HeadList->next;. F8 E2 s* D* l! u. g5 C% ~& _
HeadList->next=node;* }. D$ a! D0 u4 O. ]
}6 p* _9 E/ L! \0 w% m6 K+ b
Length++;
! z: Z& `; e- Q}5 H T+ S x1 \+ m; Q8 R
7 x6 O; X3 V- |9 m1 [: K, C" b* l0 p9 l
void LinearNode::AddNodeEnd(ElemType num){ //尾插法
" y: p: X# ~/ Y' ? node = (LNode *)malloc(sizeof(LNode));' `7 z& ?2 A1 | [0 I1 P4 ]$ p. u
if(!node){8 `; z' ], b: H( k. N
cout << "新建节点失败!" << endl;
- ^5 V7 \9 _/ b, m4 t6 E/ f$ q0 U6 Q0 } return;
; v' I B, r1 J* x, \ }
8 v$ p, Q3 S/ B) H' ?8 ^ node->data = num;
; g- [& j2 a5 f/ x3 T; n3 ? cout << node->data <<" ";6 w9 e% F' u6 J4 F2 E
node->next = NULL;
7 S1 Z* Q% C8 G0 v. v2 p# J9 T EndList->next = node;) z3 L S) y2 e; ^. D* V
EndList = node;
2 z+ F) [) V- {% j; n: _ Length++;
8 A& y- v" D- i2 _2 b4 ?. [}
( r6 v6 q s& W. K. ]# ^' L$ p, t3 w6 K' W0 l' Y6 s1 G; f$ w% z
删除节点
( u3 M4 ^6 |' \1 ~- D" n
[! V. k* z+ [. evoid LinearNode: eleteNode(ElemType elem){8 z, M' a) d- r. y
if(NULL==(HeadList->next)){
9 h- I. k: G/ ^- ^/ j cout<< "无节点"<<endl;
1 u w4 d6 b, {$ M& d return;
Y" W; s3 S$ q" V, \( m2 C3 f! Z+ ] }( U0 s0 z6 p+ {& a/ H1 W* V7 Q
Node_cur = HeadList;
n& v" E+ h* d Y while(NULL!=Node_cur->next){
! x/ o' H- P% N& N Node_temp = Node_cur->next; : Z( p: b3 m0 L; Z& a
if(elem == Node_temp->data){; G3 ^- b# d( \ k
Node_cur->next=Node_temp->next;1 z* F7 f+ q" E. u
free(Node_temp);
2 V- _1 ~" v- F% B% r S }, |+ Y- f, N' s2 H# J
if(NULL!=Node_cur->next)* `% D. p) s8 f; c( n' P
Node_cur=Node_cur->next;
4 g- ?/ O. X- y; O# _1 R }. J9 R, W% c3 g; F( c( |+ v7 _/ F* v
cout<< elem <<" 元素已删除!"<<endl; - N* h0 m3 F3 x3 B8 L
}
. k7 j e: \3 N
0 g2 J# R* G: W! S) d显示链表
! o: ?6 x) b9 s$ v W* y
4 s: E4 G4 H; S- R9 d! ?: J5 ~; Svoid LinearNode::ShowLNode(){+ G; Z& C- X) x
if(NULL==(HeadList->next)){
; r( C7 s& S b7 y+ S cout<< "无节点"<<endl;+ B) N, R4 @8 b8 W. q" y4 [) T, Z
return; 1 ]# t* R/ d" b- j# {
}/ y; M; ?$ z5 L
Node_cur = HeadList->next; 1 t4 V' L& C' x6 j* @
while(NULL!=(Node_cur->next)){& f' K# k; W- ~4 ~
cout<< Node_cur->data << " ";
[5 O2 @& w$ b Node_cur = Node_cur->next;- v+ H# `# I' `$ R5 g4 L* _
}# ~2 @# Y" U0 E, a
cout<< Node_cur->data << " ";
7 q/ x+ e" C8 c# m cout<<"链表中的数据已显示!!"<<endl;
. z* d, h" u! J" g/ F1 [}' C- F; s8 b& S7 A7 w$ t# O1 p
+ U k- T+ z9 m( `4 q) u/ p
销毁链表8 |( O* X1 ?3 ` y6 K# T. X1 s
$ r! h% |! T/ l9 |( t, h8 R9 Cvoid LinearNode: estoryLNode(){6 _$ I2 @& Q" O: O* q/ }% I
Node_cur = HeadList->next;
6 w' B' w+ e E2 S( P( d while(NULL!=(Node_cur->next)){
6 K% j" s4 `9 P+ Y Node_temp = Node_cur->next;
4 B% @9 Y) k% I free(Node_cur);7 j+ T6 |/ Z+ _+ ^( g
Node_cur = Node_temp;
) M+ b# E! A# x# Y4 r }/ M3 e! X1 w4 a' C$ M
free(Node_temp);3 K) s, T6 X, f ]8 x
cout << "数据节点已完全释放!"<<endl; , J1 D: O; i& s7 k
free(HeadList); // 释放头节点 ! `" t* T) p# U3 R
cout << "头节点已释放!"<<endl; ( V3 d" G' W, w6 d3 _) Q |) ?
————————————————9 W3 f. l' Q: f; p
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- A* E2 q: T4 Z. i+ u$ R9 x
原文链接:https://blog.csdn.net/Baimax1/article/details/1060362869 O7 u/ x. [' _' j+ U9 X
/ M* |& o8 x, J1 x; V
2 y/ N4 t- ^# X F
|
zan
|