# a% K+ N! T) u8 v% a( V. _顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。* X1 p4 X! }7 U+ ?! j/ n
# [! D9 S% {9 ]8 F) q- S4 r
(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552) 3 r8 [6 l7 H) P- X c: ^/ R; X# k+ \) Y! |& B( Z; P5 U
链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。1 p q& ]3 U+ Q" s( ~+ X
- d( C1 |; [$ C F* c8 J5 M# k% C
时间复杂度:3 ]4 f/ C$ Y8 b/ g" Y
" o% l' F9 [, s( S8 o1 l$ y$ h
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)% q) [5 p& I/ ^2 C
" z2 v, T9 d( Y/ U+ B$ {增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)! O5 @; R f. k4 i5 T0 ]& w
' d5 A: T. e3 M/ a6 h& s* g
PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。 ! A$ g% e E7 y+ K3 D E# e$ ]" g. E$ O+ M( C0 \9 A$ z
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);9 z o' p9 M$ T. S7 E6 _* c
+ y( h) s7 I; L" T3 t查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);( G% i* x8 T7 {- k: u9 M+ z5 R& t d
* F. M+ R9 Y# g1 y3 ^ W顺序表示和链式表示的相同点: + n3 c) G6 \; w8 H2 E: ?7 M2 o I3 H0 c; t' Z
删除内存空间:+ Z. r9 \1 b9 A. l9 j1 J$ {+ A
5 a2 O' ], z. R7 ^' z# p0 ?内存空间的删除都需要对每一个存储单元单独释放空间。- v9 F9 {- [% G1 d1 T) p3 i
+ e c$ ~' q% Y% D1 w, o
代码实现: & a, ~, @* A6 q/ ]6 ?5 `) V. _7 f4 D. ^" B3 [
顺序表示方法:' ? d$ Y/ w) R9 }5 M" P; D
4 d2 h: t' E0 H& C5 Q5 L- A结构体定义 % o! ?& d# f; ^- I9 w+ L 8 `" B& p6 F* } B* Xtypedef struct { 8 P& j, I3 s8 ?, V ElemType * elem;: v$ A+ o1 u1 i9 |! |, M
int length; // 线性表的现有长度 ! f( q& y( e& G0 f, y6 Y d
int listSize; // 线性表的最大长度 ! Q( Q8 P. a! ]# A3 L, [7 t}SqList; ' p9 @$ S, Q9 b0 B" I3 ?& |! Q7 `8 h8 t+ g9 B" T8 T
初始化 ! z! P$ Y* D! r; @7 u& \6 z) ^; j! v; M+ W# s
void InitList(SqList *L){ N" R- I+ @, p) M+ H L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ; : A3 j( x; S7 C4 d6 o4 N if(!L->elem) { " \: _9 }- o2 {& X' z cout<<"申请空间失败!\n";/ ]& G0 |( m+ ~8 ?1 s
DestoryList(L); 4 u! c' P5 x" U6 U$ V4 F$ s% T } ) _8 F7 J. c' k" i5 G) f L->length = 0;3 x, c. `4 M( s& t
L->listSize = LIST_INIT_SIZE;' t# c p2 n6 w5 R
cout<<"线性表初始化完成!\n"; 1 N2 }. t0 [" h6 t5 u- w} 1 { N. G$ p; u* o" @ ) Q: B; m' S$ ~增加元素 $ j; B8 l% r4 B- b- X8 w6 G4 w ' m+ ^. J( L2 |. p: a3 I3 lvoid ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素6 _/ ` ]3 F0 T" |
if(L->length>=L->listSize){, h& h: m$ g0 h1 h0 f; ]9 W
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType)); $ g& h# w- M3 J if(!L->elem){ , N* b9 E7 h& ?- f cout<<"增加空间失败!"<<endl;2 g6 H- X( ~$ {( a0 Z+ ], k7 `% I3 T
DestoryList(L); 3 d0 Z: I0 E8 I6 g }9 M, s& P2 l" M! [$ n5 V" K
}; K. j8 |" `6 p( }! d9 }
* (L->elem+L->length) = e;* p1 a# ^! U _" S2 K
L->length ++; 7 t7 x! X) g3 ~% z1 |: |- D6 G9 ]- E
} : {0 y/ v( e. x0 S" \! t$ T ; E' k2 {2 e1 G: m9 H/ d7 L) dvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素 ( O7 v6 K6 M, U' L6 G int i; " \/ H! `( q9 b9 ?/ V( {$ @' B L->length++; 6 q- q w1 I3 r4 R, L' o- K for(i=L->length;i>=e_where;i--){ 7 `, f; s( f2 M5 Z+ M0 t# d if(L->length>L->listSize){# A" q* n2 S( S; [: r" N
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));# ?- s8 A$ g. A K- q
if(!L->elem){ : \8 u `8 Z9 G cout<<"增加空间失败!"<<endl;4 j% e) G% i; Z S
DestoryList(L); 2 h' a. V5 @8 X* \: n* T
} ) |) {" f& `- f# L; O }2 e8 l& Y5 u1 ?. o! A
*(L->elem+i+1) = *(L->elem+i); 4 N3 L9 [2 [! M1 Z2 B } 1 [' |& c" S7 Q6 q! J *(L->elem+e_where)=e; ! K' r5 Y: |# A. H+ I+ f cout<<"增加后的线性表如下:"<<endl; " A& Z3 R6 }+ ~7 I9 h* K
ListShow(L);5 {4 A' i7 m2 h- l
} 6 W: z" E% Z$ O
' g" j! D) {! m4 S' M9 x9 Cvoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素 H. W7 k: K. ?, i* ?. p int i;) s" P3 G3 h5 T# b; ^8 F; G! g
L->length++; # L9 u! Y6 S4 \3 ~1 R& t& R for(i=L->length;i>e_where;i--){ $ b p/ m- _" U- x2 e if(L->length>L->listSize){2 G/ W1 I, e0 U
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));- X3 z" m" y4 z2 E$ W
if(!L->elem){ ; u/ q9 ]% m0 Y' b cout<<"增加空间失败!"<<endl;5 O5 M- D' D3 v
DestoryList(L); 6 Q/ X6 z/ {; f7 g/ a$ I' k } 3 U/ X1 Y$ ]) g5 n; m } 1 p" z& C% P- {" U4 p% V" c6 y *(L->elem+i+1) = *(L->elem+i); ( z( i B x6 X9 c( `3 O } ! I% h! k5 P9 ]9 l( G4 q$ h( M *(L->elem+e_where+1)=e;6 P+ B% \0 Y) f
cout<<"增加后的线性表如下:"<<endl; - G; [1 A* f3 H" M( R. K ListShow(L); ; n& C0 S( n+ j% |; q# g, D} 4 q' p$ M. j7 M: t+ \ # D+ O- h% G$ Z" [, E2 O% Q删除元素" l) d8 |2 ^+ V! ]2 A( o
1 m1 r: \* j# Y) I
void ListDelete(SqList *L, int e_where){ //删除某位置元素 9 Y9 a# l4 X* S3 ~' h! J7 S. Y L->length--;( A% q; i7 ]2 }# |; H+ g
for(int i=e_where;i<=L->length;i++){) e0 j4 ~# c9 _+ v) F
*(L->elem+i-1)=*(L->elem+i);4 C) `# n+ L: V% C! g( ]0 r
}! a m; w& Y: O0 Y O% b1 [+ N
cout<<"删除后的线性表如下:"<<endl; & ^! ~; j+ H, E. r6 `: M
ListShow(L); ) a, J% I% m- Q A/ k; s, _9 W} . \6 m: D5 o6 N8 o5 P8 I$ p& E" h 2 g4 @7 ?" G, N! ~6 d% @' L1 J' X销毁列表 & `& e c/ E! W: I! [# @4 C( X- \( f* J+ @# ~
void DestoryList(SqList *L){. ?- R, {) b( G! ~( ]
int i=0;/ F$ f0 h$ D+ D7 V) T- { M, q
for(i=0;i<L->listSize;i++){ 1 a( Y" w; y. H1 u* H free(L->elem);1 c6 w9 T7 ?" r- ]
L->elem++; 3 A4 o" j1 d8 Z. e } : s% D1 K( {$ |3 K exit(0); ' t5 W+ f: l1 w6 t* t: r' V} ( j% I6 x: _- p1 d, ^; h+ n/ Z7 N2 c0 @
链式表示方法) \% g# ^" `' r- h
! @1 Z0 Q7 |% c结构体定义4 m) x! P$ c) |- M) o
) y7 s' ^7 g2 F" e) m
typedef struct L_Node{ 4 D2 E! V2 \, e, p ElemType data; 4 H# A! D% V* D# N struct L_Node *next;. |+ u7 m# z2 q5 m% \: D
//struct L_Node *last; //增加可变成双向节点 0 s4 s( L$ V7 P' S% v. l
}LNode;: W; N/ _& Y. U0 q+ A. [3 s/ [1 Y \" z
* Y% n6 m, R" N) a$ v: s0 g
初始化 6 D2 _0 K6 Y d) B+ D* Q# j * R0 T4 p9 V7 E6 W$ h& hvoid LinearNode::InitLNode(){2 N5 [) ~0 d- n1 z$ s8 X
HeadList = (LNode *)malloc(sizeof(LNode)); 4 e( S1 i! |: d: v' B if(!HeadList){ 1 k' n% z$ {+ z$ N2 C5 o: q cout << "初始化链表失败!" << endl; E: J/ A1 W' t2 n1 y/ ? exit(0); : |+ V% f8 n" {, [- B
} 0 j8 d0 `3 S* U! N EndList=HeadList;8 H$ F8 f& T% D
HeadList->next = NULL; z" Y7 G; }, |! ]7 j) `; U
cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;( D( u. |# x3 j% r; F4 A
Length = 0; 8 ]3 X$ c& }& y; a* y- w3 z% W7 ]# B e_where= 0; % h3 `( O2 R( i% j! h}5 ?# B' Q8 k4 o& a* o8 [1 D
3 y T* h5 O; x6 H8 L
增加节点 5 z0 j$ f* j) G4 o$ s: C4 P% q% w* X$ V, Y" N
void LinearNode::AddNodeHead(ElemType num){ //头插法 w p+ h" `0 q- Z1 \+ M3 w/ L% a
node = (LNode *)malloc(sizeof(LNode));% w* u0 q% Y+ N) M, x
if(!node){ & K- {0 w( O9 H1 S; P% l6 H cout << "新建节点失败!" << endl; 7 J1 F# W; p. x return; ! S* C0 J% U" `" i
} 6 c" E) j8 g* L; n node->data = num; 2 q7 N9 b# r5 X; T) z cout << node->data <<" "; . D4 t) q; t3 {/ U1 \ if(NULL==HeadList->next){0 a0 i x& l2 x& M
node->next = NULL; 7 D6 A) U8 }# X: Z5 r1 ?2 ^ HeadList->next = node; " p" s; V/ r; z6 Z9 N. W, B: Q EndList=node; 2 b& Q0 z! w+ o( v- P2 M } % `$ z3 |" I- V" ]; m8 U else{# b3 X. Q! u0 J( U& R
node->next = HeadList->next;( P. g9 \) R1 x, y0 F) a# ^' X
HeadList->next=node;7 e7 ^$ R# w6 H3 ]/ s
}& R# c' | r4 V! W1 @9 f$ L
Length++; + W, b& r0 |$ x( W) ^7 Q! }
}5 C. }3 G8 d; U, l& B
# R8 i" W& ^( p9 T3 d) ]
void LinearNode::AddNodeEnd(ElemType num){ //尾插法 1 u5 }9 p) J* @; w- d- T C+ `0 H node = (LNode *)malloc(sizeof(LNode)); % F2 _0 T# o# S, e$ c4 @ if(!node){ 8 f9 m5 N; j2 Z r# a- c cout << "新建节点失败!" << endl; " C6 L* ?; z$ s$ E/ D: g4 ^ return; 4 u# k$ e/ m; u5 d7 x4 H4 I } 9 E$ O/ a3 y7 o
node->data = num;, L5 l6 U+ }3 H
cout << node->data <<" "; $ Z9 a* E) c/ t node->next = NULL; 9 s6 w- }1 Y7 J* h EndList->next = node; 1 p3 ^: x& V# [ N/ {1 b$ F EndList = node; . }# F- Q9 e) ]1 N0 T Length++; & [6 P/ m, p7 {9 ]9 Q: `: @+ G2 a
} 3 w) d% B# S8 ^- [ 2 u8 B5 L. q) w F$ o) i5 Z5 G删除节点% }7 x5 \$ Z+ O Q1 R2 b+ e
( p; N. i6 `; B( U
void LinearNode:eleteNode(ElemType elem){% O2 j" @3 q6 d
if(NULL==(HeadList->next)){* `3 V- M' ]- {& }* N
cout<< "无节点"<<endl; * ]5 B. u) k7 O8 t return; ( m ^: W! Z% O } # p/ i8 s- B A: {$ Z& k Node_cur = HeadList; " M6 A! `7 x1 \& t while(NULL!=Node_cur->next){ ' |* _7 K' c6 u/ C) O/ Z/ n$ G9 d Node_temp = Node_cur->next; : a* s/ t0 g1 }$ k2 d if(elem == Node_temp->data){ C; h0 r% P- J+ j# p( t
Node_cur->next=Node_temp->next; 7 e6 U: K; H& {; a/ e free(Node_temp); $ N4 @: ?0 e7 d+ M7 D' \( ]; N }7 B, N( _" D6 @+ I' D$ ^1 P, i
if(NULL!=Node_cur->next)7 O1 }$ [1 `0 E- ?7 X- |
Node_cur=Node_cur->next;8 J6 k3 s0 \) Z# v9 ]5 i/ G
} 5 }# S/ j8 G( a! b cout<< elem <<" 元素已删除!"<<endl; 6 P6 q7 w! e: \9 @, i8 m; e
} 1 E* ]5 [4 M5 w3 ?( ], E& d! N) b1 R3 r) x0 m
显示链表+ M6 H! a3 H1 v+ r( o) R6 I
8 `! t0 B9 Q3 m7 Rvoid LinearNode::ShowLNode(){' n5 _$ \- ?- ]! K+ s
if(NULL==(HeadList->next)){ 5 v5 ?" p0 ?- o0 K) k& r0 x" J cout<< "无节点"<<endl; ' Y# t4 P, H. A4 o9 ^0 ]9 H' P return; 1 b6 }5 _( n0 b: D } $ c3 F+ x1 m; N7 p& x/ [ Node_cur = HeadList->next; " V* a/ P, v, Y
while(NULL!=(Node_cur->next)){- b- s! f R2 A7 N
cout<< Node_cur->data << " ";. x9 Q. d2 K0 N& S& G" M
Node_cur = Node_cur->next; & x Y. s" b3 q8 `$ W- O, X" j5 T3 H } 0 a9 c/ c% l( m; r7 z cout<< Node_cur->data << " "; 3 M( L: H( ]6 h% _! \$ j cout<<"链表中的数据已显示!!"<<endl; ( x2 {/ l& ?/ k! k( A}( Q5 x: }* R1 f" c0 T
5 d+ P# m" O8 i9 b/ y
销毁链表, b" ^( D" F5 H; n
' q2 i4 ]5 H7 C* B+ Ovoid LinearNode:estoryLNode(){ . Y& j* \, e$ w2 `7 \. v Node_cur = HeadList->next; 8 ^/ R2 \# e7 O" Y# c7 t* c
while(NULL!=(Node_cur->next)){/ u* j) L9 g' }
Node_temp = Node_cur->next; * y- H4 C/ e* t4 f' A/ M! B free(Node_cur); & e6 j9 E. x' C# T, N# q+ g5 h Node_cur = Node_temp; # T* r4 U2 e, R1 \+ ], c } 0 Y/ w& e4 ~% d free(Node_temp);* c* A7 D% H; c3 d t
cout << "数据节点已完全释放!"<<endl; / U" E7 R' l4 d6 d( o2 a
free(HeadList); // 释放头节点 9 i/ h3 p( T" [, s+ B
cout << "头节点已释放!"<<endl; ' g+ M( `, F/ C) Q0 ?+ n; C6 s
————————————————% g$ s! ]( G) [& T% Y x: t
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 ' V. r9 t! k4 z原文链接:https://blog.csdn.net/Baimax1/article/details/1060362864 a' n3 @% w: m5 o% x G
( b/ W' o. }& |9 T: g" \9 _