数学建模社区-数学中国

标题: 线性表顺序表示、链式表示实现方法及其异同点 [打印本页]

作者: 杨利霞    时间: 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 @





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5