- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565591 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174900
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
# @, ^# v/ _5 q( c6 B# d线性表顺序表示、链式表示实现方法及其异同点
3 `8 M2 N% Z" `# r1 r h+ a线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
* G: j6 y S/ F; e
' O: d/ {- _' v- @" Y; [: T3 w本文采用C++实现两种表示方法。
s; v/ T$ v! g6 {# L$ L
, l% r2 s" V4 q0 C+ N目录" h, a" n! h$ [7 R4 o+ {
# _: R) y! h2 o. \3 P: z- }7 N, Q顺序表示和链式表示的区别:
" z6 ^3 _5 E% K
% e/ n4 [' y1 u创建方式:
0 O: x5 l: ^" k: q& }% y9 }) k0 g" s8 Q: ]$ J2 q
时间复杂度:, D8 N+ v) b+ K1 k% `1 p
0 g: d3 t; V }. z) D0 C顺序表示和链式表示的相同点:/ ]; S# c5 T# E( [& Q
9 i1 ]# y4 S0 j; N2 ?, N4 f删除内存空间:
! M6 z O* ?$ t2 k4 B9 G( y) C( v- a9 c. d; n
代码实现:
8 b: f- b. A& O4 p7 b; h8 b
6 O5 h! M0 ^' z: w9 v S/ K) t顺序表示方法:, l; y* {4 z) R, h6 U1 r
: b: g+ }) D) ~3 [$ G; s0 P
结构体定义
$ y+ i* N7 N; Y4 u1 S- l, e! v8 ? h/ q d/ n0 [- c
初始化
! w/ j2 Y1 C( G4 j: l$ G, q1 A% Q3 m* |( ~! c: D) ]
增加元素
$ Y* m$ R+ E& e+ Z {& M
" I+ M) C1 d* U l9 }1 H删除元素
, {. @- W+ \# Q* C1 @4 x- u! N3 l. \2 j- G+ C5 _
销毁列表: q' ^& ?5 E/ b- c) y% X6 c
, t7 y# |, L: C: j3 \6 ~& V6 r
链式表示方法
" q( m( `2 u9 n, W- _( T5 B: L* i
- X) |$ L: h; A; n结构体定义& n" p* f4 }6 J5 Z
- v/ F" I% q7 ]6 }
初始化4 k" f- H& R" A% @9 S$ `- h
* Q7 w; v# [1 l* n增加节点1 L2 j' l" S% o/ H2 L
" b( n, F: l% @. k1 K! G! w' T
删除节点
; a! r4 N+ Q/ L9 t
) c* [7 g |# n2 {. e% A显示链表6 B1 U/ F5 g% A6 | c/ T: M
+ o/ l( G4 z I: p5 \
销毁链表/ `* o, _! [" U8 K( P/ D( }4 V
# i8 D: a7 R( \9 h/ q y6 ]
顺序表示和链式表示的区别:5 p4 m0 X4 H C x5 e) t+ m3 \# ?
$ b5 F8 i" A1 U/ o3 d创建方式:7 w9 U4 D6 R+ H) H" } V
& z, b+ b; v: h0 f
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
% C7 h2 Q' n+ H9 x+ \4 r3 V0 y8 O' j- W6 c a
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)1 |5 Z B$ W. w$ p/ l7 o' j# `
/ u# O& M* A- @6 w链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。2 p8 p0 U- `9 [7 U: f1 h
" F9 G. j% h$ k, J3 C- {, J1 B时间复杂度:% c) Z! F D# i
* P. S0 p% F* H+ |9 d8 ^
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
( d8 f6 t& w. f6 U# n- M9 d$ C6 F# ~" j
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
$ u% s0 {5 h$ ~6 |7 J5 }) }2 J: v7 k) W' s7 H6 K$ N
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。6 N: F8 J3 i+ l, j* {! d$ w8 K
, t( m: _2 l( _& ~- O& J0 ]修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
+ J/ v2 W9 N( N! R J
3 Q3 D( ?6 Z. `, n: D- ~查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
! u0 k8 W5 t( {0 |) \3 F* |4 B# m' @/ m2 D
顺序表示和链式表示的相同点:6 w, l4 B* d9 o) _% D! h+ ?; E
+ G# B ? c0 a# I: G& j' a! a删除内存空间:
& B: `4 o6 c' I; l7 t. {6 g+ _- v5 a( o& h$ d, q; V P! {$ O
内存空间的删除都需要对每一个存储单元单独释放空间。7 S1 D/ A1 c0 U
/ x v( A, y7 i/ q1 P
代码实现:+ P7 u$ X9 {% T* _/ S3 ?
4 l# I! x8 }+ ` L' Q* Z顺序表示方法:; N6 k7 V, M% S3 T, Z5 A- K+ ^9 L& ?
9 x% [9 U, Y. B' K3 x9 t' o' A
结构体定义
3 j4 G2 p7 Y$ c- \1 H/ m) [' g9 P$ z( d/ Q* U
typedef struct {
4 O5 z' ` ]* J ElemType * elem;5 f5 ^; _2 i& k0 q
int length; // 线性表的现有长度
, w4 A/ p8 H- o+ g" ?5 D int listSize; // 线性表的最大长度
$ z& @! c9 D3 j; l6 J7 A}SqList;
3 o$ u& i: S/ [; v" d& D
' P. Q" c9 n" I初始化: ^4 l! p' `, T( [1 k( S
* X7 i1 E4 N0 G5 W2 E1 s, Xvoid InitList(SqList *L){
8 C/ x% q: J+ C8 S L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;; \7 h: X% r- y! m% v
if(!L->elem) {
; |4 g7 c/ {+ M- d& Y t3 M" y cout<<"申请空间失败!\n";
! g+ G7 D$ s8 B0 C$ `- u) g$ m. N DestoryList(L);$ ^( U7 T7 S+ s. {8 e
}' z3 h4 G7 p3 y% i
L->length = 0;; M& A, y4 U6 y& c$ M
L->listSize = LIST_INIT_SIZE;
4 ~4 M, L% G9 } cout<<"线性表初始化完成!\n";
, s6 m, w* R* m+ d' a4 o* b}
& e' U5 O6 S8 F* z; V( z
( B7 D0 P4 N* X6 V: ?增加元素: A# ^9 o9 {) H) o8 B. K
: Q( {! v) v' y2 dvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素$ ~" U7 i+ w- f; a* Q8 H% N, v
if(L->length>=L->listSize){
2 b6 u ~1 y; s* f, a; u+ g L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
5 @6 {5 A: Z/ r2 Z' c; K if(!L->elem){ I1 f S; q. ~: x
cout<<"增加空间失败!"<<endl;9 [+ y8 @: F. t- b. d
DestoryList(L);5 D( L: h) E$ Q/ s3 B) i- A
}
# }0 C k( z5 R' Y2 J1 T" c- X }
1 v! q) }- k' @3 K. s! h& u% M * (L->elem+L->length) = e;
! b* c" V6 j; F) }$ y7 e) j L->length ++; 5 `; J0 a8 X6 g7 f
}* D G9 V7 [" Y. d
3 l, d; ?% F8 ?& z) Y: e& hvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素; B; }8 W$ y5 a6 S, V9 n" w" M- o
int i;
+ h0 Y% S* V7 n9 O L->length++;
+ Z5 T: Q8 E2 V3 U8 \3 H for(i=L->length;i>=e_where;i--){
$ S& j0 w" @$ j if(L->length>L->listSize){
( I( s; B; ^* y; c3 b: e3 S L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
' \ h* z# ?* F F, @ if(!L->elem){- f# [5 R5 {, w" U) w; @
cout<<"增加空间失败!"<<endl;
% i/ A1 r8 E2 y6 E, B DestoryList(L);
! \! S. m$ x+ x& s# `2 K/ E }
1 V$ m M7 K8 M! E" p8 U4 j }& z" x& t6 V2 {8 S7 P& e; A% o5 d' t
*(L->elem+i+1) = *(L->elem+i);
2 ~- b: |: v, a }1 j2 C$ b% H, v- g& O b
*(L->elem+e_where)=e;( }0 E# U( U: I) ?: l
cout<<"增加后的线性表如下:"<<endl; ' S% N. \% y2 E: B, C* V6 X6 i
ListShow(L);, Y( l# A8 y. Y
}
+ b- \% O1 b4 u+ C: ~
; f9 V# ^# ]; w% N9 L' q* H% d, L, U; tvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素9 t2 ]2 ?3 t1 Y8 U$ \0 S
int i;) @& }# ^# s" D$ Y) }( \5 I; v
L->length++;
& f4 N( k( X; Y* a: l1 m5 t# _ for(i=L->length;i>e_where;i--){
) O' \9 Z$ O. |, A y if(L->length>L->listSize){
) A8 j& b, A. X B" `1 p6 u L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));6 G9 Q4 B/ q/ U& Z* b) x# F, Z
if(!L->elem){; f1 o( L5 H6 G
cout<<"增加空间失败!"<<endl;/ S1 ~) _1 s: u9 N
DestoryList(L); - n7 r) ?5 ?' c# E; ^% G
}' c; ~. U- X3 L; {- C G
}
# z; G6 T3 g1 C% A, @ *(L->elem+i+1) = *(L->elem+i); $ I J7 \5 W! t8 T. B! S7 ^9 _ H
}2 R) j1 l% t* l
*(L->elem+e_where+1)=e;; _" j# h* B4 k t
cout<<"增加后的线性表如下:"<<endl;
. [. U3 n' m1 G2 k) j ListShow(L);
4 D* I9 z; [5 |9 W# t8 Z- r}. S0 p# ~1 v$ \( |, J
0 X3 N4 @. x* I删除元素
1 I: j A% K2 i
: q, l5 i& e$ {2 wvoid ListDelete(SqList *L, int e_where){ //删除某位置元素
( s! z E" ?, E$ h4 ^. o# `& H L->length--;/ [) `9 |. [6 Y* t1 v
for(int i=e_where;i<=L->length;i++){
/ d" `, M" x. v *(L->elem+i-1)=*(L->elem+i);
& _' `, x+ |2 J" o; e8 Z- p }
2 ] o& |/ B- v0 f9 h' i cout<<"删除后的线性表如下:"<<endl;
# Z9 \; x; Z* i* f: p ListShow(L);
1 D) S, q+ x4 M: u% W4 j' Z}
9 @1 ]* _" a( r
6 M0 u! G- r5 D. M; u销毁列表4 {# b" p4 b2 w, F
( A; j0 M+ p8 o% P) h& n
void DestoryList(SqList *L){" b: _+ Q9 o4 Y. K8 I- l
int i=0;! v5 E8 A# F+ _
for(i=0;i<L->listSize;i++){% y9 r% H, |; I; m; h2 @7 ]
free(L->elem);9 H+ U( b Y/ }, }
L->elem++;
( e- m$ t7 G$ Z; q% G; o5 U }
8 g0 {0 j% q, Q" ^3 r" ~ exit(0); ; v% R( ~4 Q2 H0 L7 x
}
E" ]- ^2 D7 @
" l9 y8 Q1 L2 f2 p7 F链式表示方法
7 ?7 t3 S2 `% K% U% N- Z- ?3 x4 n
结构体定义; [- q; t. N% M" ?
7 T2 y: Y0 N" O! t$ U( j: ttypedef struct L_Node{, k) e) f- `4 m5 j" ~4 p5 W
ElemType data;% y1 S7 s ~6 S+ o! K
struct L_Node *next;
4 E% l6 P3 t7 Z0 A5 W2 U //struct L_Node *last; //增加可变成双向节点
/ ]( ~3 L x1 _& {' s$ g3 [+ F}LNode;. |) c' S, \+ q9 u' V. l4 I* B8 s
7 ~) ]/ |7 S4 u, z
初始化8 @2 Q2 d% V9 W0 c; K/ u! u
. P$ F( y3 ~0 x3 Qvoid LinearNode::InitLNode(){
* z) x) @. N3 S" e9 e, t HeadList = (LNode *)malloc(sizeof(LNode));( O. O4 M+ ~4 {; z6 H" D
if(!HeadList){
5 f( h3 ]+ x+ A |) q5 s# c, h cout << "初始化链表失败!" << endl;
# i" A0 d( j' g- l" h: Q% z exit(0);
2 P3 F) F2 B6 R" @7 ^4 a }
% e. l" C: A: Y. f& G EndList=HeadList;
|2 w% {8 m. \. ^ HeadList->next = NULL;) o9 U. b1 g! w- ~
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;4 {0 u# M r! r% i- v% @$ Z' O
Length = 0;$ o# N8 U# ]9 b! p' e0 O$ K
e_where= 0;
, A, ^+ S, {0 ^% I$ R# y}
, M1 l/ R& q" M4 V/ m- y- h- s& D2 B
增加节点
1 i0 p2 }2 @/ f; \" j+ L* s6 L3 R3 C6 D* s9 _2 M+ L
void LinearNode::AddNodeHead(ElemType num){ //头插法
2 y1 m8 J! f2 M$ n) |, @( H, O/ g node = (LNode *)malloc(sizeof(LNode));
* a/ d$ O, J% C; y' Y if(!node){3 r1 X1 u2 ? ]7 U' r1 X
cout << "新建节点失败!" << endl;
; N5 e0 @5 i4 Y3 s6 |7 t- S return;
% [' [; i6 d/ }2 z5 r) H }
4 h/ d) b1 V9 V' ^7 j+ \ node->data = num;' v6 I2 c$ j* ~. A4 U6 r5 F! D1 i
cout << node->data <<" ";
& k0 b- ^2 N: R c( U) ? if(NULL==HeadList->next){4 q3 n* z" D! w! x/ U
node->next = NULL;: u4 y; M9 m6 k5 @& ]5 d7 H
HeadList->next = node;
4 e& _1 w2 ^. l$ D EndList=node;& j: D& ~0 Q7 Y- m( `; d1 O
}
- q( T3 d# ]: n8 c: e else{' K+ ~: g( ]( S. r( R8 \
node->next = HeadList->next;
# n+ t3 q: }+ k; z8 B HeadList->next=node;
' v7 j9 z1 C/ z+ l }
! j1 w$ E! ?3 b9 C* H, w Z Length++;
# o1 I0 m$ F! E4 y" i}
8 {2 \/ c1 L/ b) b7 F1 k4 K! W2 t" W7 L0 W9 X2 d$ ~
void LinearNode::AddNodeEnd(ElemType num){ //尾插法 2 _5 j6 M" K* R' _
node = (LNode *)malloc(sizeof(LNode));. K7 r& S$ Y4 \; U& J0 @% G( ~% w
if(!node){3 f; k& U {' l; s2 F
cout << "新建节点失败!" << endl;
7 ]8 M6 H0 l6 o2 ~1 _4 r2 K! V return;
. q1 N( L6 _' o j7 l& \" u, f }
2 `% M0 Z/ S5 M: D. F, J node->data = num;
. k ?! r$ p% i6 z cout << node->data <<" ";
0 x5 Q, M p7 d! @0 z0 d node->next = NULL;
5 `6 `' }: `, X* ^2 N, J EndList->next = node;* x: A# T+ _! n4 y0 r4 Q7 l0 i
EndList = node;# B* _& v- H6 D. b0 E# @
Length++; $ e; ~5 Z3 ^/ D
}1 F% s+ j9 A, }- \. w" `% ^5 t. P
9 S9 D& D- u$ @# e1 J7 Y删除节点+ B& s1 w! w; @7 Z+ q! X
8 M, g/ P; R7 X5 h4 ivoid LinearNode: eleteNode(ElemType elem){% s1 e* ~3 `0 f2 [9 E
if(NULL==(HeadList->next)){# U% `' e' O1 a: N E* C! X
cout<< "无节点"<<endl;7 F/ l3 D" I- h9 j# V% v
return; 8 l7 S9 f7 D* h( F0 r2 {
}, k$ h) S# o [+ r% {
Node_cur = HeadList;
- {4 r6 X+ l; m; i while(NULL!=Node_cur->next){8 o$ Y1 B- H' W8 {% z
Node_temp = Node_cur->next;
2 q/ C6 G+ _# |" O8 I" A1 j if(elem == Node_temp->data){% ?: u, M4 U- c' y* g
Node_cur->next=Node_temp->next;" O7 h8 G3 X7 \5 ?! {4 _0 t
free(Node_temp);. `% ~, X% x. [9 m* V
}$ K5 i7 y0 W3 x: q: j
if(NULL!=Node_cur->next)
; b) h) Z! D. ~+ J D% O( K3 c Node_cur=Node_cur->next;* y6 a2 z7 U+ C f: A$ V
}+ o$ ?7 a! A7 X
cout<< elem <<" 元素已删除!"<<endl; 1 {" u3 Y& S1 o4 W
}
' n1 l7 `7 H _
7 m5 x7 R% R S% X8 ~6 b4 j; L" v0 I显示链表 D& l4 q$ d: {. R( V# l# ~5 A
. @2 }* {% `; Z0 f5 k9 l# ?void LinearNode::ShowLNode(){
' a$ `; T5 A2 ]$ o if(NULL==(HeadList->next)){
5 o* F) p1 f% `7 W7 d. I% T' a cout<< "无节点"<<endl;+ h9 f0 j3 w ^/ Z4 @
return; , I+ F6 X+ `3 p: Z5 |+ ~3 ^" t$ r8 n
}8 k1 Z1 K# f* a
Node_cur = HeadList->next; # q# T8 R. a, F/ Q0 j' c! d# s0 A
while(NULL!=(Node_cur->next)){' _* C P" I0 K, m: c5 R
cout<< Node_cur->data << " ";
3 |- v1 P. n8 S% p" T4 ]8 d) L Node_cur = Node_cur->next;# \, X% m+ v/ L) P
}8 y% ~3 |6 L% h# Q. w
cout<< Node_cur->data << " ";
3 o4 E8 p1 k- B* @* ~ cout<<"链表中的数据已显示!!"<<endl;
$ y5 L! ^1 w, {% `; J4 {4 u$ z}; A9 V: S9 m# h+ V$ w
; f& E' R5 W* p7 y销毁链表
1 Y' J' C/ L+ t, ?
7 n; c8 q9 v: g6 Qvoid LinearNode: estoryLNode(){
7 P& Q6 \1 _2 H$ f) Q# Y; R. [ Node_cur = HeadList->next;
# Z) p' ?6 S& w( e" e( k' S while(NULL!=(Node_cur->next)){
: [; r6 c: F/ Z Node_temp = Node_cur->next;
! _6 ^' j: h' t free(Node_cur);: {$ H; L; n2 n8 `) u" L
Node_cur = Node_temp;
, E. k! H# {8 D' ^ }
+ Y& _% `0 l3 T ` free(Node_temp);
& I$ P( w1 L# K$ S6 g cout << "数据节点已完全释放!"<<endl;
5 F( |8 l9 t4 ]4 H( d' j free(HeadList); // 释放头节点 W1 m+ E5 s: a* m& ?! v
cout << "头节点已释放!"<<endl;
& e: @; u8 [$ Z————————————————. c8 v2 g0 y9 @3 P3 I) s6 V- m0 i& c
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: B: e9 s3 m# S5 ~; z
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286 r. W) M* {' N0 B E# Z6 s
* o$ T4 z% W5 z
5 j; A) ^3 J$ B% V: d u
|
zan
|