QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1553|回复: 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
    8 e# ^' I( c9 d4 `6 l- N
    线性表顺序表示、链式表示实现方法及其异同点. t) d% q, r" R0 n) b* x
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。+ i* x: W) P! w5 r% s$ ]
    3 k1 N9 h% J! D. M# \) N- g% H$ b
    本文采用C++实现两种表示方法。
    3 f2 F7 p0 p* r: ~7 b# G
    ! N: O, W3 O3 y5 ?9 n  W! B, h目录7 J0 F" W2 W5 O# g$ ~
    ! x. h% x9 k5 v* ~# Z
    顺序表示和链式表示的区别:  P: c* B* v8 J' l; J5 R  J  Q- r
    , e9 `' a( J" p8 K/ a
    创建方式:
    , k. P6 e  U! I* L$ [
    1 K; U8 \% n6 x. H9 a3 E' ?时间复杂度:( Q& s& p9 ~; u
    $ \) D9 M* @4 c2 m) W6 u: u
    顺序表示和链式表示的相同点:8 F2 U- A+ u# q! R
    ; {3 Q% X7 w. o( m4 \
    删除内存空间:: L% w2 V! u- X  O
      p! j  C1 ^$ T+ A0 e
    代码实现:: T0 P( F# o. N
    # S. p; @, D% `
    顺序表示方法:
      v' F0 @9 _% h7 v
    " _! v2 h) @0 F8 }2 n* |8 i结构体定义
    , S, r5 E9 C( D: X
    % n2 _9 ^; @% l& M2 N初始化
    8 B! d, Q+ x9 N5 W
    9 h/ D0 I' k+ l1 U, L, Q/ `( y9 A7 O增加元素
    ' T* z# B0 G) v. b6 w- V
    * t2 Q8 I+ b/ m0 b; S删除元素
    0 ]4 Y7 l& B' d* k( |- i( }8 Q8 F8 ^5 _) A0 F6 U8 i
    销毁列表4 |' L) H, `& M9 L/ z

    ) U* F+ W* [/ G- B3 F- M2 C链式表示方法% L* x. p, `4 Q

    4 }) D9 \: N/ g) T结构体定义3 v2 z% N1 {! B# u% T8 ^
    ' y4 _2 b' I. p0 G& u
    初始化5 B) j; K5 j7 m: q4 R7 `3 Q

    6 Y) X- a% c3 z- [& R( [" N增加节点
    8 \! h5 L. U5 {7 ^) }& U2 p0 _9 @2 r$ Y3 ?5 U; q" P4 Y" l3 N
    删除节点
    + ~4 Y# b  Q# G" Y
    , H5 L) r- s& }0 P. o( f- Z显示链表) x& J; {; o3 _

    + v& y0 G- `# [* G销毁链表
    5 K( x" }6 k- t' e+ o4 u: Q
    , @1 s# d7 o+ Z$ D顺序表示和链式表示的区别:
      P% J. u7 Y. _' w: d$ Z, Q& `
    * D( r; a' `! c0 m创建方式:
    4 z$ r! y, q) F- p  B8 }) U3 A: M$ _8 E  s
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    , [  D& c7 e. L( z7 x0 X5 r! P: g( W
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    7 T3 e- a) p$ C3 q+ ^5 g# L, o7 R0 P1 P# ?& i: s! u
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    . ]" {! O, h4 O9 \, [+ P4 A- ~3 d* a% ]# L# D2 X0 b3 M) b8 C
    时间复杂度:
    ) y) ]5 q4 |4 W( t7 b3 r/ p9 b: h4 g% t% X2 a$ U  h2 U
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    - q- q( e3 z# o# x- a) f7 x
    2 d2 \9 D8 `3 E  H" Z- |2 A增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)( r! c  M7 m! s5 `6 G# D" }

    8 |+ R& e6 c9 f* yPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    3 C9 G# h6 j# R- l' Z' j' x6 k
    5 r) X4 l- |/ m# b5 c. H1 H修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);# t. R3 H6 o9 e1 u% w0 d0 h

    % L/ V3 _2 O, {; Q, x; s' t查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    / m- t$ o, N, A! v; p, K$ M, Y% F: i% L5 Z6 G
    顺序表示和链式表示的相同点:" ]  F" H& S' R- ]+ q: v7 s
    5 `9 d! y: N; `! \1 T! k/ t3 |" H. }
    删除内存空间:
    * }4 r$ Q( {, H" N5 `5 T& C( |# k" W/ K, v! D' k
    内存空间的删除都需要对每一个存储单元单独释放空间。
    ! @: @5 ?  {% M5 l& l) `& u8 u6 f  n0 q7 S- C. ]
    代码实现:, R1 Z; Y' [& o9 B

    3 w" f6 \% y! I+ D2 x1 P顺序表示方法:
    & f" A! M; ]9 u1 N8 m4 q: Q+ o3 B' a% M
    结构体定义
    9 P" L9 d6 Y7 x9 l% q
    0 _. Q3 s( M& i% Jtypedef struct {
    ! F, F8 e! `/ y2 z& \' v    ElemType * elem;5 ^& u$ t$ B0 O/ u) v* s
        int     length;        // 线性表的现有长度
    # C1 k! x: `- o* M3 a    int        listSize;    // 线性表的最大长度3 ]3 l+ [9 f1 J% A  u0 C7 }; Y5 o
    }SqList;4 E/ |# R- {; J& _4 X3 b* f! _

    : i8 I  M  x" g/ C0 h初始化
    $ G5 F! @, Y: ^/ q1 Q1 G( d) _5 u% w' a
    void InitList(SqList *L){
    % h& {$ M3 {1 I' J    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;- _3 n/ J; _# \: S
        if(!L->elem) {
    6 S& S# b$ P9 R# C1 \1 M        cout<<"申请空间失败!\n";
    # f0 E/ r6 z1 n/ k' t7 f# n, Z        DestoryList(L);
    7 V  \( N+ }  W, T0 f5 S    }5 p& c9 c) y# B( U  y' K2 n
        L->length = 0;
    ( b1 C+ e. ]0 E( c0 _4 N$ b    L->listSize = LIST_INIT_SIZE;
    5 I8 M& r4 \: c, w    cout<<"线性表初始化完成!\n";
    8 ^" D" E% a( h}
    + b' t& T3 d$ c3 N5 ~! F1 _& |
    / }- X4 c/ D9 a6 s增加元素
    ) ?: Q% r+ W8 Z) [8 q3 [2 Z! R! q! E0 f) p
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    " C, g7 h) b; X    if(L->length>=L->listSize){
    6 o& p. y$ `9 b5 h& y& R        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    . J/ W; g& _0 P2 ^) y$ G' K+ U        if(!L->elem){( J0 M) @/ r$ G( O
                cout<<"增加空间失败!"<<endl;) U5 r: n, ~) J! c$ E$ ]* K
                DestoryList(L);
    : a6 E5 M7 E2 E. I. S5 c        }
    : x# N7 u  w, e2 M# o. }    }. R3 G+ Q/ S" p3 I+ B+ m0 ]
        * (L->elem+L->length) = e;( K' `% j0 Y3 p1 u0 E* A9 }! J
        L->length ++;    . k! Y/ I. U9 l9 I& P
    }
    0 F& H# O  G; c. `  Y( K( w8 ?/ O5 j
    & [0 |& o3 L# |, Yvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素' V! o7 A* ~$ C( S5 Z7 E& q
        int i;0 w- U8 }8 Z- `6 X+ _+ i
        L->length++;8 ^3 ]/ U8 h& i, x5 }6 E2 Z
        for(i=L->length;i>=e_where;i--){& @% a6 W  c& ^0 t8 `& e1 J  O
            if(L->length>L->listSize){
      G; @' b! X; j( s9 z6 q: h3 m            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));8 p8 [" f- C& u6 g% f
                if(!L->elem){! o5 A$ ?/ e2 N1 M
                    cout<<"增加空间失败!"<<endl;
    7 U4 B2 m3 W5 S% n& x8 o8 N; T, d                DestoryList(L);
    2 i, C( K5 x" C) ~2 ?            }
    " {- }- S7 X! r( W/ {- a7 u" g, y        }1 P7 ?+ Q8 Y+ O/ L
            *(L->elem+i+1) = *(L->elem+i);        5 `' q/ X1 t. a" J
        }
    ; D% R0 F$ b1 p; ?- Q6 a% a+ V; f    *(L->elem+e_where)=e;- C. r+ s2 q7 x. a
        cout<<"增加后的线性表如下:"<<endl; ) ~4 k) J+ {; n0 o2 U. M0 M
        ListShow(L);6 n. G2 K# A4 I* ]4 L7 \6 C3 J/ b. h
    }
    ) X: u6 r8 o7 U- Y9 ^  o. I- e# k7 N- U. l
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    ' j# F8 I# }2 H    int i;
    % o6 o' Y5 h5 j    L->length++;
    0 Q  s$ ?6 `, Y, _% x. O7 U    for(i=L->length;i>e_where;i--){
    4 |, s  q2 `! T; r; b, o        if(L->length>L->listSize){
    ' g' E* y3 l7 D8 ^; j# _            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
      A( B- h4 T( x" U3 u/ Z/ c! O            if(!L->elem){- l' P9 C, F* @
                    cout<<"增加空间失败!"<<endl;# \& ?- \( }/ }. A- c& Q/ W2 T* G
                    DestoryList(L); ) J: C+ t5 z: ?& D9 F
                }
    $ _7 N5 s* x2 W$ W, G( L  Y0 J        }  P/ F7 [0 l, \2 K
            *(L->elem+i+1) = *(L->elem+i);        
    : n$ }4 a0 }3 x  U    }! H! L; S  B# Q7 H6 N
        *(L->elem+e_where+1)=e;+ T  W* U/ Y; r, \1 F9 B
        cout<<"增加后的线性表如下:"<<endl; % |+ G: A- ]+ z" q4 Q2 Y
        ListShow(L);1 h4 d. U( o7 s* X
    }
    $ J& D2 K+ \- [
    ) ^4 p8 [! [. y* }' [删除元素( a; o, m, t& n, q

    9 D  J) y8 c; B5 h$ E9 g) Svoid ListDelete(SqList *L, int e_where){    //删除某位置元素 , g6 Q3 e7 T7 V; d/ r, S1 E
        L->length--;  t7 [, Z  s' |- q
        for(int i=e_where;i<=L->length;i++){
    # W5 r  _/ k5 R+ D' H+ _% t* c        *(L->elem+i-1)=*(L->elem+i);
    6 ?. @/ h9 [5 ?2 A% G    }# W$ a" e, e1 O$ D$ Y
        cout<<"删除后的线性表如下:"<<endl;
    & R- I/ j  v, Q: [    ListShow(L);
    4 p# x# q/ y3 V$ {) k* S+ d) F2 n}5 ^, I9 \1 }0 ^
    ) j' `, b: E' U' `7 l( I8 P
    销毁列表3 q* H* V' h$ T9 x8 r. `5 i/ _( Q

      a% P8 @! F4 }0 |void DestoryList(SqList *L){
    , }7 i, q8 S4 X& s* X6 |  F    int i=0;, l4 U0 ?, j' M/ I1 q
        for(i=0;i<L->listSize;i++){6 x3 i7 O) T1 z0 T3 e0 N
            free(L->elem);9 g" |1 W' l# L
            L->elem++;+ ^- \1 P; Z% N3 ~7 C4 d8 E! g
        }
    ( E7 }/ J- ^8 Y0 `2 l' }    exit(0);        + ^; N# O7 `* Q) p
    }
    1 I6 Z$ V/ F+ z# {( I; G
    & T7 e! k; b  m$ C7 F# P: D6 N: v9 U链式表示方法
    . n( c+ P  S) k
    ' D: o1 n) a( {# }' c- Q* @$ Z结构体定义5 `; F# @# U0 _) s9 p7 F7 o2 ]
    + I; H0 x: s' n, H3 }4 _
    typedef struct L_Node{9 g6 C! X* W; p/ F) o
        ElemType data;! v  _, F  J8 g6 D( F3 r4 S; q
        struct L_Node *next;
    8 c( M+ I+ f- v- y    //struct L_Node *last;    //增加可变成双向节点 # Y+ \6 e3 \5 `7 e; v% \
    }LNode;; A. ^( q# n# v2 L- L  ?& x
    5 J, j: B" D. y7 @, M9 U- i
    初始化
    # A/ x" u/ g! p1 H. K& A4 v3 H  P
    5 D" U* F. [% P  avoid LinearNode::InitLNode(){
    ; `; d$ A4 O6 e1 E    HeadList = (LNode *)malloc(sizeof(LNode));, c, B1 y' U- G) O: Z6 |5 R
        if(!HeadList){
    - N# M1 P( C) s' l" M        cout << "初始化链表失败!" << endl;
    & V$ q. K  o) ~  N% @        exit(0);
    # X& |3 ?3 n7 c    }
    : }8 U$ R& O) j7 K' W! R    EndList=HeadList;1 W/ a3 Z: C! i6 N' c0 ^0 Y
        HeadList->next = NULL;
    ' W0 b0 E4 v* I4 l    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    " W3 U% {" F8 K# `+ P; b/ E    Length = 0;  l% v6 _5 h, H8 |
        e_where= 0;* }+ S. W) S5 \6 e8 Y+ G
    }1 Q* @: M9 M) a9 E
    $ j3 Z1 |& V# a0 L: r. l9 m; I" I5 W
    增加节点
    $ }1 |, ?8 T6 P0 L  n9 y/ E) c7 A, F9 @& X* {  ~" v
    void LinearNode::AddNodeHead(ElemType num){    //头插法
    6 o" }8 L5 {3 @" ~5 {, }    node = (LNode *)malloc(sizeof(LNode));
    3 g0 I! S, G/ @; N; O" O/ I% F# e    if(!node){' j: [5 J& B" v/ h3 s1 m8 R
            cout << "新建节点失败!" << endl;
    ( X$ V* s: |: i- [3 @% k        return; ; d9 X$ I  S6 A9 S4 d( h% ~7 l% c7 o
        } " A5 ~, _+ I9 {
        node->data = num;
    ( q; O$ @3 [6 q2 Q; [    cout << node->data <<"   ";" p6 S# m# p7 d: N0 `* b
        if(NULL==HeadList->next){/ m; M# _# P. v& m' T/ i. `
            node->next = NULL;; b* y; e2 a# X* y% q
            HeadList->next = node;. q) [. Z) q- g' X7 v7 t% d) M/ G
            EndList=node;
      M- F; A3 X& r& |    }
    9 \/ E; }+ [/ J* d8 [$ ?! l    else{
    & x6 R$ S" j' H4 \        node->next = HeadList->next;. u7 m5 ?1 C& v# ~( C8 G* E
            HeadList->next=node;% X4 |2 R- z2 H4 m
        }
    9 J  F2 x' s0 i+ U! X  J    Length++;
    * G9 S+ c$ Q5 v5 A}3 F: S+ k  I9 B& \# z

    - g# f& U, ~1 s, E# X$ rvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法 5 I% h4 L) R% T, F1 y9 \
        node = (LNode *)malloc(sizeof(LNode));
    - ^+ f$ y' Z* n    if(!node){# @, Q( K! x; l. y* m  U
            cout << "新建节点失败!" << endl;
    7 Z& ]1 q+ @' a+ i/ ^& Y        return;
    ' o  e" m' L  y: _5 e- }    } ( P8 i$ J: q$ }( D$ I4 u
        node->data = num;
    ! o- A' n% y2 E3 `6 k1 `: k    cout << node->data <<"   ";
    - w& O+ T) O+ P/ r    node->next = NULL;5 Z3 w! L& g' I7 q: {# ^
        EndList->next = node;
    0 n2 l* J5 w9 p& |  a2 M7 ]8 L- A/ x    EndList = node;0 r  o4 J2 I% \6 t7 Z
        Length++; " ]3 k& F1 |6 \1 \1 \# ~$ Q9 [
    }! Y2 H/ [/ n; L* `" v
    . n* c9 T5 e% C* X& ^
    删除节点  u/ Y% e) o" D" }2 _: x% [: B

    8 V% J3 G0 C4 s( f/ |void LinearNode:eleteNode(ElemType elem){
    2 h* A! H# w* r* Z    if(NULL==(HeadList->next)){
    " A4 H4 h8 O2 }        cout<< "无节点"<<endl;
    % P% L& I0 i7 `, j( O( A8 e        return; 3 [1 d8 S' ~2 Y
        }. V! K2 t3 T! ?6 O
        Node_cur = HeadList;+ t9 ~+ X7 j9 n
        while(NULL!=Node_cur->next){3 }$ h4 L- ]+ ]1 A6 L
            Node_temp = Node_cur->next;   a2 [; h8 e* X
            if(elem == Node_temp->data){
    " D( `8 M8 s" u/ ?5 k+ s* z. I# Q            Node_cur->next=Node_temp->next;
    # K; |2 e8 _( z; }0 \) j: ^            free(Node_temp);
    ) I- D/ R( r# I8 R# f        }6 b. @$ X- Z$ Y. t" E
            if(NULL!=Node_cur->next)6 [- p9 h2 R" r2 [1 }2 V& z0 i3 {; S
            Node_cur=Node_cur->next;. a2 Y8 I: [- {2 j
        }: J% w) `+ e2 N: s4 R' ^# C
        cout<< elem <<" 元素已删除!"<<endl; 6 T, i* B4 i: D1 x% C+ [+ \! h
    } 6 P) P. A/ {# ?3 M8 L6 Z( B2 T
    , P1 v1 E/ g' c
    显示链表
    * U2 c% D: `$ X: a
    $ P% h* f/ V: {( y8 G4 v! C3 Xvoid LinearNode::ShowLNode(){
    : d! d/ X& ?; B& @9 {8 i- z    if(NULL==(HeadList->next)){7 R: }/ Y1 n# p7 ^
            cout<< "无节点"<<endl;
    8 \# q2 K: K, x8 a        return; 4 d, M$ E8 o6 k0 N+ f  K4 U; q
        }
    6 f: l( A# R/ A3 ]( b    Node_cur = HeadList->next; 3 p! H+ r1 o- m" u) t8 O8 p
        while(NULL!=(Node_cur->next)){
    4 F& h5 ?# v/ ~) X* f  h; H' e$ Z! f        cout<< Node_cur->data << "   ";4 i* J8 f( d* k0 p& L
            Node_cur = Node_cur->next;
    3 Z$ N9 H  z( ?6 u* M, [/ k1 r5 e    }
    $ _* p+ F6 M9 N0 V' f5 h( |    cout<< Node_cur->data << "   ";/ a! ~. c6 C$ R( q* Y
        cout<<"链表中的数据已显示!!"<<endl;
    ) K7 y* J$ _7 x}
    - i6 T) V# d! u8 s+ D% _4 I- t0 w
    销毁链表9 t7 {: N2 @) Z. \& W2 E8 U- ~6 g

      j# e6 F9 _, m4 B8 ~void LinearNode:estoryLNode(){
    6 s  `. n9 g3 c    Node_cur = HeadList->next;
    * ~3 L# a6 \4 f5 @2 X: B# X" i    while(NULL!=(Node_cur->next)){( h. F) s" q4 F0 {5 h
            Node_temp = Node_cur->next;2 A" T1 u& ~4 U5 G
            free(Node_cur);
    ' H) \5 Q, B6 m1 ]( E* L        Node_cur = Node_temp;
    2 r( z' M( D& }* j    }, w; i% [2 G: j" e3 E5 ~
        free(Node_temp);) z: c& ?* U7 M, A. a. S
        cout << "数据节点已完全释放!"<<endl; . f2 V+ ]$ I6 e( f
        free(HeadList);    // 释放头节点 ' m" X5 Y/ c( U& J8 x) h
        cout << "头节点已释放!"<<endl; 7 y# V3 P' F) I7 k- Y- {4 G
    ————————————————
    . W' T4 [5 `1 y; f; `3 l- \版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; Y3 K' z4 w, {. E* b0 P* ?
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286' ~: T( [7 b7 ~9 E1 T

    7 M" V& z' u4 n9 L) F  O" l+ r7 V& u0 F
    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-10 01:34 , Processed in 0.436648 second(s), 51 queries .

    回顶部