在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564664 点 威望 12 点 阅读权限 255 积分 174622 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
3 T$ _, t5 x# X# q( a 线性表顺序表示、链式表示实现方法及其异同点
+ {9 h" g% d6 D. W" D' p 线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
+ j4 ^5 F& [- {& V g" d0 o
2 i, ~! b7 A" V. h/ W 本文采用C++实现两种表示方法。1 ^8 ?* R6 T( x5 I& O+ o3 M1 w* E" e8 j
) [+ x3 V) i R- z 目录) o3 Y$ `9 a) I& m
" p" Q* }. |# c- Q6 t
顺序表示和链式表示的区别:
) n9 X8 V3 m% |) V. A" g
! n, R+ W* Q* o+ ^8 D b; a. T 创建方式:
, l' O& c9 o: d 5 U) J2 @2 D p! k% d6 L
时间复杂度:
. ?/ _4 Q8 W" z/ V
" v( ]& M3 v& R a) t) w* O 顺序表示和链式表示的相同点:
: B7 m. p" Y" A; |* T. x6 U - b3 K8 F0 {: g w4 s# K4 O
删除内存空间:
3 C9 v% _0 B9 x( j! V, [4 v
. j1 N' {) y; S4 P( P0 u 代码实现:
: [9 E( _* g6 H( D+ K$ r ( |! ~$ Z6 _" M
顺序表示方法:3 A% D% z8 M8 S+ p( m, @( a7 @
" X9 Q! O: v6 O0 J8 K+ B 结构体定义4 u; h! _0 ]- S
; Z9 i- I( m6 K' k; y# ?" V
初始化
2 M( c) ]" \8 o: @- a 0 o: U u3 R. a* h* g8 P$ u
增加元素
" c9 b V& A R; {4 H' l) W1 s. u F' [1 l9 q5 t1 z
删除元素+ L* s. a2 K. R; [: s2 p- A) K
! J0 B$ c s: ?* e! a+ l 销毁列表2 o- |0 M, t, {0 [+ A1 e& y5 A
n5 [% Y8 U+ |5 B+ X3 b
链式表示方法- f2 ~: }( T, P, Y6 o+ B
1 B/ p& {7 r' Q, @: N 结构体定义
3 g: `( j* r- t9 {% k' ] ! u5 |# }, \9 V/ e
初始化& g* @# ^2 B, c! U3 ^3 a
' V Y4 E8 K8 h( Z' g" |6 P 增加节点" J. E! u. {5 z% ?* M9 j# R4 r
5 C# w- V e5 E) X" M5 {1 i" b
删除节点# ]) P& V0 g. M
/ f! |4 s& F" b K$ [
显示链表4 z4 w) L M3 z4 S8 x; l
' A1 T5 N8 w$ G 销毁链表
! r; |0 Y% K7 S7 o C! D' F
! { |8 F* W. b1 W r 顺序表示和链式表示的区别:
$ v7 O6 Q) ?' a
; v' n" r/ }7 C* k7 Y4 g r 创建方式:; M) @/ H: B$ [. V
3 @6 H& J- X+ u) Y" r' \ 顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。0 o1 d' j1 Y, p% f
$ Q. z% e0 D9 }+ w3 { (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)" D3 `# F4 O2 h( u# J8 Q
1 ~/ w$ \; m) M' I1 x: R/ ?
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
' K+ m/ L- s- _& _# Y8 f1 ?: V& _- y
1 l( y; [: R% q2 t+ I 时间复杂度:
- r! {& L* e' z2 ?
6 A1 a1 |2 x) J2 A2 r4 @4 | 增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
1 D" G1 J, M/ H0 k! ~# G
+ @ I: k. _2 a8 ?, I2 b 增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
) y z1 p+ v" q
9 U; Z0 [9 ]2 f6 b' I3 o; s1 U PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
+ Q; R% E- K3 s x% C 7 J M y1 N1 Z; x, u
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
" I" f! f/ z( F2 w7 | % v) [9 c9 U& q2 w+ y; a
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);5 o7 N% j* Y# C7 E; S
3 K# V; d# A" D8 H% A 顺序表示和链式表示的相同点:
: O7 w2 i; \( [) N, L& f
+ a' I# i5 q9 f4 ` 删除内存空间:
; L9 b% ~0 S H; q
* ^ C. G) }2 }3 y' b3 ?/ Y 内存空间的删除都需要对每一个存储单元单独释放空间。
% x# V, F; ]% W) `, X
- _& S. f; P- {' w: S8 d; C3 y 代码实现:6 b3 a& |1 j' c. w. E
! S3 K6 z+ X d; V5 m 顺序表示方法:
7 ^/ {1 V8 E9 }7 a& R
; Y, K1 C/ u# r2 O 结构体定义
2 H/ g4 f* u/ X8 i' q ) {9 e, v* p% j7 H8 x1 O% F
typedef struct {
6 o- f2 D. }4 F9 U7 A/ c ElemType * elem;
3 h# k5 U+ U) p4 m1 y5 F- _. \5 l2 d int length; // 线性表的现有长度 % O8 g" o; R# }) J( d) D* v4 C
int listSize; // 线性表的最大长度- i; \6 _: K" H$ p" p7 n& L
}SqList;+ A' |* Z9 Q, ^ l" i! f) a% \, m3 o
/ u$ I" d# a; u
初始化
( v/ S; y3 r1 L' } 1 |* V6 Q+ `) H3 O, s# M
void InitList(SqList *L){9 v: H4 h# D( p" h* p9 D
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;; X: b$ R; j" |$ d- t( G' l$ a
if(!L->elem) {
7 }! V, z& o8 n* Z" ^0 e cout<<"申请空间失败!\n";
0 T/ Y( I. b; o DestoryList(L);. l5 d& E; G/ {4 w6 X
}1 b- J! R" m# ]2 w5 |+ |
L->length = 0;3 y! H; a/ M* W* ^: ?/ e! _3 c
L->listSize = LIST_INIT_SIZE;3 b. V( n/ H: C% z, H+ f
cout<<"线性表初始化完成!\n";
1 E1 @4 ?& ~# z }' B6 t. M+ a# [; z# x/ g) p( m
i) A/ A8 S. [% `; B$ r
增加元素" A9 X# k j( i: W5 @
1 x0 s+ j K: A; h& r% w5 L void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素
* {$ ~; A% I0 k" M( n if(L->length>=L->listSize){
, J* R6 m) M( q0 M( w' G L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
1 R. Y+ M9 p2 q# `; O0 z if(!L->elem){( R; l" R" w# t8 e3 K# u
cout<<"增加空间失败!"<<endl;
( k3 k) V3 y4 ^" a5 J DestoryList(L);
4 k" h; O1 n+ h2 P* o; L, F' [( i1 W" r }
- F: o/ Q( v1 ~: L. h) R3 r }
( D" v: y9 {- d* X( J Y+ ^ * (L->elem+L->length) = e;
( _; w% e* j/ @7 W- ` L->length ++;
- Y9 t' B3 Y7 x3 X" r0 { }
1 D8 M- N8 s5 c5 H5 \$ v z * T8 J1 N7 u( C' r: U% D$ v
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
: P) e! Z7 b+ Z+ g1 b1 e% ~) m) N int i;1 l' P& y# d: s% O- M$ B
L->length++;
% B+ {, M0 ]. E& q+ ~ for(i=L->length;i>=e_where;i--){
- ^: s2 z6 W S1 P, l* f if(L->length>L->listSize){
) f3 c1 P$ j) H L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
# X3 o3 _. l1 X if(!L->elem){
9 I. p' _ z! ~* y9 w- M5 [ cout<<"增加空间失败!"<<endl;
* u: h% k% i: X DestoryList(L);
4 g* e) c9 `6 n }
j+ m. B c, D' H i9 j& z }
2 o; N* f: l# }, h7 h0 j# ?7 o% Y *(L->elem+i+1) = *(L->elem+i); / |0 Z# v% y1 P+ L& V# K0 E( n
}& E' E9 Y1 g- Q- E( ~5 i" x7 C
*(L->elem+e_where)=e;
' D- N& s% z2 C6 | cout<<"增加后的线性表如下:"<<endl; . W) \2 A5 J( t' L, ]2 S
ListShow(L);/ x3 Q8 T3 D% H# @
}
3 C4 n+ [' U# {$ ^. D
- ]- U( d! ]& [# K$ U void ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素 v1 K# [! w+ l6 V; n# S
int i;
8 M# m* V, r9 ^ L->length++;, t! s0 S# P! a' \+ _& E* N
for(i=L->length;i>e_where;i--){. H* V9 B0 t2 i2 v& W
if(L->length>L->listSize){
) d' \( A, B3 Z) I, Z7 { A L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));; D$ R7 D |3 _! ]1 c# L
if(!L->elem){
/ |/ _; f, S& ^) Q0 j# O% m. ~ cout<<"增加空间失败!"<<endl;. s5 f; |; Q7 [' z
DestoryList(L); & v, m2 f9 A( h# Q
}
* N# S. u, H2 w }# W2 |( z+ D' r1 h! a
*(L->elem+i+1) = *(L->elem+i);
8 h" f" b/ g) {8 m# U$ h- g8 ? }- v" t& E1 b L3 Y
*(L->elem+e_where+1)=e;% V& ~: @% n7 q+ s, R
cout<<"增加后的线性表如下:"<<endl;
[$ P7 c7 s) ?# N: O& ` ListShow(L);
1 S2 A: K' Z$ J+ |. \( T& B. q }1 {# T$ k& p% {
: P! h, w5 H& H7 V( o) s
删除元素2 N( y9 a3 }0 z# Y7 T% U/ G
$ z2 F% Y, ~* v
void ListDelete(SqList *L, int e_where){ //删除某位置元素
4 w9 _. E) i! F3 u8 b L->length--;
( T/ D7 G) K, l7 n! X! R) C for(int i=e_where;i<=L->length;i++){: G0 }- ?. D4 Z2 E3 p/ L, `6 ?2 c
*(L->elem+i-1)=*(L->elem+i);6 S( ~7 O7 w/ e9 R
}
: x! m2 E( d$ b8 I cout<<"删除后的线性表如下:"<<endl; % v$ R% H) \; ^0 K+ W% w8 I; F
ListShow(L);7 E& U9 n% Q5 h$ x
}
6 ?5 A S$ |; s- R5 X \1 G; Y
, n' k( F1 P0 j) B" s" `5 L 销毁列表
2 }7 \* ~3 p8 |7 Q9 v4 k1 ? 5 x4 z1 E. w7 J% ~9 f0 Q W/ F, f( @
void DestoryList(SqList *L){; U' J: O" @# n
int i=0;
' b! k3 t8 f- f1 L, f3 }. n* O for(i=0;i<L->listSize;i++){
: D& a& d+ J$ c free(L->elem);
9 K0 @6 y' h0 g7 z1 r- E* F" { L->elem++;
2 d9 F- ~2 _; w* t4 z }
& k/ t+ O- F% O- S( N exit(0); + d+ X; {# G$ \3 h3 Y- P
}3 H! L' Q! s% j0 w1 u p# |
% |. M8 o b. Z9 X8 v7 H8 J 链式表示方法; j& ]& P/ ~% @ K1 ]
# e3 S& P5 w1 p
结构体定义
( _6 Y: C% a- X/ k' ?$ Z
; S$ H; Q) N6 Y( W. w1 V typedef struct L_Node{
: @8 `- s( B6 |1 }- \6 T. R- b ElemType data;6 v1 L1 S7 v9 E9 S% C6 c. L
struct L_Node *next;
" u* P4 E2 c( @# [ q //struct L_Node *last; //增加可变成双向节点
# s) B$ g) q% Y4 F2 s }LNode;
( ~; q9 X3 Y5 E$ h, [ 3 P/ W* M- @3 N3 G2 Z) g
初始化
& k% Z% N& x2 j4 y# n { @# s b- j( r3 `6 t, q/ B
void LinearNode::InitLNode(){4 {# ~* P* n( c8 ~7 T
HeadList = (LNode *)malloc(sizeof(LNode));
9 r, J; @9 _1 ^1 e8 K2 K" u0 Z# | if(!HeadList){+ M- z, p- M) i
cout << "初始化链表失败!" << endl; 0 p% b# G @1 b' n6 X& ^) X
exit(0); $ L& D$ O$ C' c
}
1 X1 O+ _8 w/ p* l EndList=HeadList;, S! Y) l) R% C+ w3 u
HeadList->next = NULL;
! _; @9 T: _7 J# {$ h0 Q) o2 v7 [ cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;# @) \0 {4 ^5 n d1 v0 ~
Length = 0;7 K6 W$ I2 P9 z
e_where= 0;
( H7 Z7 G- F! y9 Z }
; X/ S! \# i: Q4 o/ s
4 }, y Z( Y% ]# ?1 j 增加节点
- _. S8 c9 {; J; W% c" J0 j/ S2 Q( I: G 4 _! `# n$ ]5 C. z. B: U
void LinearNode::AddNodeHead(ElemType num){ //头插法 " F* o4 ]0 Q6 M; Q8 x) ?- Z& x
node = (LNode *)malloc(sizeof(LNode));
. D, Z3 z1 W$ Y" r, R8 Z& X if(!node){$ V! I9 v, L& r3 S6 T
cout << "新建节点失败!" << endl; : Z# ^) @( }* j3 r8 ?' U+ s
return; . x$ k, J+ R5 U
}
4 o1 I. V3 m; q) s/ u: ~ node->data = num;5 P2 q+ I1 l8 j7 S6 O
cout << node->data <<" ";5 \1 [( w9 l% D7 m; f+ Z, m% W6 V
if(NULL==HeadList->next){, e6 u1 Q0 B$ y7 P- N- M
node->next = NULL;! l: M7 A, i7 r2 l
HeadList->next = node;) }' A1 i" k1 V1 I( P( P1 W
EndList=node;
/ I8 h) W- j5 f' B+ x9 @ }
+ q! b N5 ^3 }$ _+ I8 } else{+ p% N. v, H: l7 j
node->next = HeadList->next;. p) r& s8 E+ e: v# |5 N; \, T/ G0 \
HeadList->next=node;
& b( X$ {# `: c4 q/ N E6 |, }* m% [; w }
1 M# C+ R3 E2 \9 D/ @ Length++;
* j9 m; S) {+ C5 r& c5 J }8 T& |$ u0 L( F* h S9 T
& |3 W- I% Z w! `8 N+ m; |- H, z) Y void LinearNode::AddNodeEnd(ElemType num){ //尾插法
# ?7 w3 P% K3 I# H3 p# i node = (LNode *)malloc(sizeof(LNode));$ _ D4 V* y9 q9 T
if(!node){- u9 w3 v6 E8 q1 K
cout << "新建节点失败!" << endl; " M& l. t2 J i# b6 p0 L- }, d* W
return; 5 |9 z9 j. h3 L4 d1 y! Q
} & `0 m8 E/ O" d' |
node->data = num;
. ^* T- L" _' ^. H; A cout << node->data <<" ";) Y. A1 ~6 H0 O0 D! A4 P
node->next = NULL;
( d' d' k/ X; V, S8 F9 O/ V EndList->next = node;
5 x8 u) g! B& e- @% w2 { EndList = node;
+ `' E, @2 s& ^2 S8 K4 } Length++;
5 G- g- u- p8 B. I }
6 V) T5 |+ d: B& T6 m. ^0 d w/ q" d / d' ~5 _7 [1 d! x
删除节点! y ]9 ]' E& b3 a/ ~+ c/ P) M9 I6 P
5 X8 c0 S: m' \4 h void LinearNode: eleteNode(ElemType elem){
& S7 t9 B8 A; a- k/ C R: s% p if(NULL==(HeadList->next)){; `- e) |4 J) i
cout<< "无节点"<<endl;5 S$ K1 J; B. q( Z: a
return; ) f) k# c' R0 d6 J
}
* b" {4 K6 G+ s8 z% u8 ]' x Node_cur = HeadList;
m7 S3 `% k* N# a D while(NULL!=Node_cur->next){
8 q& a5 i8 z- y) n' ^0 N: _ Node_temp = Node_cur->next; ( z( {/ Q! I' Z9 |# ~5 C
if(elem == Node_temp->data){" E! ]2 Z' A5 w1 [5 B
Node_cur->next=Node_temp->next;
4 H) @! t) v( z- { free(Node_temp);$ U( k: _8 ~0 \8 Y# I
}$ v3 Q" U$ r. D3 ^9 V& [6 n
if(NULL!=Node_cur->next)
5 t; L) E8 x& n0 Y2 r$ P! i; ]8 M4 R R( X, p Node_cur=Node_cur->next;
2 W9 s! W6 V( h }4 h% @, I+ C" d0 E! h
cout<< elem <<" 元素已删除!"<<endl;
4 Y4 l7 z5 E0 d6 K% B1 s! k }
5 X/ R* C: y! a* s9 a
8 {$ Q) j. `% j. }3 z/ r 显示链表5 `9 Z' L4 \: o k
# Y+ l8 C& L1 r1 g' | void LinearNode::ShowLNode(){
6 U0 I+ s/ H6 V2 ^% J" H9 ?* @9 e. Z if(NULL==(HeadList->next)){/ g+ E5 B8 M. e
cout<< "无节点"<<endl;; I& o" }* O7 h. h% z
return; ! C- j* @ J6 E% h3 T
}8 J/ C, I" I0 C* Q7 r
Node_cur = HeadList->next;
. a) o; V7 q2 w! p. j8 O$ l; t2 g9 Q; L while(NULL!=(Node_cur->next)){" E8 N' U1 @- A; e' O
cout<< Node_cur->data << " ";
4 V% a, c1 O8 Q e$ w Node_cur = Node_cur->next;
0 z9 l. W/ u# @3 L) A }
. |6 |5 A& X3 z* B cout<< Node_cur->data << " ";
n9 I0 a! _# {6 m' F( E+ Q" t cout<<"链表中的数据已显示!!"<<endl;
/ r, @: }- ^0 e6 R3 U9 j }) [& `$ G m4 B/ I' s3 Z
( F+ U0 X% U/ s) q" s; p! m 销毁链表
* }9 ^ ?7 L9 c 1 \$ p8 I* _* j9 ]+ J0 d
void LinearNode: estoryLNode(){
) z: w0 ~; ^+ M7 e4 o0 C, V! r Node_cur = HeadList->next;
; E3 S* b2 ]7 p& O* I while(NULL!=(Node_cur->next)){0 q% ]- y1 ] q4 O+ p4 U: _( N
Node_temp = Node_cur->next;
9 O. D0 T1 v4 E free(Node_cur);
7 s4 o4 Q7 u& V+ c/ R" ^0 O Node_cur = Node_temp;
& D% G1 k; T( Y& L+ I }
* X2 v: X2 i1 n/ O+ ?2 w* _ free(Node_temp);+ _+ u1 M1 p J- w9 X) E
cout << "数据节点已完全释放!"<<endl; - [; m# f: X/ [( L8 p" n
free(HeadList); // 释放头节点
k; i0 K9 L4 V4 q* u cout << "头节点已释放!"<<endl; 6 [" H7 k8 ]% P% p8 q- ?
————————————————7 o5 N/ N# P5 Y, F" ]
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ f6 ~$ C6 X+ B# s 原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
0 W1 ?; Z1 N! p- O2 @ 5 @, J7 Q/ i* g* p( s1 h- r
" A! T+ @$ N9 `; L
zan