QQ登录

只需要一步,快速开始

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

    6 E$ B0 h5 K" p线性表顺序表示、链式表示实现方法及其异同点
    8 q" [' ]" D' ~) p6 e3 y线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。6 y$ a2 k5 x; T  Q$ G! i/ j( a  \
    : \" E, ]/ T3 f( i- G
    本文采用C++实现两种表示方法。
    7 N8 T* J/ O! H4 N5 z: P5 P/ x! p4 y( Y& u! f' a
    目录# W! i( |7 U4 O4 m" C% G
    . T. k# y( O8 ?: u
    顺序表示和链式表示的区别:
    ( C) j: ~! S$ n( E2 Z# E
      D+ ^3 I5 j; J  Z5 x创建方式:4 E6 @" `( S. M7 P/ Y# W# Q# u$ _
    : S4 g. T7 J- n) t6 u( \& v+ a/ k$ W
    时间复杂度:
    $ F9 v# v' a: j5 v
    $ G( l) l6 M3 ^: f7 F. F顺序表示和链式表示的相同点:9 [; D2 L: }2 j" Z8 I: y6 {& k! }: W7 V. `

    . p/ a1 ]0 {/ _& o. x删除内存空间:
    4 Y% P' o2 }' p  _
    4 A: Q0 s& n4 z8 r代码实现:
    + |* F1 b9 P: G8 J
    - ]! \) l5 M4 h顺序表示方法:
    7 U. [! F$ M0 E. w3 x% ?2 t7 q# O9 T- R; ^
    结构体定义
    9 Y/ m& {7 H' t4 w" ^! I) ~8 \% n5 O4 v' f6 c
    初始化
    8 F5 [5 D$ _  J) _9 }) Y" D4 ^' ]9 v  C6 ?9 V
    增加元素% c+ \: N; D* n! Z, q7 @" Q% ~

      i  x' y" y$ l0 j: s删除元素2 ?- i  I1 r  k. o7 b$ D

    6 q3 q. o6 u" L' D: g5 h& _销毁列表
    4 X9 x# x' E* J! c- U* s/ J: t8 A
    3 I1 y9 k# N1 A  q! A. C链式表示方法
    , d% F" N$ y# Y) _# X# f* g
    % @9 D* K' [$ k% ?结构体定义2 n0 J) d3 W7 }5 F- N! e

    / h& }7 O. K! b' e* ]. [初始化
    ( v6 ?9 k% n0 B0 ?  {3 D2 A8 h$ L6 U: r
    增加节点
    - {. j: d7 S7 `6 Z; g6 }  Y% r& _6 m- _4 S/ _6 d
    删除节点8 l& E3 O% C" _" K& g

    $ \2 n$ N6 r* q2 T0 R' Z显示链表9 G# S, b" Y8 C6 Z! t

    / x( K8 W) m1 R销毁链表
    1 v9 X% E( J2 P3 R$ ?  M2 J; W
    * e, h$ ^- |9 U* u+ N顺序表示和链式表示的区别:
    7 W3 \7 Q* I- f- \' m$ H8 ^
    ; X+ K, w% E. z创建方式:
    4 q* M/ h+ e6 e& I$ t- f$ r% }0 P+ K
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    ) E1 A+ f8 x1 e$ K: u) T4 i; e4 h7 Q$ H& c" p# R0 I# V. z6 d
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    7 A  d5 S/ |4 o$ m
    ' k8 g6 c6 S& A5 u* F' a链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    ; D1 M; Y! V$ Q3 p& \
    # }. s3 v: q- z时间复杂度:1 [* ~, x: t. k1 u8 k/ I
    ! v0 P  j6 L6 C6 ~. K
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
      T* r" G7 @  M* t: F( N
    $ O) K; l7 {& b. v# t增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    & T/ {7 `, |. }5 o0 i% i; |, P
    3 J4 Q. G4 i+ z- v: D. W  ^( UPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    ' o. S3 r: O0 [5 l3 f
    4 Q. |$ ]* m! E修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    4 @1 k; w" U* N6 j" B) g4 ~' {0 }8 L  K( t6 o
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);3 D1 T+ T# N+ M1 J1 \: X+ e
      g! p% k5 f1 S( Z8 J6 W+ K5 p
    顺序表示和链式表示的相同点:
    6 ?. \# @& |' a) X. [5 ~& z8 X; U( W0 `7 L
    删除内存空间:2 T* L- S( k! S7 B4 i" Y

    / e7 m% X- [3 K. }+ E内存空间的删除都需要对每一个存储单元单独释放空间。, x5 f, W0 [9 r, I

    # B7 F' L6 i1 T  i* \代码实现:; I9 O+ b8 B) y
    6 `+ e) @( y+ c
    顺序表示方法:1 M& c0 G! G; X
    ( `9 |3 ?2 b6 c  n# n
    结构体定义* e; ?5 Y9 n1 E6 s; K
    1 Q6 m8 {; A) E1 q! @. H# g& F
    typedef struct {; Z0 U- Q. i3 n: S' J9 L3 P
        ElemType * elem;8 Z! F0 B  P; J4 t2 ]) v* Q  `
        int     length;        // 线性表的现有长度
    ) E3 i8 f) F( q6 E/ h4 M# H7 c5 `    int        listSize;    // 线性表的最大长度+ I) F8 O' z2 z# E, I# g: Q
    }SqList;
    ( O" ^, K% h4 |" ]6 e1 Q5 g8 x: _7 S* d9 K# o
    初始化
    ! q6 a3 f! G* |
    : E8 Q; x% s2 S- o/ u& m: L2 f% Svoid InitList(SqList *L){
    4 g4 z, m8 G& F+ J# i/ b' e5 Y    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    6 O6 b8 Z. x' v! h    if(!L->elem) {
    ' L( W, G6 y" J        cout<<"申请空间失败!\n";4 k. o* D$ {3 ^0 b; S; `3 J9 N! G
            DestoryList(L);
    4 l' n. Q6 D7 r" e    }% D* j* G$ m1 k1 \6 y+ I. C
        L->length = 0;$ |: b# W: J5 X6 @
        L->listSize = LIST_INIT_SIZE;% L: ^0 b/ {4 V
        cout<<"线性表初始化完成!\n";
    ) h1 V+ k, {% ]* L, C/ @  C}0 D  }% ?3 y: P+ p7 U

    , K3 Q  p- Z7 }; S增加元素
    5 D1 p& ^: F4 i% `. T% l$ h. L/ q: b! l& }$ ^+ W4 `
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    2 T. [4 }4 N4 M! [( n  L) o+ [    if(L->length>=L->listSize){; O" a2 m6 A5 g- E0 L6 A7 g
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    8 Z; r  Y/ i3 @$ i( i/ D        if(!L->elem){
    & g6 C+ S# Y7 H. M8 f3 x% r            cout<<"增加空间失败!"<<endl;
    , s; |! t# ]+ D. q            DestoryList(L);
    6 t0 o, Y& x- `! r0 V  z        }. i! ]; B% ?) k; g
        }
    / @) V$ b/ V7 Q: }    * (L->elem+L->length) = e;* y, J- i& `6 E) t! ]+ o2 a9 c! B
        L->length ++;    9 y* L% U  |$ M+ [  T5 q3 a. F
    }: q. }1 r; v/ l+ d  Z4 X$ Y$ E

    ) n4 |8 ?: `6 K) n' c/ Ovoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    7 }# u; Y( ~/ r' t' }- t) J2 ^    int i;9 F$ E" u8 T* F% k7 h- {2 y
        L->length++;1 ~0 N( x& s0 k) t  l/ t. s6 R
        for(i=L->length;i>=e_where;i--){
    % Z# _2 ^  `/ t4 H        if(L->length>L->listSize){, t) V! r3 v1 P3 M
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    0 ^. v4 Q7 n8 }! H            if(!L->elem){
    ; J- _/ g7 `+ }# Y$ p) w                cout<<"增加空间失败!"<<endl;8 P4 T7 }* i& T. T6 a  s7 H& Q
                    DestoryList(L);
    + u- \! b1 J* k% Q) x0 t0 Q2 a            }! H+ N* Y4 f! F( G" M
            }: ?% J! o5 G  H
            *(L->elem+i+1) = *(L->elem+i);        
    % M0 z1 {/ K" }& A& y# t    }* Q. X, [- K. f1 b8 N
        *(L->elem+e_where)=e;
    7 e; r/ O0 X1 |7 j# n& E    cout<<"增加后的线性表如下:"<<endl; , Q. O. B4 W2 D
        ListShow(L);2 _0 Z: Y- z+ e; w! j0 }7 d3 A
    }
    0 K" H: l' ^5 k4 Z/ f7 Q
    6 s" d2 A, U2 X' k9 r* w& G5 G2 svoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    3 t, v; V: ~2 t+ S+ F, C    int i;
    - x% o$ K6 J0 c/ {) t* s5 S    L->length++;
    , a3 \5 A, M8 e# {% h; C2 F    for(i=L->length;i>e_where;i--){( n+ p; ^5 J0 v6 u+ A) Q- s
            if(L->length>L->listSize){
    / V7 f) M/ Q. B1 f# C            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));" s& W7 |/ `$ J: {' t! U% i
                if(!L->elem){. B7 X1 Y3 S- T- V; z
                    cout<<"增加空间失败!"<<endl;+ H$ V8 w" m  ^2 e+ ^- d2 Z/ d/ p
                    DestoryList(L);
    / ]: p1 K) N/ g6 `3 Z$ l( T            }  j/ A$ y( Z5 T7 Z* K! u4 L2 H
            }
    $ O4 k9 x9 ^, R/ V/ K        *(L->elem+i+1) = *(L->elem+i);        1 w0 e- t9 v' k1 ]- G# P1 X0 d
        }: `/ J6 ?& _1 p6 x% o+ h  Q
        *(L->elem+e_where+1)=e;
    % p. U1 M% `& x$ h# m; h    cout<<"增加后的线性表如下:"<<endl;
    & R5 ]0 s1 q1 Y* ?    ListShow(L);
    ) J- Q4 v1 Q+ g0 p3 H( B# ^}
    / C; Y+ x- v/ ^+ i1 B, Y& }
    % I5 I# Z1 v% i0 {5 F% |: s" j删除元素
    ) A6 R7 \; ?$ M9 Y' p/ f& _" C% e5 m' x- k+ B% S
    void ListDelete(SqList *L, int e_where){    //删除某位置元素 8 t/ }4 d) F/ A3 O: G/ D7 L! ~1 W. J
        L->length--;: D$ Q9 Y4 e2 b) v# M
        for(int i=e_where;i<=L->length;i++){) F$ }" C6 H; d0 |0 |  I: ?( `
            *(L->elem+i-1)=*(L->elem+i);
    % R: R9 a" h0 @7 J    }4 b' |. W: G$ m
        cout<<"删除后的线性表如下:"<<endl;
    / c/ u, |( @$ S2 T9 {0 e4 S' U    ListShow(L);
    : r$ o& f, s3 b5 Z' g3 ]( ?( G}
    ) o8 k- ~. p" R7 \# Q! f3 c# z% K$ g" E+ b
    销毁列表1 G( n5 G2 D+ q3 ]; q3 Y
    5 v. D8 I5 U2 M: L
    void DestoryList(SqList *L){% l$ E& F! I4 ?9 H+ d# ]
        int i=0;) i9 c9 _- J( S0 o$ C
        for(i=0;i<L->listSize;i++){
    ' \( c2 U9 i5 V( H4 R        free(L->elem);
    ' d- u) O2 X* k  }) f- _# e        L->elem++;
    9 o0 J, x: _. E% B+ h4 U  m    }
    7 m6 r! C2 X" _4 G3 W, ^( S& O    exit(0);        
    5 U# ^  i4 c5 j6 `& n: i}
    # I; o- Q  E5 g3 r
    # I- j2 a: C  i5 K7 L$ q链式表示方法
    $ }6 D% m6 v3 S) G5 k3 W& G% X
    4 U+ |3 }" M$ h0 V; t结构体定义
    * d$ _; m/ }; G! ]5 D8 I0 T$ C$ }0 E( L6 ?" `8 P9 N7 ]+ M
    typedef struct L_Node{, G# U# ~3 u/ K0 i4 ?7 M7 P1 X& B' C9 I
        ElemType data;
    * Z( s2 c0 ?; V9 L) ?' I; O$ t4 R    struct L_Node *next;
    , L) I4 r7 B2 A# E    //struct L_Node *last;    //增加可变成双向节点
    2 Y& S+ i. Q+ x/ }4 d! u& h2 ~}LNode;- ?# [7 A; t, G' `: `5 s# g
    1 S9 _+ f# }% m# v
    初始化
    & W* N6 ~( R, A% f; x, A/ A1 w% G3 I( s4 W% ?8 a: `" g4 q* M9 K
    void LinearNode::InitLNode(){3 r' Q; ~6 g" ^3 E
        HeadList = (LNode *)malloc(sizeof(LNode));
    % }! P  k% p" e( r! \4 b    if(!HeadList){
    . u/ A. U# V- |5 Q, K( w  m. b. V        cout << "初始化链表失败!" << endl; / Q9 }# n2 b# R# `! X
            exit(0);
    $ \: ~+ a, ~) R1 v, S, H0 z    }
    ; [# ?' w: z4 L. z) W8 ]7 S9 a    EndList=HeadList;
    , h# Y+ Z: i( E1 ^9 X% i& \& G$ H, K& o    HeadList->next = NULL;0 J: d/ i; A5 |* Q' f
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;$ G9 p( Q2 d8 Q0 f, Q
        Length = 0;4 |: A- X8 p' G
        e_where= 0;8 q$ P, F$ A, g! m/ c' ?1 g3 v
    }' n3 m2 m* q+ b$ e8 Z, m
    1 g5 C) d: M- Y3 K
    增加节点) P* n( ~2 g9 Z  O

    5 A! {5 I& H! Y9 j6 r! Q# O( b5 A. C) D% _void LinearNode::AddNodeHead(ElemType num){    //头插法 / {7 {1 x4 ~: ^7 Q
        node = (LNode *)malloc(sizeof(LNode));
    & i6 H! k$ P" A# x8 c    if(!node){
    ! Q$ L; J2 d, ^4 |! u% z: b        cout << "新建节点失败!" << endl; ) N8 V, J0 j  A
            return; 9 T4 u7 Y4 X/ O' B2 J- [: c/ I
        }
    ( J! }7 g) U4 r0 j0 J9 V' c    node->data = num;/ T  b# @; \: U- n- @0 v
        cout << node->data <<"   ";* g6 ]$ A% ^" ?$ h, N1 [
        if(NULL==HeadList->next){
    , ?2 `6 |6 p* w        node->next = NULL;
    , T5 L1 g8 @! l7 z- a4 w        HeadList->next = node;6 r: G' C! l( e& ?, X7 F7 |% B# A
            EndList=node;, S4 E2 C' u, G4 V  Y5 H3 L7 ~9 r* a
        }
    8 `1 |, Y% @  w+ o% ^+ v    else{
    & w6 D# {$ y  G" d/ B/ p2 d, W        node->next = HeadList->next;& f0 A& t0 L* b6 y
            HeadList->next=node;: P. u: K0 b' x0 ]
        }8 j' R) n! v& n8 a
        Length++;
    1 N+ z3 [' d; U9 X+ a$ f7 ]}0 C: f8 z* N. H4 y$ p

    ' r8 p5 c6 \, t+ V2 ?/ y- ovoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    % j4 k* n) B( W& s: p    node = (LNode *)malloc(sizeof(LNode));4 w' n; ^0 m0 n, m1 [* K
        if(!node){- @- `) D9 G$ t$ V
            cout << "新建节点失败!" << endl; & b1 t! O; ]( o: X& e9 n$ r
            return;
    / P$ x7 g' c, R    }
    & [$ N0 o8 h& x& c1 U8 ~    node->data = num;" h) s  I7 Y4 j& {% H
        cout << node->data <<"   ";
      q+ f: W7 b; ^( E$ ?6 Q    node->next = NULL;) P% G5 o3 t' ?7 o6 Y% d
        EndList->next = node;8 B7 X9 T% V* w% o* c1 ?+ a: t
        EndList = node;) N2 t& I9 a  i4 j
        Length++;
    $ u4 ?* V6 n7 F& M1 X+ T}3 \6 |% ~# q% T, [3 u8 N

    + I& f% L  ^  P4 m/ i4 j0 ?+ d删除节点; s! s0 l; z/ H& Z

    ! X: S: E/ h) ]4 ^$ pvoid LinearNode:eleteNode(ElemType elem){
    ; M7 c0 Z3 t' w( N; m  N% |  I* Q    if(NULL==(HeadList->next)){6 {* |1 ]& e5 {: r
            cout<< "无节点"<<endl;
    0 @9 b* L/ S( a3 N5 x5 e5 x# p        return;
    ' T( ^5 g3 l! A1 I* i( w    }. ^* _/ E4 I; O3 F
        Node_cur = HeadList;0 o) Z! b% s" V  f  W
        while(NULL!=Node_cur->next){
    6 e* Y4 }6 k; |7 r) q$ d; {        Node_temp = Node_cur->next; $ z9 u8 @5 D- A
            if(elem == Node_temp->data){
    & |3 }; C& i3 F& J. v! p( w            Node_cur->next=Node_temp->next;+ G, a3 w% }* k5 b
                free(Node_temp);
    0 @* g2 c! ~- H; z6 U$ ?        }
    : i5 y5 ]  o8 y        if(NULL!=Node_cur->next). f. E5 Z9 J8 g9 n' E
            Node_cur=Node_cur->next;( ~. B* y# u5 H2 ]* P! b# W
        }: }. E) D% j  |' Y
        cout<< elem <<" 元素已删除!"<<endl; ) F. B7 s+ R. p
    }
    8 k0 y* j. `0 U% z! r: b* l
    ! ~" N7 _& g8 C; f显示链表0 v- p; D5 T8 Z. o8 \
    ' P* |  ]+ t7 J
    void LinearNode::ShowLNode(){
    . w$ y3 g; K+ |    if(NULL==(HeadList->next)){
    % ?! q% A. d2 d, w! k        cout<< "无节点"<<endl;& o% Q# ?/ `( V+ W7 m8 _! l! U
            return; 2 J, e( Y0 W8 i* K1 Y( |
        }
    5 C1 ?, ^+ t4 S6 U. s3 V. R/ c    Node_cur = HeadList->next; ) h0 d* j! A3 W% b' E
        while(NULL!=(Node_cur->next)){- n& k' F; M" _, E
            cout<< Node_cur->data << "   ";
    3 e, a$ @$ @  c8 O        Node_cur = Node_cur->next;9 Z7 b5 x; ?- W- `$ r6 U& V
        }
    . d6 Q  ^4 H0 J& j, G0 ~5 T) H    cout<< Node_cur->data << "   ";: ^# {4 Y" ]( s8 D' E9 \5 W, B
        cout<<"链表中的数据已显示!!"<<endl;
    # N- o: ?4 a" f+ G9 K3 N3 `  O}
    * Y/ N3 V4 ^9 W- i! F6 I; m
    3 d: r4 b! D. u' v$ @' P4 s" t( y1 `销毁链表. P6 H* a  F) R0 y9 [
    + c/ s$ H5 S, Y* A$ u
    void LinearNode:estoryLNode(){9 V$ @7 ~7 g* p: P7 G5 [7 u
        Node_cur = HeadList->next;
    : i, |7 E, H# J+ s. s8 X    while(NULL!=(Node_cur->next)){
    , ]; c' g+ ?# d/ a2 Q        Node_temp = Node_cur->next;
    , _3 p7 R( f, Y! s6 j  R        free(Node_cur);7 {0 w7 j3 R6 [0 W4 G
            Node_cur = Node_temp;
    , p, |0 u; F. f/ U0 W- h8 [5 U    }
    3 L  @4 t0 S) ?( L+ }9 f    free(Node_temp);. }8 B# B5 i5 e0 D3 o
        cout << "数据节点已完全释放!"<<endl;
    8 q) R6 `/ @& {- K; a) p    free(HeadList);    // 释放头节点
    * W/ T- X" I& Q/ r2 e    cout << "头节点已释放!"<<endl;
    6 J) z; B& p; v3 w+ a" Y8 i* X————————————————9 k7 a  X8 f! f' L2 k1 `
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ) N, m  p% }, y+ s3 V  Z& ^2 ]7 E原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    ; e; j9 ^3 l+ S5 }5 |) f- `) @) ?# F3 ~6 i1 I$ T& P# I
    2 l7 e$ F9 M1 O9 d; `- 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-10 03:23 , Processed in 0.431501 second(s), 51 queries .

    回顶部