QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1551|回复: 0
打印 上一主题 下一主题

线性表顺序表示、链式表示实现方法及其异同点

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-10 16:11 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    . f1 b  G( r5 A; n; g线性表顺序表示、链式表示实现方法及其异同点
    / ^7 P# h4 B  C线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    & {; R% z: z7 g5 I2 \( |( c! N% @  h8 G  h
    本文采用C++实现两种表示方法。
    . a: q$ C/ _, O  l$ @, N
    4 q# f- M3 Q  E& ~+ J7 B) _目录: D$ S+ z3 i# I, q6 ?: Y; m

    1 m" o. K  ^; y" j& U8 _4 M9 f: K# l顺序表示和链式表示的区别:! |5 k& U7 R. K8 \. S; s. g
    ' w8 V6 v7 |9 @" _& J& Z) Q, P
    创建方式:% ]$ @' ?3 ]- x5 o, Z* x

    & ?. }7 q  q( D9 y# \9 I6 b( G. D' j时间复杂度:1 R$ l# i- o4 U+ }! N( O& d/ e

    0 V9 |' W( p% g顺序表示和链式表示的相同点:9 i( O$ b- `/ l* r2 w* e

    ( `; F( u+ i6 S( \' T( y6 n" ?4 ]删除内存空间:% y* B6 w& S$ ]; y  L' {

    4 u# Y+ x, b" L/ g: }代码实现:
    , @* R! M( B. M+ V* _5 |+ M0 a; v
    顺序表示方法:5 }/ T( A0 S) k- [: B/ f/ G

    & q. d6 D' [! z: s) f3 w结构体定义
    / _+ J+ j2 \8 c) o; w! B: ~$ D7 e* o0 H4 \; M' \6 d  n& E
    初始化
    % R' b- Y. J8 g& t. Y2 u- Y) N6 t4 R
    增加元素# [1 y; U- o0 M
    7 m6 u% b3 O, F0 E- y- {/ m7 a" `
    删除元素$ n' M# w1 e# o% v1 Y
    : u! ]; b; Y# U( k
    销毁列表
    * ?6 d( }7 j" S% R( m1 J* R- x2 c. }& Z: }( _, B: h
    链式表示方法4 R0 E2 i. Z6 c0 P5 ?
    9 Z. x6 z) ~) z# l
    结构体定义4 J$ c5 m+ k1 I' b( T
    3 J% j7 a) s/ a" S$ r# p
    初始化, B1 i5 S5 p$ P  }' g# q
    3 S5 h* s. O% i
    增加节点
    ' m9 E: x! n/ G, G* }' u* f. }) t% ~0 C8 W: f
    删除节点1 t  k! F( l7 E# N
    - ~; X, i  @1 J1 K, `$ E
    显示链表
    6 c, ~4 l) i6 U% }$ g  k4 v# r0 d9 X
    销毁链表' k. O9 F$ |. ]4 Y) W, ^

    : |+ X+ m# e- o9 t: b+ w( Z顺序表示和链式表示的区别:" r; C! d9 [+ v4 f$ q9 m

    + U. F# s$ r9 K% Q  H创建方式:/ D6 B- u- B5 e# ?% i

    # 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 _

    $ m( o8 c3 H1 x
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-9 20:04 , Processed in 0.452128 second(s), 50 queries .

    回顶部