QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1421|回复: 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

    5 |9 U$ B7 b) k' N2 k7 K6 X线性表顺序表示、链式表示实现方法及其异同点/ b+ n* J, K9 |5 T
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    : s: L& o4 K: \; o" J- I) E6 p, \: ^
    ; o* Y0 K8 V) ]/ }本文采用C++实现两种表示方法。
    $ R, X. a( P1 A# _
    ( w2 N/ t$ D) M0 E, T目录
    $ L( q0 k: u% Z6 B. F- c( F1 u" B8 k, F- I6 p/ l" B
    顺序表示和链式表示的区别:
    2 R4 B8 s* p5 X8 K
    ( h' S% D1 r3 c: V, j创建方式:
    9 z8 X! T# H+ ^. [: {3 x
    7 z% G/ q) I$ B时间复杂度:
    3 |! |0 a# l( P6 ]% r- o$ b2 [5 I5 T/ |& Z9 i6 K) R( H
    顺序表示和链式表示的相同点:
    3 h( y. ?, r% r1 m* }4 h( C
    ( t1 Q* |, k, ~) `) ~0 C' c删除内存空间:
    $ _1 e. j! V/ e" w9 o( P% z. q$ Q  p' ?# C. h0 H2 g3 l1 [$ t3 z
    代码实现:8 f  i+ {% G/ [1 t* h+ v. p$ ?

    * Z, u. a. K4 E% ^* J$ P顺序表示方法:
    ! z0 O9 y7 `! l: U
    ! {! M" @" Z  m$ l! \2 D结构体定义0 O6 N2 P! e& C/ ?  m% R
    ) Q) X# q/ G: f$ L  D: }
    初始化: V7 p- V, h  C! x( l/ q

    6 }' y7 E: t! i; ~1 W( f# q增加元素
    . E: t$ d' d  B2 e, w
    9 A1 p- U& l' b# H% P" F删除元素
    ( S  w$ X( S/ q3 l8 S8 `! G% s$ H" C0 }1 Z7 g8 D
    销毁列表* L2 J( M; x8 m. A0 d

    2 `# W0 D! f# y3 W/ R. ~# e链式表示方法7 N) n: \  w' i: N  A2 d  t

    ( ]# ?0 t+ ~' g( e7 Z结构体定义
    ' A' K* F7 l1 h1 l9 [2 R% ]. Q/ R* a1 D5 r& Z% l
    初始化
      Q& C2 i  J+ V2 E
    . W! V8 x# w3 h" i2 E, m' s- d增加节点+ D! m7 J$ n# P0 p$ P8 u- k

    8 T. N4 y, B6 N删除节点$ h& D( C; G4 n: n* e
    % K4 z$ X: ?. ]! E* s  y8 p
    显示链表
    , V# H6 Z8 T% A- P8 t! K$ k( p6 R; j& L0 Z
    销毁链表
    / L- e" P4 N4 x& }0 j- C4 P( ]0 Z2 c; ~8 \7 Y9 w; ?
    顺序表示和链式表示的区别:! b, n- R5 [! Y% s3 L8 U# k+ M

    8 r+ B9 T, j5 X! {0 i1 \# R8 p( h创建方式:* {: D' K4 m3 c& d6 \

    2 E- [- L2 V% J- s1 p+ |' r0 D顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    1 A1 Q4 L  R$ n4 u1 S' k( f9 K  A  w, B& y" G* T9 n
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    ; o/ c' C6 T3 n1 F! u+ O
    ' L; S! H. Q0 ^链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。, M5 e! e. T1 a$ q/ I
    2 b& A" l) [+ T& o
    时间复杂度:
    # @% {" R2 a8 F/ G; E
    ; n* Q. w# U/ b& z- T$ V9 M增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)% j& r  |1 i2 \- H) V
    . v: Z3 F( V; }6 d
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)1 ?- e5 t& D) Y1 R
    # P- {7 y8 g' R  Q/ D
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。" p( Q1 w- s+ I/ ]

    + R( v: q& w7 \: B. y+ V* L0 ?修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);' k8 Y+ r8 n; p: p; K
    ) d  }8 E+ p* r% u
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);1 o/ \" F7 @: ^- m9 }! X) s3 w
    1 E4 _% @$ a0 a
    顺序表示和链式表示的相同点:$ t) ~( S5 ~( ^: c- K" W1 Q
    6 N- ?, ]  _2 r% K
    删除内存空间:
    ! W! L  b* T' t+ U" z
    ( e) S% R8 Y0 H. m5 Y内存空间的删除都需要对每一个存储单元单独释放空间。
    ; K8 m/ G) \7 T. Q& y" U0 @: W( L/ m' q* x5 N( c
    代码实现:  F5 ?& y% d6 e3 Y/ y
    $ k, y$ M& K: G5 g
    顺序表示方法:: x  z5 s/ W3 \( t( \% b

    . l- p" r+ d1 h/ _1 O7 v结构体定义
    : l0 Y: H# m8 o+ v9 y' |* A$ o; F. ~# ~; n, o% l2 \1 i
    typedef struct {
    6 j& }5 y" t! b/ l* P* @2 I    ElemType * elem;
    - n4 b( w+ b* l2 \/ Z# @0 _    int     length;        // 线性表的现有长度
    8 I  T7 H( D* Z    int        listSize;    // 线性表的最大长度4 N. V: ]: t' G/ P$ p
    }SqList;8 O/ {8 L( l$ K  O

    # d9 I8 [$ A9 @4 b5 l' q# {2 m4 J初始化9 f' p- n5 Q1 A5 x
    7 |& e' P7 ~5 G, T( \1 q& @  J
    void InitList(SqList *L){; n  T$ S4 o7 |$ c$ G- q
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    ' `: y8 B! p4 f    if(!L->elem) {) B* O1 Z1 y& {. ~
            cout<<"申请空间失败!\n";) ]/ H' u4 `7 r0 X
            DestoryList(L);
    # d9 Y. ?" f$ f; e; D    }- L$ a" l# v1 u4 |: C
        L->length = 0;$ @) q) f- O/ }  w# R/ O8 Q
        L->listSize = LIST_INIT_SIZE;' w; m8 Z1 I+ G& r* B0 d8 }
        cout<<"线性表初始化完成!\n";+ h0 k* t! J" V: Q2 _; D
    }& V: h& o* K$ z. W6 J$ n$ c

    * J1 e; W; P0 j- n- E) ^; q" P8 L2 l增加元素
    8 G" _$ S  w! K# R& F
    9 U1 K2 ?& y/ t% i. Ovoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    1 v1 M/ K# X: k# h0 `    if(L->length>=L->listSize){
    4 [8 [; [# j1 A6 u/ W3 w3 D  @        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    1 H  F3 h; [+ Y        if(!L->elem){
    8 W% I0 J2 r4 t, L. _  w) {            cout<<"增加空间失败!"<<endl;3 Q2 D# J/ f9 z: t
                DestoryList(L);
    - r# [# [9 z0 {3 M" t        }
    : A$ Q6 r, F* [) G8 T    }5 Z+ g, J" ], a3 P3 O# k
        * (L->elem+L->length) = e;) {# i% g# ^2 L0 @1 T# E
        L->length ++;   
      T- ]2 p% H* B. _3 Z& _2 s- s% _+ ]}. \- E* t+ _: [1 T

    4 |% F: V1 f+ `7 y( rvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素3 R9 ^/ J/ x! B
        int i;
    - H0 k0 D' ]7 M+ w; v0 a  G    L->length++;& m8 N( [5 s2 h4 L- ~& J
        for(i=L->length;i>=e_where;i--){* B* T  |+ k! Q4 K
            if(L->length>L->listSize){
    . m0 L) ~9 z1 \5 u. O: w  A9 f1 t            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    * g/ X) S* z0 P- b6 K            if(!L->elem){
    ' ^9 s: H8 a9 e+ l6 D                cout<<"增加空间失败!"<<endl;
    . p# x" r" d7 s% w                DestoryList(L);
    ; ]$ K9 b6 Y/ C            }
    " I6 L) Y/ v, Q' r+ C) j* e        }1 [. D5 i4 u* P) ]3 k5 R
            *(L->elem+i+1) = *(L->elem+i);        
    9 q1 q+ K1 [; w: F; T    }
    * j9 {7 Z" W2 e9 e( X; H    *(L->elem+e_where)=e;
    9 q' i1 u9 Y2 a% L. L    cout<<"增加后的线性表如下:"<<endl;
    / i3 `1 l! _3 s3 B0 |8 ]6 Z    ListShow(L);
    , A8 j, I% y! q. Y$ W6 e}
    ; I, p2 @9 f, b& ]9 p2 x; _7 j4 E: V4 B- T- T/ I. ?  v( Z9 _
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素/ m: N$ j; k' L! u6 Y7 y& a. J
        int i;/ I7 H! l# c: O" W9 g5 Q& B9 w
        L->length++;# P3 |' B7 F0 ?
        for(i=L->length;i>e_where;i--){  L7 B( c% L! S" K; o( m0 r0 l9 _
            if(L->length>L->listSize){
    , x6 K5 D% O% @8 C1 l- x            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    2 u* [0 f. R- F. K6 q- U            if(!L->elem){
    ! n' o8 ]: W" Y- A7 ^( B                cout<<"增加空间失败!"<<endl;
    1 k, L- V7 f& A; y- Y! o                DestoryList(L);
    # h& t/ e# H% x% X            }$ b5 a$ ?; |. @
            }/ F* a0 \, {$ N2 t/ |3 G
            *(L->elem+i+1) = *(L->elem+i);        
    5 l7 _. m0 m. |4 e8 [- [% M    }8 g4 F  T, C; T1 x# R
        *(L->elem+e_where+1)=e;9 w+ K# ]) I0 x) g# ~% ?( K
        cout<<"增加后的线性表如下:"<<endl;
    9 c2 D4 a* Q) C# C6 v8 U    ListShow(L);
    7 J9 _+ d% P1 v1 _% `}
    / A- t. [# G) I$ @! q
    & {( `  J, _1 @" k; y删除元素& F$ y. n6 N( S( J2 J6 |! z; t3 \
    " q2 m2 d- g$ ~9 T  p
    void ListDelete(SqList *L, int e_where){    //删除某位置元素 9 G0 M% o5 i( ?8 j; x. @
        L->length--;
    2 |$ e2 G6 d# u/ @, a    for(int i=e_where;i<=L->length;i++){
    $ p4 O, S8 f" s) m; ~/ p. d+ b2 x        *(L->elem+i-1)=*(L->elem+i);
    $ }( H1 ]# V# p  N    }# V2 z9 ~3 S6 q
        cout<<"删除后的线性表如下:"<<endl;
    9 ]% c5 |( L# F' y! E* ]( _    ListShow(L);' r# y# j$ _8 q# {
    }9 a" n+ ~. z; y3 L% y! P0 h. N
    9 |% i( X+ i# R, d
    销毁列表
    6 G3 L# ^3 V& u) f+ s) m. y3 @# V0 I8 ]. [) \& x
    void DestoryList(SqList *L){
    5 b1 H# ?8 h* w- |  C    int i=0;
    ) S* {# v5 @% }    for(i=0;i<L->listSize;i++){5 `" o! J' I6 y5 H
            free(L->elem);
    ) v5 ?0 K( }8 p. i9 r" \        L->elem++;
    4 x& S( Z% H+ r- y    }
    $ h- q* S3 I1 L2 i& Q7 ]    exit(0);        
    , M& K# N" A* V0 N( W/ Z}" P7 f) r9 {7 W% q5 j
    6 O6 U9 S" q9 g2 ?0 W
    链式表示方法
    # Q: }6 U$ p3 Y2 a; D. T1 O; K  m+ r0 K) _
    结构体定义
    - N% M" i. [, V& ^+ f; h! a
      M" Z8 a0 C+ u; ftypedef struct L_Node{+ }  t8 Q7 L: ]5 J- t, ?4 t
        ElemType data;$ _# E; }; Q  Q
        struct L_Node *next;; [( ?, U" V! _! |9 F: U; k3 E: |
        //struct L_Node *last;    //增加可变成双向节点 ) M! Y9 T6 i' c8 X, \
    }LNode;
    0 k  E% e2 x2 L2 y- Y/ E6 r& [- J/ v. D- A: c9 ~$ k+ i6 o2 Y
    初始化
    : J+ |4 }  j7 F
    # t7 M5 W) W: U$ k9 U4 qvoid LinearNode::InitLNode(){
    2 ~+ T8 Z/ o# T    HeadList = (LNode *)malloc(sizeof(LNode));
    5 c* ~' `1 x  v    if(!HeadList){
      e$ ^+ X, _3 d        cout << "初始化链表失败!" << endl;
    : N' N( _2 M! d$ s        exit(0);
    ) v0 J+ Y- q: T) x5 m; L; j! Z    }
    2 S! G3 V( N; P2 b% V2 `    EndList=HeadList;4 G1 u+ h# r3 k4 a* Z* t
        HeadList->next = NULL;
    8 Q" O; R- k3 r8 \. F* a' T- E/ t    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    0 L' Z- u5 a! T0 D. }6 n$ h7 X    Length = 0;
    ) e8 {7 M; H. B# F( z8 G    e_where= 0;
    2 m1 H# w" \: p* H/ i$ x}
    ) f+ R3 q/ I) H8 k  A3 F. |! ~. D$ k
    增加节点
    & e$ Q: k* B3 L; m$ p8 G" w% D# o2 Q
    void LinearNode::AddNodeHead(ElemType num){    //头插法 : v1 [# w: W7 p( m4 R+ J, b
        node = (LNode *)malloc(sizeof(LNode));
    % P: I- s) W0 e    if(!node){2 Q# \- ~0 [# S; n" U4 ?
            cout << "新建节点失败!" << endl; : e0 b2 \1 Z8 Z6 x+ ^4 s4 J% a
            return;
    3 S4 `$ f4 u0 [; l) x" I# O* w    }
    4 I3 _1 ?4 x7 L& k, C    node->data = num;
    " ]9 [' T+ f4 ^- Q% t2 }" D    cout << node->data <<"   ";# x* P4 i, f' X7 [  C
        if(NULL==HeadList->next){$ s0 c( A) w9 C% @
            node->next = NULL;
    5 h) x; t5 J" n# I        HeadList->next = node;  P6 {' X( L8 V/ H7 @6 o' X2 x
            EndList=node;
    + B8 b0 V: N; r5 K0 P3 f, v& y" S    }4 u% W9 c8 y1 Y. x
        else{3 P* L  I; b- h
            node->next = HeadList->next;
    ( O2 C% v) t! v, X$ x        HeadList->next=node;
    ; P: V$ l6 f  {    }
    - e  u8 }3 N6 ?% b% |    Length++;
    $ a4 j0 j4 w+ a, e: }" i% ~}
    + R2 X. C( O) g3 }% R
    # F2 V; V' C% l7 Z* v& U7 q5 Vvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法 % v0 i+ X' u( @+ M* t/ t3 E
        node = (LNode *)malloc(sizeof(LNode));
    ( k1 `* J, m9 _) {; G9 c9 s8 t    if(!node){
    ; ~. S6 h% ^3 z        cout << "新建节点失败!" << endl;
    ! {9 p/ H5 C% c$ Z1 t        return; + |2 Z* E! P" I
        }
    6 R) U. U& p' n2 Y; p/ ?; ^' c1 H    node->data = num;& j% R) E& n4 F4 J
        cout << node->data <<"   ";
    7 X5 y# @- C) K. b    node->next = NULL;# C3 i, O/ v' n! S3 \3 J$ z" _
        EndList->next = node;+ W7 \5 d/ |8 P0 r- l. `3 r
        EndList = node;2 @, J/ o7 Y* R  ~5 }
        Length++; ; F# |7 J0 A7 e8 M& `- [
    }
    & o! |$ ]/ H9 ^1 o' V7 A. V' J
    , w) b! g; b6 J# d- d5 v删除节点1 P: C8 C/ D3 ]& W2 z4 d
    # ^$ d: q7 M7 {. ]3 y
    void LinearNode:eleteNode(ElemType elem){
    : K) w8 q% O0 W( x( B: @* Y6 ~+ s    if(NULL==(HeadList->next)){
    1 |! m$ R8 Y/ {/ }: C; p5 C        cout<< "无节点"<<endl;( S+ v  j; A3 c% @$ `8 ?: Q5 I
            return;
    & V6 {7 b0 S3 {5 a    }# b5 G6 [0 u' w
        Node_cur = HeadList;
    # J- O# t6 Z+ c    while(NULL!=Node_cur->next){& h! i5 g5 @4 t! S; x$ s/ H
            Node_temp = Node_cur->next; + P/ E7 e' A6 E8 `; F  Y9 N
            if(elem == Node_temp->data){. K8 h, c- O% h$ E4 {9 q$ F( A: N
                Node_cur->next=Node_temp->next;
    & p2 p& y! m1 l7 M4 S& d            free(Node_temp);" y/ Z: [4 G3 z# x, l$ [
            }
    4 d% t% ^% I9 p; f3 \9 O        if(NULL!=Node_cur->next)
    " ~4 M" q5 o% F. d        Node_cur=Node_cur->next;
    : N# H/ c1 e& w. h( d    }! h* S1 p4 ^8 G' r; I4 q% I7 C
        cout<< elem <<" 元素已删除!"<<endl; " k2 I& T! d0 \1 u3 X) r# _
    }
    ) E6 `5 y3 |1 \5 O: \4 r1 B
    2 ~7 h6 O% S" C1 x) Q显示链表
    2 @- q1 G* Y  b: v" e; ?$ G( B! f9 d" \8 e6 r) \
    void LinearNode::ShowLNode(){
    ' L( a+ w9 g2 Y! L1 `; [    if(NULL==(HeadList->next)){$ Y0 \; O2 r1 ]3 _1 t) {# B" T
            cout<< "无节点"<<endl;3 Q6 z& v2 v1 C  T. O1 A7 {
            return;
    - v. r" R$ Z% W! K3 s3 K; u    }, y9 T) {. e; I0 [
        Node_cur = HeadList->next;
      J9 f; Z3 A# J4 p5 S' C- a. ]& s    while(NULL!=(Node_cur->next)){
    # a) O1 [4 I$ h  S/ G        cout<< Node_cur->data << "   ";/ @6 R% \2 B8 s0 J/ C6 \, _! ^" z
            Node_cur = Node_cur->next;/ ~6 q* F1 C# S. v- B- T$ c
        }- w% z: O9 A9 p- u% P0 u/ q
        cout<< Node_cur->data << "   ";
      s6 G3 U0 S. u6 B2 Z4 e    cout<<"链表中的数据已显示!!"<<endl;" @) m7 O  C, I5 _5 Z/ q9 q2 T- b
    }& R1 u" M8 _# b8 f' d" v0 Y

    - ?/ ^3 A9 v+ j( Y- i" b, h0 M销毁链表% Z# I9 o3 e' E$ n  }- W
    : _0 M& R' D5 x5 ?+ O, A
    void LinearNode:estoryLNode(){
    + @# m+ K+ r2 F1 Z    Node_cur = HeadList->next; . i  X9 o" x  a6 n9 J
        while(NULL!=(Node_cur->next)){& L+ O$ g; w: w' u6 Q9 E
            Node_temp = Node_cur->next;
    , l, m2 y) A8 e) E3 T5 T        free(Node_cur);
    * [1 l1 o9 o; [" h# W* S        Node_cur = Node_temp;
      ~" m2 Q# }7 [+ _4 l    }
    1 D" D; }4 \4 {1 e, R" c' T, H" _    free(Node_temp);
    * x! L$ m1 m+ ^4 g; _, L    cout << "数据节点已完全释放!"<<endl;
    ( z# L+ `$ E. L% G, E    free(HeadList);    // 释放头节点 . f& X8 I# g! u- O: q
        cout << "头节点已释放!"<<endl; ) _" C# @6 I6 h; _+ n
    ————————————————% q! D* C8 [+ ~  x* _- T1 C
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    # @) T' @0 I) d1 }1 v, j- s& _3 p6 i原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    - g" ?* ]- s; O, Q( ?  e3 s" h) I

    - s1 v, o- O+ S% J
    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, 2025-8-27 19:23 , Processed in 0.536873 second(s), 50 queries .

    回顶部