标题: 线性表顺序表示、链式表示实现方法及其异同点 [打印本页] 作者: 杨利霞 时间: 2020-5-10 16:11 标题: 线性表顺序表示、链式表示实现方法及其异同点 : q4 m! S- ^" F. s0 A& @9 w! u1 b 线性表顺序表示、链式表示实现方法及其异同点 0 A: s* V- t* v" F0 J( R线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。 - {: }6 e. m0 V7 L# j; N7 ]* e' b9 O2 A j
本文采用C++实现两种表示方法。6 y. i( D+ `! h, s
0 W" u4 u) f' |( d- V- ]
目录 " _# o9 O0 Y( P/ R8 Y, {' S" ] 6 L$ J) g) I& r% q顺序表示和链式表示的区别: U" {) N1 t* c+ ~. k
6 C7 E8 b: c; R; g2 r2 ?: _1 }
创建方式: ) D' y8 u4 a+ x7 c' ^) Q. y7 R7 Q- N
时间复杂度:: }/ H( t$ L' P* @& L; ~; J0 L
4 Z! }/ l' y) |' Q3 y" L顺序表示和链式表示的相同点: 7 ]' y: x4 u) V b- K+ _& f% C9 L( T! B' ?! X( O$ G' y8 z
删除内存空间: ) s4 e/ E" S* p2 X, |* ?) ?5 B! C- H
代码实现: ' t7 W# ~- s8 v3 _ 8 N: I5 V3 `" r- z顺序表示方法:" U' [! }" _! j, W
) O; w; C% M+ ^' s
结构体定义 ( f" G. B, o5 `* p( G3 n: d- T9 G G( _, u
初始化* Z9 W z0 m! `' P; l7 g- r9 O0 B
0 V) \7 {; R" A
增加元素, g1 k8 D- z: y* B" G
2 `/ N: o9 |* j+ B6 @( A& Q$ w- V% A删除元素 2 T5 ~; N, w1 o7 f" q! }7 x7 { / y* n, y7 ]1 i! M$ Q销毁列表4 q0 r, t$ D' a: u, N. v
' s8 \- W6 v/ m
链式表示方法" b: ^ J7 i5 E$ N1 `: O/ ]2 |& \- p
& d% _6 B# E' e4 w结构体定义3 e" }+ l7 `, e% E+ i: j' q% h2 u. z0 k
- f5 X0 X8 S) T0 ?9 F
初始化 + y1 _3 i( c8 Z; d) A ; s! U# U4 O3 I! x% z增加节点. j% Z' w: N O9 A( U
8 J q. j7 Z i8 s/ Q# ?+ P删除节点 + `) H; P6 h: m: E1 s) m . K& W) N: l: j3 [显示链表$ @. j+ p B3 O5 s' B/ S6 q
8 b& J" r% e2 l2 t/ _
销毁链表 ; D: A, {+ h/ B4 w+ ~4 F. ]3 } 1 b) D7 K, D' O顺序表示和链式表示的区别: 0 z. g& E5 R, D {7 ]9 J. e8 R) F( m. {) Q d
创建方式:/ n) {1 X) w6 `' S
' f3 T& l, x b- f# ^% k& P- a4 ~2 s顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。 M/ S V' k7 K
5 c! a. a3 O. z% P Y& ]
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)! Z5 x6 H" E, Y3 n: k T/ e5 P
- g; F5 f7 q5 d( m链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。 1 x: X) t. B1 f/ ?$ Y( b5 u6 }( ^+ V6 B! T9 F
时间复杂度:! D& P: z$ O7 S2 @2 b+ F
; Y$ q, |$ U; L; k$ H) B, E
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)9 K! ^. c' c( \3 Z: p: H m
0 L& Q# ?2 J9 \8 U增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作) 1 \2 _5 O6 X m+ z2 l & h0 z4 e" z# r5 o7 KPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。5 \( z" m% ?4 m* \/ S
% }: b4 M# k' U; r. f
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n); / F' v" u; b( _8 G" p* t) {- _! {' N9 u& U3 d' K/ `
查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);2 ^. [ H$ C: l: H4 u! N# z
5 S% a* l1 y1 W6 B" s顺序表示和链式表示的相同点: : s9 _( ?5 F1 n * P3 q# s2 X( f: A, ?, t5 g( o删除内存空间: 5 s* W% a1 T+ |4 l1 p( K( _. m' v. m: ~$ @4 B" c
内存空间的删除都需要对每一个存储单元单独释放空间。 6 O. i h+ b t* J # H" S: ?, d3 t1 d8 [* t4 ?9 L% C6 C& C代码实现: `' u8 E. k V* g/ r 7 y: M! s( K5 N% _7 l3 q( a顺序表示方法: 3 l6 x! F- o. ~- `2 D: L/ U' h 9 ^$ X$ ?! U" R# V, j结构体定义 ; `4 ~) Z+ k9 q 2 @! C0 Q. ?+ a; E/ Vtypedef struct { / `: m9 J6 D. y: w- m ElemType * elem;" z2 F) j( {3 v7 B5 @, A1 B, W- D
int length; // 线性表的现有长度 : i2 }* n S2 e$ X7 ~0 n D& f
int listSize; // 线性表的最大长度 * y Z0 E" l( a' e0 y/ l}SqList;3 ?% W' |' p9 u* m* u* P3 E
" y3 g( h0 h3 V* ^6 g6 K. @
初始化1 e. f; `1 Q' I z2 r
, x* n* {. f/ v; E2 b4 tvoid InitList(SqList *L){- I; c7 w4 X8 Z& B8 q3 Z
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ; - o5 e- d! L" w" u; N2 \8 ~2 h if(!L->elem) { - f; [0 Z0 G K; p( N; X, ?: ] cout<<"申请空间失败!\n"; ) l, m- K, X) ~( }* k& x" P DestoryList(L); 0 s8 W; c7 m- @: ]$ B" O } 8 m9 C: y2 Y c, m+ O L->length = 0; 2 }, d- L& r" x$ Z8 P+ Z. O. Y) B" N L->listSize = LIST_INIT_SIZE; + w: f0 y3 T% L4 E4 [ cout<<"线性表初始化完成!\n";3 l1 W% e3 W$ Z' S7 e& Z: N
} # z, x, A$ O+ s, ~: D: H3 c2 E8 S& w% t- U6 b1 B
增加元素 ' @7 U$ q2 w: y $ U$ ^2 G; ~ F" H/ N# U3 xvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素* C' t2 e& w% m5 \. D h$ P
if(L->length>=L->listSize){8 h9 a8 e" z' w1 h5 r
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));# G6 x$ e! U6 v2 k5 G" c
if(!L->elem){ . A# `2 f6 |. v3 b: A' \ cout<<"增加空间失败!"<<endl; + a; N- a' v$ y! z, P DestoryList(L);- J- B1 V0 I+ K& V2 W
} 3 C$ B Y3 ]1 n& w5 r }8 J+ k! U8 \/ G) V
* (L->elem+L->length) = e;& \! h. Y; y; _" O' Q
L->length ++; 2 `& ]3 N; Y, g3 ~" B' \
}+ [9 n# q1 B( n0 R0 [( }" Z
1 z: q1 E8 ~' u8 @
void ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素, Y+ y9 p+ O \; w/ `1 a
int i;8 B5 |& ]! x2 `9 \/ y
L->length++; 8 p' V) P' d' A) E! s/ w for(i=L->length;i>=e_where;i--){ * l6 I$ c u6 e2 O/ Y0 D6 | if(L->length>L->listSize){ . r$ j: N# ~+ K4 K" f" } L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType)); / E1 w9 L5 _8 u2 v if(!L->elem){ / o" V+ X N4 p" I, E cout<<"增加空间失败!"<<endl; " t U5 e% @6 t DestoryList(L); 6 \( z/ s+ v; `6 N: q } ' s, _, o5 g/ d* M } : [/ ]: a+ D- R: U *(L->elem+i+1) = *(L->elem+i); , _1 @( @7 a' s1 p% S, V2 h) s
} & j( s! e; x' X, U *(L->elem+e_where)=e; 7 N$ \ E2 H: f/ S cout<<"增加后的线性表如下:"<<endl; L% J( b, ?$ Q
ListShow(L); $ E( r# c! G1 a& y} $ Q6 ~& `/ F( d; K* s 9 m! g- F" h: S0 t7 }4 }5 k) l U% Lvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素$ b+ R8 \8 z# h" R6 [$ Q* |
int i; 0 C1 W4 C8 u1 X; W- N2 |( \1 f j* x L->length++;2 N- p) a9 ^5 L9 B! E& C
for(i=L->length;i>e_where;i--){0 }1 A6 u- x, U2 a/ J* M* g. d
if(L->length>L->listSize){ . L1 ]3 z! G! ~- a L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType)); ( p6 I* b V! \/ p& J F! D5 } if(!L->elem){% b3 r, T7 I& p* m- v. a; X
cout<<"增加空间失败!"<<endl;; D- t8 Q9 { W. D# O* E7 N
DestoryList(L); / L9 z' v0 H1 o5 ~ } ! D4 I3 t2 G O( p9 r/ T }8 V. k; c$ A0 I- l! ?) e# [9 L( N
*(L->elem+i+1) = *(L->elem+i); ; F q7 H+ j7 l+ u. [# y
}- c3 O# m6 o& F& P" I; H# _5 o3 Q$ R
*(L->elem+e_where+1)=e; ( ]9 d$ j2 u! c& P- C* ] cout<<"增加后的线性表如下:"<<endl; 4 G; X/ V+ a3 P
ListShow(L);2 {" F: M, e: S: x# m! \8 E, q
} . J! ~4 w/ j! V, k) I U6 Z1 g4 |3 X4 N, D8 k( N2 J& k删除元素 3 e- a0 |+ g. a o 2 {: I) s) l. \/ Avoid ListDelete(SqList *L, int e_where){ //删除某位置元素 4 b" r9 e! }% o- |, g; B
L->length--;$ U' `5 Y% C& [4 I4 B: z2 o! _
for(int i=e_where;i<=L->length;i++){ 3 _- z9 P0 ~# T5 X9 [) O3 V7 A *(L->elem+i-1)=*(L->elem+i);/ t6 Y/ @: k4 p! S P% X
}7 U$ I- @; u1 _ Z1 G$ s
cout<<"删除后的线性表如下:"<<endl; " a$ S, P+ B9 T! N3 S ListShow(L);0 Y4 B$ \7 P2 V
}9 z' L' O, l+ \* z' Y) u
! k+ _3 i4 J; }( d0 g( p; D
销毁列表 ' n7 n4 J4 c0 M' K4 i* @( L: z% ?& l
void DestoryList(SqList *L){& m! p( s; H7 J5 V& k
int i=0; . ]) |# V( h. g* L8 f" `, Q for(i=0;i<L->listSize;i++){ ' F g9 Q% F) h( q# Q free(L->elem); " U* ]- t" L3 U# ^( o3 a L->elem++;/ A+ Q- q( b* v/ u7 u# G' w! S5 t
} q& n( }8 U O/ T, l exit(0); 5 y |' M9 J3 J" l `' ~# O$ V/ _% |
} 7 O D- E F5 W! H: i3 X* h& C5 N$ f1 Y) A- G" o3 r
链式表示方法" g: R z% R4 c: \3 ~* Q8 ~% \# V# B
0 u4 T- \3 N' j2 F+ V7 [0 m1 E
结构体定义 8 F3 M! F$ `3 F' S3 z, N0 I% a, Q$ Z" y
typedef struct L_Node{6 r$ N; r% M) Z l
ElemType data;7 }5 [! }6 Z9 H7 ^5 F
struct L_Node *next;- z" F4 b7 O* p6 B' z' V
//struct L_Node *last; //增加可变成双向节点 m% u% F$ _8 D- P! i( q
}LNode; # j. H: L; j. Y; N( {# i3 z7 ]% h6 l$ O. B
初始化 ; q2 F2 Q. f9 A3 o; G4 I3 m7 B. q9 ?' [2 M
void LinearNode::InitLNode(){9 U- u& o; c5 y) [ b" F4 F
HeadList = (LNode *)malloc(sizeof(LNode)); . x. Q0 O" ~" o9 c# ]( P9 v" S if(!HeadList){: D- T) o* H7 t: C' f6 K9 D
cout << "初始化链表失败!" << endl; ( x# q* w5 i( f2 l1 c$ P exit(0); / a! b* D) q: Y# _5 N- r
} / j, r& v# g# y+ E EndList=HeadList; ' y7 T# S' J: @5 c: |7 B3 U# W4 Y HeadList->next = NULL;1 N( _9 W$ w5 t3 j8 y L0 _, D' h
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;+ i$ m K! m6 O/ j
Length = 0;; Q; g0 J' r" I8 @, S& w
e_where= 0;1 ^1 i5 J8 A6 I9 j1 l
}* {4 D2 N4 p& h: ~5 F
- l2 M# n1 f3 n, @1 g
增加节点, R4 {& n: l3 Y! r1 _
$ D8 h6 b' C; f2 }( q% W
void LinearNode::AddNodeHead(ElemType num){ //头插法 " T1 s$ U8 T6 c
node = (LNode *)malloc(sizeof(LNode));+ @, T& r& h# k& u
if(!node){6 Y" w2 n8 c; z) U( ]
cout << "新建节点失败!" << endl; 7 n' v/ H) b8 b5 N
return; / A! K) z0 r# R* {
} 2 k+ O. s1 a5 V4 }+ Y* I( _+ n
node->data = num; ; j4 f- m$ r( ^! u: ?+ `5 V _ cout << node->data <<" "; * X# S' S/ K4 W. C& F- k1 N( \ Z if(NULL==HeadList->next){2 m* D+ s O. v5 u" I0 d H9 _7 g
node->next = NULL;3 P' q9 ~+ a7 e( Q# q M
HeadList->next = node;" `$ x) ?- k. U! i
EndList=node; 9 N/ C; Q- U3 s) B2 i } * r: O" W' G6 W9 L% F/ B& z else{ + o9 k. n1 m" U C9 D7 j, t8 r6 { node->next = HeadList->next; ( |/ ^' h9 _& b1 \. D1 T HeadList->next=node; % N; X+ C5 U/ N( v) o6 m# }0 Y b } R. U/ d3 u2 ?! n; }4 d! W
Length++; 2 T1 t8 i0 t) Z1 M$ C/ t. j+ m}, D0 ~- Y1 k: D/ y
& ~; u. ^! H, T! V. o6 [5 e; ]void LinearNode::AddNodeEnd(ElemType num){ //尾插法 # N j1 X) `" @5 F; X
node = (LNode *)malloc(sizeof(LNode));& @9 a: T& q) a8 t
if(!node){ $ J4 i# c4 X0 s, k2 B cout << "新建节点失败!" << endl; ) @, s) w# M" }* `; ~* W return; - |0 O" d; R" R, Y, y \7 [$ R3 J) Z; d
} , S; G4 O, t C0 o node->data = num;: t/ C+ N, m5 F
cout << node->data <<" ";7 P- P' ?+ s: U$ v
node->next = NULL; a/ Z6 s( |% P' U. Z1 g9 _ EndList->next = node; ( r9 A: n" V/ r" c# `8 S EndList = node;1 R, d# [ r: y& R a
Length++; 4 x, }2 x* L: V/ R1 [+ W+ J% N& U" ~* m}3 S; W7 {0 P6 R: j8 b- t" J
5 F3 V9 N \: V% F5 |
删除节点 ; d; F- l% h2 k7 p( B1 t$ R . ~0 P8 c6 j* l4 O6 r" `void LinearNode:eleteNode(ElemType elem){& c7 x. i) B/ G9 }
if(NULL==(HeadList->next)){2 ?9 \3 I l& d A8 j" v
cout<< "无节点"<<endl;7 R0 ]( D9 L3 O0 P1 | I/ X2 |
return; % \+ e( @! [7 S. H# } }# f: g5 ~. d+ k0 I$ B
Node_cur = HeadList;8 O% r. |1 ^' {* N4 g) v& T0 f
while(NULL!=Node_cur->next){ 4 y0 T( D/ W) Q* p/ X1 f Node_temp = Node_cur->next; 8 u9 n! g+ W% r: a' e% `
if(elem == Node_temp->data){( _8 l# A' d. e& S' Y% P# O
Node_cur->next=Node_temp->next; & _% Z# Q$ [) i9 e1 n9 F+ O free(Node_temp);; j" Z# i7 C5 {+ n. C. Q6 @
}; i6 Q$ z6 B9 r+ W9 h+ D- D
if(NULL!=Node_cur->next)# A( P, ]- v- x2 F# G
Node_cur=Node_cur->next; 4 R- g( |, o! T- ]3 m9 c }' L0 e' N" O, q! k& {/ J
cout<< elem <<" 元素已删除!"<<endl; 6 h8 _1 A" I4 o$ E5 D} - y; i J, x: m5 @
5 n. B- ]4 T2 u M, F$ C) v显示链表# J8 H* o9 r' C- N
9 _/ [2 p; o" }% k+ r# o7 w* D; [7 ivoid LinearNode::ShowLNode(){/ n3 V2 K8 Z2 f! k
if(NULL==(HeadList->next)){ 1 B+ e7 ^( r1 a cout<< "无节点"<<endl; 8 s0 ]: A# f9 S- l2 i3 c return; ) u, {* j' t: P0 ]; U }. U3 o& Q, w+ K& \( x- q' J. O8 @% ]
Node_cur = HeadList->next; $ f* O. L' Q- w3 K, `& r while(NULL!=(Node_cur->next)){/ [1 `0 w# _0 O, j* _
cout<< Node_cur->data << " "; . Z4 v! G8 b. A- s2 H8 l: G Node_cur = Node_cur->next;; U5 T1 x/ W. ]# J D, j$ b& L
}4 A+ |6 M; c2 ], L$ {
cout<< Node_cur->data << " ";+ n" M6 c$ _( p$ z, n: v1 Z
cout<<"链表中的数据已显示!!"<<endl;. J |6 Q; d9 _. {8 d* W2 Y* J3 M
}4 U4 m. s1 h; o* ~4 J& r# i, G
# b$ g' @* Y; N: o: [销毁链表 & c0 r2 E- @+ R, c4 m/ Y# F * ~5 `. @# H- H6 Y, B: b( E2 y: Cvoid LinearNode:estoryLNode(){ ' _% g- b0 P. c: @ ? Node_cur = HeadList->next; ) Y) d$ Q4 v- u! A, M) J while(NULL!=(Node_cur->next)){* e n4 v/ K! Y: Q, a
Node_temp = Node_cur->next;1 O- K" D0 N! G+ m- Z8 [/ ]
free(Node_cur); 5 a& P/ |: b, W% C' j/ F Node_cur = Node_temp; 6 x9 I- x% Q& m }5 H+ m6 n5 C8 N8 G) g7 L; V u
free(Node_temp);* S$ w0 E0 {* _6 ]. d+ `- g) M& L
cout << "数据节点已完全释放!"<<endl; # b9 N! I& a; m. a& p/ f. Q9 G# K free(HeadList); // 释放头节点 3 M0 a2 b2 E- W) l( ]
cout << "头节点已释放!"<<endl; 4 b5 E- h! h6 Q———————————————— 7 I$ V) R ^: I" k+ f6 X6 K7 p版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 u* h: v/ R' r0 v+ H7 a3 r
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286 , [& C/ Z- g1 a7 `8 R9 i . k5 E' w9 r4 F) P5 U2 y/ D- u5 ?5 N: M6 H. \3 @