- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558891 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173040
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
) U: i Q7 c' k) K& B6 X线性表顺序表示、链式表示实现方法及其异同点0 s: [2 d3 y" P
线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
( a: K' J Q6 A, S# T0 e/ X! \: i0 X8 i
本文采用C++实现两种表示方法。
8 G$ V% c0 q* p8 z' f7 ?$ Q8 J
& T& _$ c& J3 a9 N: ^% @: ?目录, c/ p. n9 e) c/ _$ n( `
' M4 ]' z0 ~5 ?+ I3 C, W! ~: l' V, L顺序表示和链式表示的区别:: x9 E( I7 B0 t& h
$ l0 Q: t. X$ ]2 ~. b5 I9 X: M创建方式:
/ a' \' Q5 v' g/ F# M. O* W' Y% B3 T
时间复杂度:0 Y1 R9 L/ N: m# I
4 p! e" g' i, ~8 E" u) I4 `6 I
顺序表示和链式表示的相同点:
. y* K* F3 q. w! {0 f* ~# ~" e* k* p8 O4 Q: B% _
删除内存空间:. i% J6 W+ |9 K5 [: t1 c$ z
( |! h$ N& ~6 Y0 N3 ~; e9 j
代码实现:
4 _3 q `) \/ D6 m
. B+ Q3 @8 ^" p: g3 ^顺序表示方法:
7 @ U+ f$ a' M* t. N6 {# z& p* p
结构体定义
! z" E& f; T4 a5 B/ Z: M. T& K
4 I Y: q& L) l& K9 i初始化
! t, v7 n8 n3 g7 V) O. @ {& o4 I8 L7 V% A0 g1 c6 V4 y& W
增加元素
) g) X% G! T; h- Y. ~8 ?7 d0 ]2 t! [) Q' v. d6 Q# K- l& p- X
删除元素
' h( M# d* w/ Q* j4 f* Q7 x( v: B$ G1 d5 I! x
销毁列表
. f6 X2 L D. v6 D# W8 L; H# E. q1 U4 e6 V
链式表示方法
2 n# O; X6 K( T. l
. i! l6 e; y! G* C结构体定义
+ o. n. V& F; {# Q, m
* J9 V$ s7 E6 ]初始化: d# c2 |4 N E' l
) |7 K7 p4 V( ]% u4 Y: d" d增加节点4 U% s- B+ ~6 a6 s7 _. }
5 k, M2 e4 U1 V4 p G' L删除节点2 S" K3 P+ U$ t
% Q5 \# w- ], B: H7 n& H显示链表) i3 a; a1 j2 l. i7 q
) f5 X/ B! u8 F/ a" K9 E9 u1 e销毁链表* _9 m6 a& r) P1 F3 q3 J3 G, F
9 P% S7 n$ M% @& }$ ?
顺序表示和链式表示的区别:
' Q! F: T% F/ Q/ G! \8 }" x2 _9 i2 o# k2 ]; S* d8 X
创建方式:
. ?* a, n* O5 A* B5 V9 {( q+ d3 s# F, |$ q1 k2 @
顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
/ Y l8 Z3 m% J% { k
8 @2 ]) y; D- |- Q! M(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
! B- S6 |- \$ a! K& P- K {: D' ~6 {
* y- t( t3 V1 _, s5 @链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
, \- X6 ^; J7 Y1 {2 f9 _- o' E7 l8 O/ ~
时间复杂度:8 F4 e# b# g8 J
4 }, ]9 ?) l/ D* O6 a
增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)+ v9 k4 U. N! L3 q( K, Y! A+ B
8 n4 D7 B- S% a9 S增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
) y+ j: Z6 M2 m4 s/ [ Q+ ?8 w! j
( @+ s& m' V% W3 n- p9 QPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。* @% x: t+ i: F/ r! V4 [( ~. \
4 W3 w8 d1 ~) q. c
修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);7 B( I2 F; M0 C" Y4 v( u; a
, z' p+ n' O" O5 V- @1 G查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
6 o5 A3 Z0 p( V9 j6 V# Y
; {; P( Y0 X- R8 A2 o# o2 p顺序表示和链式表示的相同点:
6 \$ B& G* L- \& M) K9 B# v7 ?, A' C
$ L; K% ?% s$ j7 m1 p3 y; y- L! e删除内存空间:
! ^! a* `+ _ w! E# s7 L. x" e8 |" Y1 D/ S5 A5 a
内存空间的删除都需要对每一个存储单元单独释放空间。4 E# p1 ~" R* O- c& Z) H
' N; L/ |6 U7 i3 X. V3 [代码实现:
! |2 B; c3 x0 d& B4 z6 c |. Y3 p, X3 d" C% p
顺序表示方法:# u3 m& p' \# v! p% s, f: v
: _) L# `- n% [1 Z结构体定义6 Y6 {/ j4 l+ p; ?
+ s p2 Z9 D# H- o0 K3 |typedef struct {
1 X7 \% `5 E# k- z9 j7 E) \ ElemType * elem;
; s5 J- n8 A- Z: Q5 b int length; // 线性表的现有长度
1 V3 e' v- R: ~/ q; d4 j, l1 q int listSize; // 线性表的最大长度" F, Z3 ~9 f0 h. G# u" \) N
}SqList;
% U; N E5 F Q# g) X( A! D
0 \! a, \: f# i. i初始化
' ]" ]5 e( o; \: L6 A& i. o" J7 v
/ S& \( e6 R, @1 ?, W+ @$ Avoid InitList(SqList *L){
$ K8 o- d. H7 u1 i( K L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
* U( H5 C4 m& `9 A* X7 f0 Q: ~ if(!L->elem) {
3 O3 m: t B0 D7 Q3 v/ T cout<<"申请空间失败!\n";) Q8 f$ g* N4 z! ~8 t8 ^
DestoryList(L);
) D# ]. w) L t1 Z6 S4 C }# W, R* b- s5 }" P; R
L->length = 0; w" t8 ~; }& F9 t7 P1 s% W8 {
L->listSize = LIST_INIT_SIZE;0 S' ~" w4 z+ q' e
cout<<"线性表初始化完成!\n"; B* z' z9 [- N1 m* [, V' u
}
' D# R$ {3 B" [2 s8 o
- T( F7 h+ _4 W+ D' E增加元素; ~# k9 h( O: M+ S
& x- R1 E. s' l, H+ h5 P4 @void ListAdd(SqList *L, ElemType e){ //在末尾直接增加元素3 {9 D* p$ [/ K5 m9 i
if(L->length>=L->listSize){
, p3 K* m" i4 ~% X3 e L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));7 ~3 B" }/ M% Y" v' d6 _
if(!L->elem){% ?! V. j) p' j2 r* C* L0 c; t
cout<<"增加空间失败!"<<endl;
: y6 U; h F3 d/ J5 E DestoryList(L);
! V/ S: {$ n& z" I2 M. ` }1 T% M1 I3 r; `& b2 J! a* n3 r3 N- u
}$ h6 A) e5 x, C% z5 E
* (L->elem+L->length) = e; V6 }+ d/ }; z* K" _ T
L->length ++; & F3 S t4 |( M4 {
}
' I; t, @9 E K, j) W3 @; {/ h; U
( u: A( H$ Q, A, g' Pvoid ListAddBefor(SqList *L, ElemType e,int e_where){ //在某位置前增加元素
- ~( V& C2 D4 ~+ s9 K) A! ~ int i;
! h c& z ^! K& G, p% | L->length++;/ e5 k7 e! z0 s! `
for(i=L->length;i>=e_where;i--){
7 E' D' I+ _! x3 b1 Z if(L->length>L->listSize){$ X$ z: A: y' h& n0 Z9 }
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));( h) W: _& J; E
if(!L->elem){
b) R1 N5 C7 H/ u% @ cout<<"增加空间失败!"<<endl;
" F. p# N, |8 t7 I. P! z DestoryList(L); ( f+ x) [/ G1 g3 g, Z& ?) P
}
! A7 @; j* m% C/ o }
# M# w' B5 `" z1 {- r5 w *(L->elem+i+1) = *(L->elem+i);
/ o1 {+ W& w0 d; x }- w1 Y/ G) ?/ M( t9 p; L% y8 u
*(L->elem+e_where)=e;8 L% B! ]& f# O, I: ~) P
cout<<"增加后的线性表如下:"<<endl;
/ b: R2 Z- z# E* D4 v0 i$ f ListShow(L);$ ^% R3 [8 I1 i) Q3 d' Z
}
4 P8 ?! H& d* j
; H7 A# B' B, Svoid ListAddAfter(SqList *L, ElemType e,int e_where){ //在某位置后增加元素8 p3 S+ A5 F: _( D6 m
int i;
# H: t: D5 F# V) P L->length++;% g2 U$ F4 ~8 o, |1 p6 R+ g2 G
for(i=L->length;i>e_where;i--){
$ u7 T8 d4 p& R if(L->length>L->listSize){ Z9 c) W! @# K" d: H
L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
. z: g# s. s1 i7 i0 f8 o if(!L->elem){1 O6 D- z- M6 w2 G. n, B/ O+ t9 I) D
cout<<"增加空间失败!"<<endl;
7 Z8 W! r* l0 C# @ DestoryList(L);
. V c' Z9 h& u& J }; M% M: [0 p6 D& m
}
. K. S7 B4 O* U/ n- C" W# ^ *(L->elem+i+1) = *(L->elem+i); " R9 q5 y4 y+ J6 Y& E+ c. S
}/ G& @, i Y i1 W7 m8 B; M
*(L->elem+e_where+1)=e;
- q1 d; D3 {, G# L7 H) Q cout<<"增加后的线性表如下:"<<endl; ; m8 n# _: Z0 D V
ListShow(L);
, K- O0 ~9 E7 G& [) c9 L}2 f% J1 Y3 {4 {+ ^- k0 i9 u
" B3 |' I$ p9 x( _ S
删除元素; H+ \2 r$ i1 R/ R: `
9 `( g3 p0 t) Y6 X% P; p' {! dvoid ListDelete(SqList *L, int e_where){ //删除某位置元素
- ^& L" h4 Y/ c0 h* x L->length--;
6 w+ m% b$ Q* U for(int i=e_where;i<=L->length;i++){, ^8 M- B; G7 q: O4 G
*(L->elem+i-1)=*(L->elem+i);
+ Q" H) q- T- R; ~! a3 Z. Z }
, j7 V. N' x8 X4 R9 \# g- @ cout<<"删除后的线性表如下:"<<endl;
6 O' v/ I) Z$ D7 I ListShow(L);
3 m- R3 W7 Z# B}& S, w" w: v2 w
- N+ s6 `, [' I0 L
销毁列表# f/ d' ]4 P; A2 _, G5 Z
6 P& u' {4 L2 @' S. w! z6 P
void DestoryList(SqList *L){; c# a3 ]$ u% ?' O; R( M
int i=0;' ~0 d- i# ~- I0 I! \6 e
for(i=0;i<L->listSize;i++){! b7 I o$ N; O2 g
free(L->elem);! W) k# a. a0 G, U6 t( x j' G, B
L->elem++;
7 b: q9 A4 E+ b5 M; j$ i }
. M) `. ]/ ~0 z) Q" h9 ~3 P exit(0); 1 n w k2 U; }7 L& V3 x
}4 i$ K% a* u- @$ }* ]) `
5 _. ^9 a- q K6 o' q+ n3 e( C
链式表示方法7 i9 _0 H5 @) s5 ^
: X# F3 b& `" X& z
结构体定义
8 N; z( X8 S) V
7 z: J8 h5 V6 i/ Z+ q6 y5 xtypedef struct L_Node{
: K! Y8 K% S. b! j# @/ r ElemType data;; f: l# h0 _3 m, u4 B0 _* J
struct L_Node *next;) ]3 r) i8 @% T- N6 ]7 B
//struct L_Node *last; //增加可变成双向节点
* s! {# w0 e9 q; x}LNode;
3 p$ m+ v D, w4 l4 c
! ~. V$ d6 @5 H6 W; a7 i1 n! }初始化
4 Z) {. c. A) y8 r+ o
3 H* e4 |" |6 r# @( j+ Q: nvoid LinearNode::InitLNode(){
+ r0 [0 a. [( f HeadList = (LNode *)malloc(sizeof(LNode));
0 V7 L" d- B; \; }5 \' y" h+ h4 M if(!HeadList){
& ~( A/ I" x, `6 t' \5 T& g% X) k cout << "初始化链表失败!" << endl; 3 y2 j4 E. ]: B& l/ H: X j) d: S7 [
exit(0);
9 G9 D$ e6 N5 [4 s1 Z6 J& I } / e: _: Z, J6 s- l. ~/ O: D8 U
EndList=HeadList;6 T* c U7 _" B; Q$ _3 q3 X7 j
HeadList->next = NULL;
, q* S c" H! x# b( d9 X/ K3 U cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;& B) s- C/ Y9 x$ h2 V; z
Length = 0;
% m! W& Q) Q" k e_where= 0;
$ Y0 w9 V% N# ]4 s3 _' y}
; P1 G4 @. i( i6 u2 }% e
( ^) ^ e7 Z4 N S增加节点
/ H* ~! _: z8 x8 ?+ h, U( O2 J0 R1 `7 }; u* C, }# ?
void LinearNode::AddNodeHead(ElemType num){ //头插法
( }; [' e4 a" t; g9 w4 ?$ L/ O node = (LNode *)malloc(sizeof(LNode));
- ]; \8 _+ R7 ^2 X if(!node){
8 s( p9 i: A" t: K; W+ l9 p( ] cout << "新建节点失败!" << endl; / N$ ]: E1 t, A7 Z9 K G, H6 e1 Z
return; 7 p M1 _' V6 L* j6 q _ N
}
2 ^; Q/ f" s: y; E3 e, { node->data = num;* {; Y' S8 W$ W' e4 s+ y) V4 ~
cout << node->data <<" ";
. _' b! F7 B( W) {- S if(NULL==HeadList->next){$ h1 K3 R0 p: S+ b; d, s
node->next = NULL;
. [; r l) U/ S6 U. M% R HeadList->next = node;! i2 E, F* x9 J! x, C, k! f
EndList=node;: |: e7 D) s! C+ J* Q* o
}
* `; K( V( Q( V, d p, [ else{
7 q+ |" D0 M9 |5 |) e node->next = HeadList->next;- Y! d; u }! n! B- p$ K
HeadList->next=node;: z+ J) t* U; S9 l+ E
}
3 }$ }5 ?, K3 u Length++; / |! E2 T2 i* p4 ]
}
) c# N7 H6 }; s/ k. H3 Z2 f: M O, b }$ M7 K7 K" Y+ Z% d( J: |" {
void LinearNode::AddNodeEnd(ElemType num){ //尾插法
: o( ~; V% b; d8 o1 J node = (LNode *)malloc(sizeof(LNode));0 _4 J9 Z2 u5 E$ Q" r
if(!node){
" f3 e" z; r, ^+ H' q cout << "新建节点失败!" << endl; , n) B" q+ n0 o3 d2 ]3 m& N
return; ; M# `4 i2 b. K6 T8 F7 u: }1 H
}
' I2 Z7 G4 r3 b3 ^5 H% l: M* ]4 C% b node->data = num;
* C) x4 b f* l* I/ d& D cout << node->data <<" ";7 I' ?8 c# B' ?* a9 Z
node->next = NULL;# f7 h3 u% L3 d, n
EndList->next = node;4 m: P- Q- U3 l: \
EndList = node;
; ?' A1 `3 ]2 G- P# P2 o Length++; ; O) m8 e# r. F! b
}
2 J1 }; i* Q0 ~3 r0 [2 q! S+ R+ N5 A* K! u: o
删除节点
/ n' R# V7 I, a8 e( o- P) D: j% K% K' v6 u' f0 |
void LinearNode: eleteNode(ElemType elem){
; x2 ^3 l- B& n' j if(NULL==(HeadList->next)){2 }( K2 I0 Z5 I# }5 g/ S' w" a
cout<< "无节点"<<endl;3 X" l9 A. U. D! b, w2 c' Z
return; % |6 C! ~+ @2 f f7 h
}/ s' k8 Q! S9 {: J$ V2 u" R v4 R
Node_cur = HeadList;% j/ q5 T5 C* s4 I8 j. J5 i
while(NULL!=Node_cur->next){2 a# q9 F' Y9 R; K2 Y6 g
Node_temp = Node_cur->next;
+ f9 W, G( o% y if(elem == Node_temp->data){& o. w# e2 }5 P1 \) Q
Node_cur->next=Node_temp->next;
# Y. ?% ~0 H1 \( b6 S free(Node_temp);8 h) B1 n* C, F$ d/ G% U2 S
}' T# n, e3 h6 Y* ^% R/ B# a4 p9 A% b5 l
if(NULL!=Node_cur->next)( z- G' N! D9 s- x) M
Node_cur=Node_cur->next;
; N; a E' w y. q" Z" Z }
' `& s; m! N2 s; v. L cout<< elem <<" 元素已删除!"<<endl; % ?) p1 F+ Z& G+ p# d8 U* H4 z2 G
}
- n) m5 V! h& {6 ]
$ R; b8 r6 f. {显示链表
+ ^! d" T! B8 w6 I" Z: W9 O+ [5 k; A6 h2 b: U
void LinearNode::ShowLNode(){
1 w/ ^1 P* f$ Y- `6 c+ D% Z2 i if(NULL==(HeadList->next)){
" g/ M9 D7 n' I2 P cout<< "无节点"<<endl;! ]: Y' l. l' P( v
return; ' w) G$ u1 z0 S- _" z. U4 F' }
}
- Z7 h. b* q/ G3 H" y ^$ C Node_cur = HeadList->next; # `/ F8 z8 h4 I: A( S
while(NULL!=(Node_cur->next)){8 n, N7 ]. u6 r! K! ]1 p
cout<< Node_cur->data << " ";5 O! m- E6 [) r) J l4 F
Node_cur = Node_cur->next;
3 L/ V! s6 `# E }7 h( B" ]' F* B/ K# P) W
cout<< Node_cur->data << " ";
1 E' v( A; p8 C cout<<"链表中的数据已显示!!"<<endl;* w- K* ^$ W# K* E0 S' O0 F
}
8 K. O: e: ~$ T2 ~1 a# j! u
2 A3 d0 i) i( s+ d销毁链表
. S) @) g1 Q5 e2 X
4 E; D; B3 c3 z$ Y2 Svoid LinearNode: estoryLNode(){) s+ w7 ]' D. ^2 d* t* E
Node_cur = HeadList->next;
) n4 n3 V+ F2 g% [1 R8 z0 M7 k while(NULL!=(Node_cur->next)){
9 r' V+ q7 T5 H: O& f7 u0 P Node_temp = Node_cur->next;/ D2 t3 x2 k6 R6 ]
free(Node_cur);( t( C8 M) p5 s9 C# z6 Z
Node_cur = Node_temp;
( v* x% Q4 r! w% p$ Q) U- w/ t }- v% p" W7 S) I& O$ J9 D
free(Node_temp);
+ t4 c! b* w- H- ?# W# @' \1 ` cout << "数据节点已完全释放!"<<endl; # `# Z$ r6 ~) {# Z
free(HeadList); // 释放头节点
# n$ D" s# S! B4 n T% N2 ] cout << "头节点已释放!"<<endl; 3 n6 l- a9 j$ f5 `
———————————————— M e; u0 [# U- w7 D Y% F
版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ L/ W. |& d J* k
原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
+ F: J" W/ p" g% T; x, l5 P/ w7 Z$ S+ y! R5 w
+ Y: W1 x% V& _& F |
zan
|