- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563414 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174247
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
4 q& O, r; h0 g. o+ U" \. `0 S
线性表顺序表示、链式表示实现方法及其异同点7 o& x8 f2 `9 [% I
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
9 w D- Y2 X: h9 Z, v# |
7 z$ l/ k$ V$ a) j! v本文采用C++实现两种表示方法。" E) A: b2 ^6 S7 O" b
3 ?1 [, i6 s& W* U u
目录
4 z/ D3 ]4 k7 b% B- |9 d2 P* V& U5 E) T
顺序表示和链式表示的区别:
& e% R( D, G: }
3 E( {/ \! J. j+ Z创建方式:. ^% c( m7 ^8 L s" `% |
! Q# a& s* K+ M. F$ q6 o
时间复杂度:( J. G" Y3 z4 ^. K6 M! v
3 \2 C- ^6 w e
顺序表示和链式表示的相同点:
7 b% @) x4 |6 X2 |/ X6 Y( A7 |4 W: G( N d) |8 p
删除内存空间:1 x1 E9 ~- i, f; K
1 z# g4 K1 T% O代码实现:
) J- e; V1 C7 u* U1 h+ m0 {& b2 v5 c2 t
, ^( i3 S3 t" h. ]顺序表示方法:
! v* T+ v2 P- F
' y M& w6 l# u结构体定义
) q* y& v+ l7 _% @ b5 H
, E) M; G# \5 i& m7 i5 S/ W初始化7 S3 M: [0 D" W6 Z* Y- C
+ G4 Y! I0 H2 H4 u) f2 p
增加元素
7 B* s; H6 m. I. Q
( I. e9 e% `- l, c+ }# C$ f6 G删除元素
2 o% A9 f+ c a- y$ E
6 L. ?7 W3 |& P7 ]( G& ~) i销毁列表
{& \9 V9 i N
. S% N3 W, h8 m) _链式表示方法
L6 Z& i. B; \# }( g8 H
1 p0 A& M) X# v& }/ `3 l! p3 T结构体定义' }: X* K" X/ Q5 d
6 h+ C, t4 ^: a- R5 k r3 {
初始化# k$ O9 d& _! {
/ e7 J, E X/ x7 k: g3 Z7 a/ M增加节点
* B4 z, l* h5 L, o7 ?# i
; w o2 k% }2 T9 A+ i删除节点
' Q/ _( v d; w: h a8 z
4 ^" Y7 V: b6 c$ R" C显示链表
" d% G8 @& _# y+ P/ }
! T7 N; I* v9 `* [销毁链表
! g9 O* v0 c# g% s; Q9 r- s
: H: \$ h' u! R3 I! r8 ]) T顺序表示和链式表示的区别:
3 R* a+ E4 \5 p/ Y- k* v8 r1 ]
9 G- h6 Q' r! E' t0 }+ u创建方式:, R- |3 J' A) ]" ]1 C. o7 @
4 b* r' ^4 Y) A& |* i, P8 d1 L6 U4 @顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
* X* d5 P: }0 q# ?# A- T" f' j( u& Y+ E9 {; A- \% S, F" P' Z( ~% k
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
0 Y# @4 k# e( `; S, W4 y* j3 e7 }! a4 P- ^* R5 N
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
" m! \+ j+ _% g: w& I( ]
% [' l! K8 F; J; Z时间复杂度:
/ r! D- J" Q7 \% h5 L w- n( o2 q j2 |- v0 m5 P1 K8 Z9 }
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)* p0 M! E: W4 y6 Q0 X8 x o6 D
0 s$ }8 l& Y1 P, Y
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作), E. I9 N3 d9 s
4 w) ]) e0 Z. g' }
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
0 y) T3 \& E- j" h1 v. x; e3 ? y* e0 x: P
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
q/ `' m- y {$ U5 G6 A0 i! Z1 i
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);* N8 G; l% W9 d- G. h
$ k1 J9 h' L2 M; G9 H- V" z4 _顺序表示和链式表示的相同点:
2 |& V$ w1 p! v$ Q$ q `/ u8 \ z9 j- j/ U. I& I: V
删除内存空间:
9 D0 O! d8 X- W6 w! ^
* |2 }8 h% X s% e: u' I i内存空间的删除都需要对每一个存储单元单独释放空间。" T# ]& V2 ?0 {# y0 H" o, {! s
' m! k; `) W$ m% _. N+ H0 o$ ^- l
代码实现:
8 y1 A* [1 l9 }+ l8 G# U9 O" {8 @5 i3 o
顺序表示方法:+ F9 h/ ]3 E; A
, W3 O9 _ i/ k' c+ T结构体定义) k: `$ U3 z7 Z; o
+ b2 p( S; _) E3 t* [/ C2 ~
typedef struct {
8 @( W' a7 U1 a/ t+ ]& S* V ElemType * elem;
; V6 L8 ~9 {! p. @5 f int length; // 线性表的现有长度
! c0 e* P( k+ O! W/ F) J int listSize; // 线性表的最大长度
" |- `% B& z4 w; x: S a3 {1 @( F0 _}SqList;
& t* ~* o( z: O+ H6 m' z& { O
p* T8 E" m* i U6 D初始化
$ z0 c3 `" L" o/ K S+ o. H# V+ X" n- c* c; F) l
void InitList(SqList *L){/ d; V& C9 Y1 d4 Y
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
& }2 R7 g0 ?( i5 ^/ |$ d if(!L->elem) {
! N& ?9 o7 X; u' E& k) R s5 J cout<<"申请空间失败!\n";
% M8 B5 q4 o# m6 X; ] DestoryList(L);; a. f* n" h3 [6 I" U
}
4 d* S( Q$ o# f( L$ }" ?7 _ L->length = 0;; U: d, W; t: D$ }. o8 Q
L->listSize = LIST_INIT_SIZE;4 b. e' `! g( _1 f
cout<<"线性表初始化完成!\n";
0 G8 r6 k+ }# [; a6 Q}7 Y U. Q( F8 ^% m
. d! |1 j& a# @0 x/ i
增加元素
( [, E$ g; R# ]2 E/ r! F6 c: I; K0 C3 z/ x( E
void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
/ m9 J2 J/ {4 @ V: w* x! {/ Y if(L->length>=L->listSize){* O4 h& f8 U& {% ]
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
" G; I. r& V' [ if(!L->elem){! @+ I6 F. {; {& m1 k6 D: T
cout<<"增加空间失败!"<<endl;
# N0 V3 W: a. x& o0 {) C9 q DestoryList(L);
5 o) H$ K; n: {6 ^ P" P- _ }% @; {3 P. ^! v" i$ d# Y% ?& V
}' ^0 E, a: M2 }
* (L->elem+L->length) = e;6 Y8 P) G: p0 E% ]! {
L->length ++; 0 n5 W# y+ ]. Z+ H( W6 ]
}
, p2 k3 p6 e9 j: L4 Q+ X7 K: W# d: b7 v: I
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素8 c$ X! [5 B" N' G7 C3 f% P) j2 H( s
int i;
- l$ V0 Y) j$ u+ V- u7 S# i L->length++;
0 Z) E7 }6 }5 o* f9 H& t6 g for(i=L->length;i>=e_where;i--){
- g/ C( B3 P% `* A0 a if(L->length>L->listSize){& s+ E# Z" i. M9 Q$ ?
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
9 N/ Y. q& U# S1 I; ^ if(!L->elem){
7 b5 _1 U9 m$ B cout<<"增加空间失败!"<<endl;; p* E$ ^0 [8 C8 w& R" `2 b
DestoryList(L); * I7 o" M, O. o" Q4 m7 k; ^- |% b
}
! A Y6 z1 S5 V- F: ^ }' P F6 T( A- e$ C) L
*(L->elem+i+1) = *(L->elem+i); : T5 T7 F4 D) {2 y" i
}
2 P5 `! b: X0 F *(L->elem+e_where)=e;& C; F C1 T* j$ b( A: }# K% P1 ?
cout<<"增加后的线性表如下:"<<endl;
: r& K# a+ _8 P- r ListShow(L);8 G% {# S6 g# }; `- o }* M7 r
} . A; \8 p/ G2 h
: C5 j7 P0 P7 o
void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素
2 C8 k2 p( A9 j% q3 ]1 l" i8 i int i;
; Q- ?" r' W V, [ L->length++;
7 S9 U$ a& Y: n' `2 }! h for(i=L->length;i>e_where;i--){! o# \3 l: {1 s4 `
if(L->length>L->listSize){
$ f7 ~, y9 E3 z L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));/ B( A, n5 Y" g/ L$ a8 d! l
if(!L->elem){
7 K. z7 B! W/ P0 Q& \& t9 b& T( V cout<<"增加空间失败!"<<endl;
; ~5 \: W0 c5 Q, U' O DestoryList(L); ! H% z+ I: l8 D5 `3 F) R9 r
}
* e, j2 D; k9 f Q }
1 h U8 w( k" I# P *(L->elem+i+1) = *(L->elem+i);
1 [; B4 D1 y q# c5 K5 E }! {1 ~ R0 G" w) }" j8 |: }# N
*(L->elem+e_where+1)=e; n: i |! C J1 S
cout<<"增加后的线性表如下:"<<endl;
* B0 {0 e4 r. _; q+ B& ^ ListShow(L);- |; f2 `) w) F: H
}
+ a1 f1 Z1 G/ Y2 h- R! M6 a3 P2 s0 j& ~2 N# B
删除元素" B' V# T* U* H( [6 U4 u6 f; k
9 e! k% ^6 f, z; r8 k* {$ [
void ListDelete(SqList *L, int e_where){ //删除某位置元素 8 V u" h+ q, }
L->length--;
6 F% ?+ @5 S' }0 p( ~ for(int i=e_where;i<=L->length;i++){% z' I; J8 ]' M' _
*(L->elem+i-1)=*(L->elem+i);
5 G' D; P$ L; @* g }" ?0 e$ Z) w- ^4 n& i
cout<<"删除后的线性表如下:"<<endl; / p+ {+ j7 Z- D- T/ @) L& c, o& o5 ]% Q
ListShow(L);2 j4 T0 Q+ \" c# Y6 @0 k' z
}
8 O8 K7 y" D6 O* {- m N) M$ G
1 p* b6 t8 d% i% G: ], X; m销毁列表
% b4 W. O! O' r. s/ L$ S2 A7 H& R# }, e; F- y% b; z0 k
void DestoryList(SqList *L){
9 ~$ o9 v' Z4 v! j! F' ? int i=0;
4 E1 N% L8 p0 M0 ~ for(i=0;i<L->listSize;i++){) z. X# a0 J( V1 K% T, w
free(L->elem);
J0 i/ T% F! x$ G L->elem++;% W; B Y. T0 o) a# z' F
}3 l) I( ^, W' D9 `1 R c" K. {
exit(0);
& m8 K8 b% P+ J; [% w9 q6 `}
6 G6 j0 S; l, d2 `, O- O N* G6 e& w. s- s, h. J
链式表示方法
, [" I9 X- o' N
+ V) L3 A* U! X& L! K结构体定义. E( E, C+ ?" w: l4 j* U
& l6 p- M: o& h6 G$ E- Ztypedef struct L_Node{
" X' Q+ h) B8 j* p: R ElemType data;5 R3 G A( ?' Y5 e
struct L_Node *next;# u& A/ b2 y- m- B. H9 [( x M2 U
//struct L_Node *last; //增加可变成双向节点 8 X, T/ v% R9 Q* ^3 I( H) A- j
}LNode;
5 r7 i1 Q, o8 s+ h: ~- J
: P: Q N! l4 ? y- f初始化
1 W; A& G2 q0 T! f) e4 ^7 Y2 e, b' N3 d: W, I: r8 _+ M1 H
void LinearNode::InitLNode(){/ T; N/ _; Z: N" {, Q
HeadList = (LNode *)malloc(sizeof(LNode));
) f4 i; x# q- M+ A- k* B6 T5 { if(!HeadList){
' x3 d$ u3 H& y. x! p cout << "初始化链表失败!" << endl;
+ L/ B' }) [$ A. R! ^( a exit(0);
3 b/ _; J' _* x } ! f7 ?. J8 i4 Q' U g; f9 o
EndList=HeadList;
/ ?) K& b) }; r2 [3 l/ s HeadList->next = NULL;0 p' X9 r" f4 o1 q6 o7 `( g
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
' P8 k) z1 y5 Q+ ^ Length = 0;
]0 o$ T' y3 f. J- H* e" M: k: E e_where= 0;
) u" j! ?, M0 ]) A V}) |7 K* t: c% f" P5 x# M" Z" [
" a/ o4 c" B/ U# w8 w# h9 q
增加节点
4 G4 j0 H& @- V5 u
# g1 T$ z: u" ~2 Z- o7 `void LinearNode::AddNodeHead(ElemType num){ //头插法
, ?0 c2 t4 q0 w" T& \ node = (LNode *)malloc(sizeof(LNode));- B* {9 C) W9 V3 {! A
if(!node){
+ S) e+ k3 w5 @% f5 ^ Q- \ cout << "新建节点失败!" << endl; $ X% T4 Q9 p6 O5 h- F% `
return;
3 b: c/ ^! ~0 c% \ } & A8 V% c4 ^0 X
node->data = num;4 ^5 G0 i6 X* a3 D$ \( I' J5 j
cout << node->data <<" ";
$ S/ U0 ]$ t! Y' } `9 ]+ B if(NULL==HeadList->next){
- f ~0 g( Z: n node->next = NULL;* r/ N( ]9 `% }7 n* Y
HeadList->next = node;4 ^( h" L4 ] V3 I, Q/ ^" [( Q* W* |
EndList=node;$ L" y6 f+ D( n* C
}# D0 s/ \# b; y! p3 ^" b# H& X
else{+ i6 c* [+ o5 T5 y
node->next = HeadList->next;
: C4 W5 D' r& y$ ]- b) E$ L8 v9 i HeadList->next=node;
5 {+ L" f7 b6 w6 }2 R# F }
! h0 r( v4 H( x; ` Length++; . U1 ^# j8 M# x
}
2 P* {0 c1 E* [- j8 b% ^
4 i( S3 D2 q6 e! o: E1 Yvoid LinearNode::AddNodeEnd(ElemType num){ //尾插法
% X v' I% f2 {) o node = (LNode *)malloc(sizeof(LNode));
, ]' @, T- X9 S6 K if(!node){1 f* v: ~0 L* m! L# A/ m: w+ X5 {" E0 k
cout << "新建节点失败!" << endl; + M& m8 r- P+ V+ K- v
return;
6 y* l. Y6 L v. i3 P } ; d+ l" A; c8 ~
node->data = num;
1 u# c& M Z+ z6 R- e cout << node->data <<" ";* j0 g+ ?9 [9 _7 P
node->next = NULL;& l+ t1 B& V. g' b5 P! T$ S
EndList->next = node;2 W. h& z2 v# S" X& \3 F
EndList = node;
% D, u! r5 u3 s4 ]6 ~" g Length++;
/ v! ^! A2 L. W}- I& P# ?+ U ^
, H# n& g, E: ]5 s; D删除节点
/ i. e; A0 D2 t( R% x7 T9 M9 g* F1 \+ I) [: a3 b/ y
void LinearNode: eleteNode(ElemType elem){5 r; \& s" {0 [5 C/ O. }4 y1 J
if(NULL==(HeadList->next)){
9 B) E2 W' C- h cout<< "无节点"<<endl;
' ~5 v. ~9 Q* [; F- v/ g( u7 t return;
2 @3 d, ?6 o* n. Y! x }8 p) V, I& C8 [/ O0 i- _( ]% r
Node_cur = HeadList;+ L d6 W; W5 U$ o, w
while(NULL!=Node_cur->next){1 ?% ?. e5 h/ E* [) E; n' ~
Node_temp = Node_cur->next; - v! Q3 R& g5 H
if(elem == Node_temp->data){
- b. V! d9 w" m2 F, i& b- U- I Node_cur->next=Node_temp->next;" Q( Q9 l0 q0 N6 [ `) l0 \5 ?
free(Node_temp);+ T; F9 t5 c, M' p, D* A
}
1 u( C% W/ g8 u% a) b! [) d if(NULL!=Node_cur->next)( H! U& ?* ?+ u& J7 t. o
Node_cur=Node_cur->next;! j' q: A6 i5 l; k, R5 ^
}
! ~! S5 I. w, u* G cout<< elem <<" 元素已删除!"<<endl;
6 F+ U' {% }) e ^% y4 p% d+ l) P} 3 D& G! u4 C! Y
1 P9 F- p6 I/ j% P( E
显示链表
! B4 m3 r1 l% V9 G3 R! q5 `* d( ?# \! x$ l( u) B& D3 L
void LinearNode::ShowLNode(){/ X% d5 `1 U) T" w/ c: x
if(NULL==(HeadList->next)){- i& G2 g" [4 D* B. X \2 O
cout<< "无节点"<<endl;
, B6 w! m9 M4 s: Y' S return; # Y6 s/ H- J& Y c+ [: K8 M
}
/ k/ s# H# V* W2 ?4 e Node_cur = HeadList->next;
# S5 V$ U+ S* ^- s while(NULL!=(Node_cur->next)){) `- T, l2 Y# G* R2 B- @' b% `( c( ^
cout<< Node_cur->data << " ";
! q- ]( S$ q8 |2 A G8 ~ Node_cur = Node_cur->next;
5 o" c1 L& k; y3 K' |6 B8 I }- G6 u! G- X! w
cout<< Node_cur->data << " ";
8 v$ ~2 j9 Y2 w. J0 D( B cout<<"链表中的数据已显示!!"<<endl;$ @5 W0 W- ]6 \0 k
}
) I0 P' a2 B: n$ l; a. m) B& f
. b0 ]) a/ l- f( A8 e( [销毁链表
6 T- x, R) D4 u: ]- ^# J9 ]! P5 R: ?. A. `2 y* y
void LinearNode: estoryLNode(){7 I6 ~! P* _* {/ X. I9 v& G
Node_cur = HeadList->next; 0 n" ?9 D4 y9 ~" }! h4 s9 Z8 v5 @, ^
while(NULL!=(Node_cur->next)){) s1 Q- X1 J/ L& l
Node_temp = Node_cur->next;
$ D: ?3 u1 S) K' d& K free(Node_cur);2 x; L' o# B0 V
Node_cur = Node_temp;1 M0 y6 z, m ]0 r" Y" Q9 F
}1 y ?% m+ D; C0 ~; _ G1 V; V
free(Node_temp);
1 k- Y* I V6 P/ t cout << "数据节点已完全释放!"<<endl; & k- y& ~ \! q! W! r, s+ Z7 |
free(HeadList); // 释放头节点
, u0 h( k/ n1 _: \' u' b cout << "头节点已释放!"<<endl;
- r# c" J$ J! k! c————————————————
, t1 {0 [/ u5 P, a9 ?/ h6 p; B版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 d7 |, g- h6 C/ P4 W& f
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
0 m( m6 ^$ Z, M; B$ K: v/ A* t
, V O# ]5 z! K2 n6 ?
9 |; z" q* Q9 Q1 K2 v |
zan
|