QQ登录

只需要一步,快速开始

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

    # @, ^# v/ _5 q( c6 B# d线性表顺序表示、链式表示实现方法及其异同点
    3 `8 M2 N% Z" `# r1 r  h+ a线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    * G: j6 y  S/ F; e
    ' O: d/ {- _' v- @" Y; [: T3 w本文采用C++实现两种表示方法。
      s; v/ T$ v! g6 {# L$ L
    , l% r2 s" V4 q0 C+ N目录" h, a" n! h$ [7 R4 o+ {

    # _: R) y! h2 o. \3 P: z- }7 N, Q顺序表示和链式表示的区别:
    " z6 ^3 _5 E% K
    % e/ n4 [' y1 u创建方式:
    0 O: x5 l: ^" k: q& }% y9 }) k0 g" s8 Q: ]$ J2 q
    时间复杂度:, D8 N+ v) b+ K1 k% `1 p

    0 g: d3 t; V  }. z) D0 C顺序表示和链式表示的相同点:/ ]; S# c5 T# E( [& Q

    9 i1 ]# y4 S0 j; N2 ?, N4 f删除内存空间:
    ! M6 z  O* ?$ t2 k4 B9 G( y) C( v- a9 c. d; n
    代码实现:
    8 b: f- b. A& O4 p7 b; h8 b
    6 O5 h! M0 ^' z: w9 v  S/ K) t顺序表示方法:, l; y* {4 z) R, h6 U1 r
    : b: g+ }) D) ~3 [$ G; s0 P
    结构体定义
    $ y+ i* N7 N; Y4 u1 S- l, e! v8 ?  h/ q  d/ n0 [- c
    初始化
    ! w/ j2 Y1 C( G4 j: l$ G, q1 A% Q3 m* |( ~! c: D) ]
    增加元素
    $ Y* m$ R+ E& e+ Z  {& M
    " I+ M) C1 d* U  l9 }1 H删除元素
    , {. @- W+ \# Q* C1 @4 x- u! N3 l. \2 j- G+ C5 _
    销毁列表: q' ^& ?5 E/ b- c) y% X6 c
    , t7 y# |, L: C: j3 \6 ~& V6 r
    链式表示方法
    " q( m( `2 u9 n, W- _( T5 B: L* i
    - X) |$ L: h; A; n结构体定义& n" p* f4 }6 J5 Z
    - v/ F" I% q7 ]6 }
    初始化4 k" f- H& R" A% @9 S$ `- h

    * Q7 w; v# [1 l* n增加节点1 L2 j' l" S% o/ H2 L
    " b( n, F: l% @. k1 K! G! w' T
    删除节点
    ; a! r4 N+ Q/ L9 t
    ) c* [7 g  |# n2 {. e% A显示链表6 B1 U/ F5 g% A6 |  c/ T: M
    + o/ l( G4 z  I: p5 \
    销毁链表/ `* o, _! [" U8 K( P/ D( }4 V
    # i8 D: a7 R( \9 h/ q  y6 ]
    顺序表示和链式表示的区别:5 p4 m0 X4 H  C  x5 e) t+ m3 \# ?

    $ b5 F8 i" A1 U/ o3 d创建方式:7 w9 U4 D6 R+ H) H" }  V
    & z, b+ b; v: h0 f
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    % C7 h2 Q' n+ H9 x+ \4 r3 V0 y8 O' j- W6 c  a
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)1 |5 Z  B$ W. w$ p/ l7 o' j# `

    / u# O& M* A- @6 w链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。2 p8 p0 U- `9 [7 U: f1 h

    " F9 G. j% h$ k, J3 C- {, J1 B时间复杂度:% c) Z! F  D# i
    * P. S0 p% F* H+ |9 d8 ^
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    ( d8 f6 t& w. f6 U# n- M9 d$ C6 F# ~" j
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    $ u% s0 {5 h$ ~6 |7 J5 }) }2 J: v7 k) W' s7 H6 K$ N
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。6 N: F8 J3 i+ l, j* {! d$ w8 K

    , t( m: _2 l( _& ~- O& J0 ]修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    + J/ v2 W9 N( N! R  J
    3 Q3 D( ?6 Z. `, n: D- ~查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    ! u0 k8 W5 t( {0 |) \3 F* |4 B# m' @/ m2 D
    顺序表示和链式表示的相同点:6 w, l4 B* d9 o) _% D! h+ ?; E

    + G# B  ?  c0 a# I: G& j' a! a删除内存空间:
    & B: `4 o6 c' I; l7 t. {6 g+ _- v5 a( o& h$ d, q; V  P! {$ O
    内存空间的删除都需要对每一个存储单元单独释放空间。7 S1 D/ A1 c0 U
    / x  v( A, y7 i/ q1 P
    代码实现:+ P7 u$ X9 {% T* _/ S3 ?

    4 l# I! x8 }+ `  L' Q* Z顺序表示方法:; N6 k7 V, M% S3 T, Z5 A- K+ ^9 L& ?
    9 x% [9 U, Y. B' K3 x9 t' o' A
    结构体定义
    3 j4 G2 p7 Y$ c- \1 H/ m) [' g9 P$ z( d/ Q* U
    typedef struct {
    4 O5 z' `  ]* J    ElemType * elem;5 f5 ^; _2 i& k0 q
        int     length;        // 线性表的现有长度
    , w4 A/ p8 H- o+ g" ?5 D    int        listSize;    // 线性表的最大长度
    $ z& @! c9 D3 j; l6 J7 A}SqList;
    3 o$ u& i: S/ [; v" d& D
    ' P. Q" c9 n" I初始化: ^4 l! p' `, T( [1 k( S

    * X7 i1 E4 N0 G5 W2 E1 s, Xvoid InitList(SqList *L){
    8 C/ x% q: J+ C8 S    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;; \7 h: X% r- y! m% v
        if(!L->elem) {
    ; |4 g7 c/ {+ M- d& Y  t3 M" y        cout<<"申请空间失败!\n";
    ! g+ G7 D$ s8 B0 C$ `- u) g$ m. N        DestoryList(L);$ ^( U7 T7 S+ s. {8 e
        }' z3 h4 G7 p3 y% i
        L->length = 0;; M& A, y4 U6 y& c$ M
        L->listSize = LIST_INIT_SIZE;
    4 ~4 M, L% G9 }    cout<<"线性表初始化完成!\n";
    , s6 m, w* R* m+ d' a4 o* b}
    & e' U5 O6 S8 F* z; V( z
    ( B7 D0 P4 N* X6 V: ?增加元素: A# ^9 o9 {) H) o8 B. K

    : Q( {! v) v' y2 dvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素$ ~" U7 i+ w- f; a* Q8 H% N, v
        if(L->length>=L->listSize){
    2 b6 u  ~1 y; s* f, a; u+ g        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    5 @6 {5 A: Z/ r2 Z' c; K        if(!L->elem){  I1 f  S; q. ~: x
                cout<<"增加空间失败!"<<endl;9 [+ y8 @: F. t- b. d
                DestoryList(L);5 D( L: h) E$ Q/ s3 B) i- A
            }
    # }0 C  k( z5 R' Y2 J1 T" c- X    }
    1 v! q) }- k' @3 K. s! h& u% M    * (L->elem+L->length) = e;
    ! b* c" V6 j; F) }$ y7 e) j    L->length ++;    5 `; J0 a8 X6 g7 f
    }* D  G9 V7 [" Y. d

    3 l, d; ?% F8 ?& z) Y: e& hvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素; B; }8 W$ y5 a6 S, V9 n" w" M- o
        int i;
    + h0 Y% S* V7 n9 O    L->length++;
    + Z5 T: Q8 E2 V3 U8 \3 H    for(i=L->length;i>=e_where;i--){
    $ S& j0 w" @$ j        if(L->length>L->listSize){
    ( I( s; B; ^* y; c3 b: e3 S            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    ' \  h* z# ?* F  F, @            if(!L->elem){- f# [5 R5 {, w" U) w; @
                    cout<<"增加空间失败!"<<endl;
    % i/ A1 r8 E2 y6 E, B                DestoryList(L);
    ! \! S. m$ x+ x& s# `2 K/ E            }
    1 V$ m  M7 K8 M! E" p8 U4 j        }& z" x& t6 V2 {8 S7 P& e; A% o5 d' t
            *(L->elem+i+1) = *(L->elem+i);        
    2 ~- b: |: v, a    }1 j2 C$ b% H, v- g& O  b
        *(L->elem+e_where)=e;( }0 E# U( U: I) ?: l
        cout<<"增加后的线性表如下:"<<endl; ' S% N. \% y2 E: B, C* V6 X6 i
        ListShow(L);, Y( l# A8 y. Y
    }
    + b- \% O1 b4 u+ C: ~
    ; f9 V# ^# ]; w% N9 L' q* H% d, L, U; tvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素9 t2 ]2 ?3 t1 Y8 U$ \0 S
        int i;) @& }# ^# s" D$ Y) }( \5 I; v
        L->length++;
    & f4 N( k( X; Y* a: l1 m5 t# _    for(i=L->length;i>e_where;i--){
    ) O' \9 Z$ O. |, A  y        if(L->length>L->listSize){
    ) A8 j& b, A. X  B" `1 p6 u            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));6 G9 Q4 B/ q/ U& Z* b) x# F, Z
                if(!L->elem){; f1 o( L5 H6 G
                    cout<<"增加空间失败!"<<endl;/ S1 ~) _1 s: u9 N
                    DestoryList(L); - n7 r) ?5 ?' c# E; ^% G
                }' c; ~. U- X3 L; {- C  G
            }
    # z; G6 T3 g1 C% A, @        *(L->elem+i+1) = *(L->elem+i);        $ I  J7 \5 W! t8 T. B! S7 ^9 _  H
        }2 R) j1 l% t* l
        *(L->elem+e_where+1)=e;; _" j# h* B4 k  t
        cout<<"增加后的线性表如下:"<<endl;
    . [. U3 n' m1 G2 k) j    ListShow(L);
    4 D* I9 z; [5 |9 W# t8 Z- r}. S0 p# ~1 v$ \( |, J

    0 X3 N4 @. x* I删除元素
    1 I: j  A% K2 i
    : q, l5 i& e$ {2 wvoid ListDelete(SqList *L, int e_where){    //删除某位置元素
    ( s! z  E" ?, E$ h4 ^. o# `& H    L->length--;/ [) `9 |. [6 Y* t1 v
        for(int i=e_where;i<=L->length;i++){
    / d" `, M" x. v        *(L->elem+i-1)=*(L->elem+i);
    & _' `, x+ |2 J" o; e8 Z- p    }
    2 ]  o& |/ B- v0 f9 h' i    cout<<"删除后的线性表如下:"<<endl;
    # Z9 \; x; Z* i* f: p    ListShow(L);
    1 D) S, q+ x4 M: u% W4 j' Z}
    9 @1 ]* _" a( r
    6 M0 u! G- r5 D. M; u销毁列表4 {# b" p4 b2 w, F
    ( A; j0 M+ p8 o% P) h& n
    void DestoryList(SqList *L){" b: _+ Q9 o4 Y. K8 I- l
        int i=0;! v5 E8 A# F+ _
        for(i=0;i<L->listSize;i++){% y9 r% H, |; I; m; h2 @7 ]
            free(L->elem);9 H+ U( b  Y/ }, }
            L->elem++;
    ( e- m$ t7 G$ Z; q% G; o5 U    }
    8 g0 {0 j% q, Q" ^3 r" ~    exit(0);        ; v% R( ~4 Q2 H0 L7 x
    }
      E" ]- ^2 D7 @
    " l9 y8 Q1 L2 f2 p7 F链式表示方法
    7 ?7 t3 S2 `% K% U% N- Z- ?3 x4 n
    结构体定义; [- q; t. N% M" ?

    7 T2 y: Y0 N" O! t$ U( j: ttypedef struct L_Node{, k) e) f- `4 m5 j" ~4 p5 W
        ElemType data;% y1 S7 s  ~6 S+ o! K
        struct L_Node *next;
    4 E% l6 P3 t7 Z0 A5 W2 U    //struct L_Node *last;    //增加可变成双向节点
    / ]( ~3 L  x1 _& {' s$ g3 [+ F}LNode;. |) c' S, \+ q9 u' V. l4 I* B8 s
    7 ~) ]/ |7 S4 u, z
    初始化8 @2 Q2 d% V9 W0 c; K/ u! u

    . P$ F( y3 ~0 x3 Qvoid LinearNode::InitLNode(){
    * z) x) @. N3 S" e9 e, t    HeadList = (LNode *)malloc(sizeof(LNode));( O. O4 M+ ~4 {; z6 H" D
        if(!HeadList){
    5 f( h3 ]+ x+ A  |) q5 s# c, h        cout << "初始化链表失败!" << endl;
    # i" A0 d( j' g- l" h: Q% z        exit(0);
    2 P3 F) F2 B6 R" @7 ^4 a    }
    % e. l" C: A: Y. f& G    EndList=HeadList;
      |2 w% {8 m. \. ^    HeadList->next = NULL;) o9 U. b1 g! w- ~
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;4 {0 u# M  r! r% i- v% @$ Z' O
        Length = 0;$ o# N8 U# ]9 b! p' e0 O$ K
        e_where= 0;
    , A, ^+ S, {0 ^% I$ R# y}
    , M1 l/ R& q" M4 V/ m- y- h- s& D2 B
    增加节点
    1 i0 p2 }2 @/ f; \" j+ L* s6 L3 R3 C6 D* s9 _2 M+ L
    void LinearNode::AddNodeHead(ElemType num){    //头插法
    2 y1 m8 J! f2 M$ n) |, @( H, O/ g    node = (LNode *)malloc(sizeof(LNode));
    * a/ d$ O, J% C; y' Y    if(!node){3 r1 X1 u2 ?  ]7 U' r1 X
            cout << "新建节点失败!" << endl;
    ; N5 e0 @5 i4 Y3 s6 |7 t- S        return;
    % [' [; i6 d/ }2 z5 r) H    }
    4 h/ d) b1 V9 V' ^7 j+ \    node->data = num;' v6 I2 c$ j* ~. A4 U6 r5 F! D1 i
        cout << node->data <<"   ";
    & k0 b- ^2 N: R  c( U) ?    if(NULL==HeadList->next){4 q3 n* z" D! w! x/ U
            node->next = NULL;: u4 y; M9 m6 k5 @& ]5 d7 H
            HeadList->next = node;
    4 e& _1 w2 ^. l$ D        EndList=node;& j: D& ~0 Q7 Y- m( `; d1 O
        }
    - q( T3 d# ]: n8 c: e    else{' K+ ~: g( ]( S. r( R8 \
            node->next = HeadList->next;
    # n+ t3 q: }+ k; z8 B        HeadList->next=node;
    ' v7 j9 z1 C/ z+ l    }
    ! j1 w$ E! ?3 b9 C* H, w  Z    Length++;
    # o1 I0 m$ F! E4 y" i}
    8 {2 \/ c1 L/ b) b7 F1 k4 K! W2 t" W7 L0 W9 X2 d$ ~
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法 2 _5 j6 M" K* R' _
        node = (LNode *)malloc(sizeof(LNode));. K7 r& S$ Y4 \; U& J0 @% G( ~% w
        if(!node){3 f; k& U  {' l; s2 F
            cout << "新建节点失败!" << endl;
    7 ]8 M6 H0 l6 o2 ~1 _4 r2 K! V        return;
    . q1 N( L6 _' o  j7 l& \" u, f    }
    2 `% M0 Z/ S5 M: D. F, J    node->data = num;
    . k  ?! r$ p% i6 z    cout << node->data <<"   ";
    0 x5 Q, M  p7 d! @0 z0 d    node->next = NULL;
    5 `6 `' }: `, X* ^2 N, J    EndList->next = node;* x: A# T+ _! n4 y0 r4 Q7 l0 i
        EndList = node;# B* _& v- H6 D. b0 E# @
        Length++; $ e; ~5 Z3 ^/ D
    }1 F% s+ j9 A, }- \. w" `% ^5 t. P

    9 S9 D& D- u$ @# e1 J7 Y删除节点+ B& s1 w! w; @7 Z+ q! X

    8 M, g/ P; R7 X5 h4 ivoid LinearNode:eleteNode(ElemType elem){% s1 e* ~3 `0 f2 [9 E
        if(NULL==(HeadList->next)){# U% `' e' O1 a: N  E* C! X
            cout<< "无节点"<<endl;7 F/ l3 D" I- h9 j# V% v
            return; 8 l7 S9 f7 D* h( F0 r2 {
        }, k$ h) S# o  [+ r% {
        Node_cur = HeadList;
    - {4 r6 X+ l; m; i    while(NULL!=Node_cur->next){8 o$ Y1 B- H' W8 {% z
            Node_temp = Node_cur->next;
    2 q/ C6 G+ _# |" O8 I" A1 j        if(elem == Node_temp->data){% ?: u, M4 U- c' y* g
                Node_cur->next=Node_temp->next;" O7 h8 G3 X7 \5 ?! {4 _0 t
                free(Node_temp);. `% ~, X% x. [9 m* V
            }$ K5 i7 y0 W3 x: q: j
            if(NULL!=Node_cur->next)
    ; b) h) Z! D. ~+ J  D% O( K3 c        Node_cur=Node_cur->next;* y6 a2 z7 U+ C  f: A$ V
        }+ o$ ?7 a! A7 X
        cout<< elem <<" 元素已删除!"<<endl; 1 {" u3 Y& S1 o4 W
    }
    ' n1 l7 `7 H  _
    7 m5 x7 R% R  S% X8 ~6 b4 j; L" v0 I显示链表  D& l4 q$ d: {. R( V# l# ~5 A

    . @2 }* {% `; Z0 f5 k9 l# ?void LinearNode::ShowLNode(){
    ' a$ `; T5 A2 ]$ o    if(NULL==(HeadList->next)){
    5 o* F) p1 f% `7 W7 d. I% T' a        cout<< "无节点"<<endl;+ h9 f0 j3 w  ^/ Z4 @
            return; , I+ F6 X+ `3 p: Z5 |+ ~3 ^" t$ r8 n
        }8 k1 Z1 K# f* a
        Node_cur = HeadList->next; # q# T8 R. a, F/ Q0 j' c! d# s0 A
        while(NULL!=(Node_cur->next)){' _* C  P" I0 K, m: c5 R
            cout<< Node_cur->data << "   ";
    3 |- v1 P. n8 S% p" T4 ]8 d) L        Node_cur = Node_cur->next;# \, X% m+ v/ L) P
        }8 y% ~3 |6 L% h# Q. w
        cout<< Node_cur->data << "   ";
    3 o4 E8 p1 k- B* @* ~    cout<<"链表中的数据已显示!!"<<endl;
    $ y5 L! ^1 w, {% `; J4 {4 u$ z}; A9 V: S9 m# h+ V$ w

    ; f& E' R5 W* p7 y销毁链表
    1 Y' J' C/ L+ t, ?
    7 n; c8 q9 v: g6 Qvoid LinearNode:estoryLNode(){
    7 P& Q6 \1 _2 H$ f) Q# Y; R. [    Node_cur = HeadList->next;
    # Z) p' ?6 S& w( e" e( k' S    while(NULL!=(Node_cur->next)){
    : [; r6 c: F/ Z        Node_temp = Node_cur->next;
    ! _6 ^' j: h' t        free(Node_cur);: {$ H; L; n2 n8 `) u" L
            Node_cur = Node_temp;
    , E. k! H# {8 D' ^    }
    + Y& _% `0 l3 T  `    free(Node_temp);
    & I$ P( w1 L# K$ S6 g    cout << "数据节点已完全释放!"<<endl;
    5 F( |8 l9 t4 ]4 H( d' j    free(HeadList);    // 释放头节点   W1 m+ E5 s: a* m& ?! v
        cout << "头节点已释放!"<<endl;
    & e: @; u8 [$ Z————————————————. c8 v2 g0 y9 @3 P3 I) s6 V- m0 i& c
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: B: e9 s3 m# S5 ~; z
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286  r. W) M* {' N0 B  E# Z6 s
    * o$ T4 z% W5 z
    5 j; A) ^3 J$ B% V: d  u
    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-7-28 02:51 , Processed in 0.398090 second(s), 51 queries .

    回顶部