QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1575|回复: 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
    7 B, f3 [8 L3 F) k9 x/ g, s: A: q2 o
    线性表顺序表示、链式表示实现方法及其异同点6 E; g( H& M) f: L. P) j
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    $ k) \# Z* c* l& I; e) v- i$ }5 Y6 b! }( g* }) h
    本文采用C++实现两种表示方法。
    8 u. @! v* ?6 C: [1 C9 U
    6 e8 J' |, ~! Z$ c* J8 H目录
    8 v+ s$ f  w  O5 N: q; P0 v1 Z; l5 O# u8 {/ A" f6 L
    顺序表示和链式表示的区别:7 _) z. t' m) i* j" _+ |/ o
    5 I( O* b' Z+ S1 y7 I
    创建方式:) C1 F& I7 s, y7 Q: M
    # Q  k$ E+ a% F: j+ B6 y
    时间复杂度:) f. c  ^, Q! U' g8 s5 ]
    2 N) V1 ~, t6 V+ D
    顺序表示和链式表示的相同点:
    % u+ Y! ~, H/ e8 m
    # [. z$ ^5 z+ {# m; i% W5 f删除内存空间:
    4 M9 {" K& K- T9 w
    ! r$ M2 ], B8 O* i+ \8 I/ Q4 K代码实现:  e" Y( G1 d4 w, J' C( g3 w

    9 N3 `5 B8 h* a顺序表示方法:
    2 c( L! p' W5 Z. P- Q, _/ J$ R) T* H& |7 R& R
    结构体定义' H) U5 J' r# I" B
    7 D! p/ A4 [* y& U# V; P
    初始化
    ( F  w1 b; l0 V& g; @- Q7 f0 ]( T1 T. V. g
    增加元素2 `8 M9 W! c5 [9 c! w( z8 E9 K0 i
    $ ?, L* S: n& B- p4 u( p# O
    删除元素
    ' S7 Z/ q7 F$ o  N: d; w1 l& p  C( F$ |' d3 \
    销毁列表) p& t2 f% p, L6 Z5 i

    , @5 b* {! x  x9 C" N! x链式表示方法; b+ ]: ?* h7 h' k, R

    8 `4 W9 Z# c' |结构体定义5 W- o2 `- r. g0 a% U( f
    $ f3 ?5 v$ {. e' k1 L7 m
    初始化
    ; Z7 I' A' a$ L- U. l" A, v
    ( ^; w1 T+ z8 v增加节点1 @, p* o8 r8 |, Z  _

    ' Q/ T1 B4 g7 T* ^. r删除节点
    - L0 v# }4 l; E# M8 q) b
    9 q  \. Y% H. w% u! [9 T0 n5 U8 ^4 S$ P! @显示链表" R) b5 a1 L: B1 ^

    * S5 T5 @- e; V  Q0 J; J销毁链表+ f6 E6 y$ u  [, z1 x
    - Y" b( ~+ h! K" O0 o
    顺序表示和链式表示的区别:
    0 \" Q- X  `( G
    $ M% ?& S& k0 f7 g创建方式:6 E1 I! M3 F: M) q

    & g( P9 i8 ^0 Q( p顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    $ ^: R  O6 N/ Z& D  M/ x6 t6 W1 n5 o% a4 A2 m2 r6 `
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)8 \8 j# j/ r8 H1 h$ m1 i( u
    . B7 N/ M& \2 g
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    + v4 G/ m8 k3 L3 p- k8 O- G. c' W* [9 \
    时间复杂度:6 d9 p1 Q, N% B/ B+ u

    1 {: F4 Z$ [2 ~# D1 E& ?4 l& ^2 T增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    + w; I1 c. Y" \
    8 w3 P- a3 b& O; ^' Q8 X# V增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)8 K: |2 R( _* r! w" M7 x: X9 t
    : @3 `, e7 s9 t- W
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    " p) x* m, v" h1 x4 j3 _9 y
    " H. |. l0 ]( f. D- T/ ]修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    " `4 t6 Q( p( c% I2 ?! z' j
    ) ?% ?) q" W( E! M2 M查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);/ P2 L+ j4 y: X. `3 Y

    3 I& @: ~1 j4 u% O( g顺序表示和链式表示的相同点:
    , M. H. S% q8 Q- c# c1 U+ C$ A
    删除内存空间:' B2 p( v& ?3 l7 V2 c! W; {- h, X* S
    * N! R' l+ u2 T, s& @8 Z; Z, [# [
    内存空间的删除都需要对每一个存储单元单独释放空间。
    3 C: T+ Q5 u2 S" q! p) t+ R
    , G( {- {) U7 [* k& J2 Q代码实现:
    " d+ C- @; b9 _: u
    $ [) w0 f& N, j! f/ g顺序表示方法:+ J( b& w* C" o' L, R

    2 P8 h$ M, R' V4 e/ t! Q结构体定义
    $ n0 w* s% a9 h1 K" u
    8 ]4 w2 {& T' t' M2 v8 O) Dtypedef struct {
    2 z( m& H/ {5 l4 \$ n    ElemType * elem;
    ' F1 m8 j9 ?' U) V3 I    int     length;        // 线性表的现有长度 * q9 [# x9 S  \" H+ o& M- V4 d
        int        listSize;    // 线性表的最大长度4 I' k& ~$ Y  R/ y* u& g
    }SqList;3 }8 d4 ~4 P1 j, N

    ' r7 V% U! i1 i6 S& c4 z& l) m初始化
    9 E7 i9 r- \0 P) o  ~5 Z' j) ^5 N; |2 Z' E6 O0 N# a/ C
    void InitList(SqList *L){
      i$ {+ @; I3 x' \2 X; O    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    8 Z3 \' `7 V% c. x! ~    if(!L->elem) {* _; F: g6 P* h& w: |1 G9 \0 H
            cout<<"申请空间失败!\n";
    ' j$ B5 y9 A! D" l        DestoryList(L);. J# M$ ~1 f# U8 e/ i
        }
    2 J& B" R5 |+ ?- O( ]    L->length = 0;
    + ?7 C0 F- j0 u0 w3 h8 m    L->listSize = LIST_INIT_SIZE;
    ) s& e( q1 R: T5 F8 w' C    cout<<"线性表初始化完成!\n";+ C  `* |6 M$ V' r0 x
    }
    5 {) @# Z1 Z9 y0 g# `# ^2 R# u# J0 }( b: U8 o4 r2 P" b& z( A
    增加元素
    $ j1 s8 m. w" `, C2 x( D! n; r" G9 m4 E+ E/ q, E
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    1 @. ]  i$ ~4 _. m$ p    if(L->length>=L->listSize){
    5 Y. m  \1 E+ O/ Y$ U0 ~& b        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));$ l& Y% A& A5 x
            if(!L->elem){
    3 |* Q; }' Y* |8 a            cout<<"增加空间失败!"<<endl;
    # x3 ]3 ^5 ~- O+ y+ C4 s7 W3 l            DestoryList(L);
    4 E! K* o3 p0 |6 v$ G) j* z. ]        }/ M7 Q+ g8 `, ]$ b: k& S; \
        }
      @/ @+ u% {& z3 R, Y+ @) v    * (L->elem+L->length) = e;/ l, Q9 j) h* B9 p9 }  |7 F+ @
        L->length ++;    ) e# o7 g, V& O4 w5 w) t- f" E
    }
    $ O3 d% T% b! E" B9 U7 X7 u. c! J( e0 _
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    ( U0 M, i. `) \/ l    int i;6 U$ I( Q( j8 G' L( Z
        L->length++;: T# l( ~+ @5 W# x+ D8 q3 k- b
        for(i=L->length;i>=e_where;i--){9 G6 `8 G- W! M6 C
            if(L->length>L->listSize){2 l$ M) m8 K# I% m
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    6 _# M1 }( Q" B- `! \            if(!L->elem){
    5 r% }6 l9 b9 {8 s7 A. `# K, a) i                cout<<"增加空间失败!"<<endl;6 Q+ j$ {4 x+ ?7 E$ Z! b
                    DestoryList(L);
    ! i% Q) v( M0 o2 m            }0 E1 i/ S4 B# v  o1 E8 I# [
            }
    7 L5 K4 y  W! c* z6 L  i        *(L->elem+i+1) = *(L->elem+i);        
    # O( {8 x7 }2 n' I+ N' ^    }- W( F6 @7 d0 {7 `2 J- Q
        *(L->elem+e_where)=e;/ K/ X: q5 a' N  `8 f* Z
        cout<<"增加后的线性表如下:"<<endl; ! o% Z* A$ q: V  Q9 y
        ListShow(L);
    . _/ x" a, b& |* P9 |} : |& c+ i/ I3 |7 b- _
    6 F) L. |: M9 ~& ?: N. ^4 S' M
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素: f* _; N! ]  j
        int i;: Z4 @5 C9 [( W
        L->length++;
    $ T; m' C2 q( G( ?6 Y7 F3 V    for(i=L->length;i>e_where;i--){6 @. O% i. x6 |; d# Y; }9 L
            if(L->length>L->listSize){
    $ Z2 D  n! F( M            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    / K9 p( A+ h: s; M$ i2 j0 \            if(!L->elem){
    , Y9 B4 Q5 K% X8 Z# L1 x5 P! Q                cout<<"增加空间失败!"<<endl;
    7 Z$ V! \! \2 ~+ Z2 m+ P3 B                DestoryList(L);
    7 N" o4 n# D4 }4 a$ D: y: Z            }- w( ?/ N9 O5 F+ R; v! b; P# {
            }
    % k0 n5 @' x" k6 [+ W$ z6 {9 O4 ]% j( d9 L        *(L->elem+i+1) = *(L->elem+i);        
    ; I$ w1 o) j3 [% b% U9 j& H    }% l8 C# P1 L" \8 k
        *(L->elem+e_where+1)=e;3 a, t' B, U9 V0 f: n/ F
        cout<<"增加后的线性表如下:"<<endl; & Q) K1 j( ]4 r7 T) A" k# T
        ListShow(L);
    - {& D% P" ]* \6 ^" H; x3 J}
    " I' `1 \+ c5 R
    " @- b' s+ H6 s! Y  j" u- I4 @7 S删除元素
    8 l) r+ F/ V1 ^" Y
    3 P2 V6 g* E7 q5 t1 G2 ~9 ]8 lvoid ListDelete(SqList *L, int e_where){    //删除某位置元素
    ( Z3 }5 F* H/ T    L->length--;
    ) _$ ^, {* ]% Y; q    for(int i=e_where;i<=L->length;i++){
    2 x+ D0 b: y" h/ W; X        *(L->elem+i-1)=*(L->elem+i);/ u! U% c0 g! D! C8 Y: A
        }
    9 Z  a/ B1 r, C. s- ^: [/ S2 E    cout<<"删除后的线性表如下:"<<endl; + ]. w' h7 Z# N6 @9 U  H6 X
        ListShow(L);
    6 E1 a% Z4 i; s9 A4 y' R}) X) Q# L0 z9 T# m* ^. I& I0 G) r

    2 g/ Y! Z2 [# F0 r销毁列表
      \4 _, X( r$ O/ g6 @5 q  t: K- o4 r- p) ]2 f1 a- J7 K
    void DestoryList(SqList *L){* C  `! g7 S& k. u5 a& ^' w/ W
        int i=0;
    % W0 m4 j( I1 R* N' W- p1 p. p6 ^    for(i=0;i<L->listSize;i++){/ H, i1 z6 d9 _) }1 |
            free(L->elem);6 L  A7 d9 ~: U! x# p
            L->elem++;1 x3 n" H+ @' X, l4 F6 ~" c
        }5 @7 s, }6 \) q/ Z
        exit(0);        
    + \* b# s# i" B}
    # m" l4 v  L9 s# J* y2 `; K6 X0 s
    8 ?) l) ?9 W! z) L链式表示方法! Z$ S( K2 y" b: j, X! w  H
    * M2 e, Q! s. }7 t
    结构体定义4 j7 X. y  j& k/ f- M( T& ]: {

    3 ?: A1 |( N$ _3 K. Y( d, N3 Etypedef struct L_Node{
    + C1 T. S' I3 `    ElemType data;8 L- O  ]6 n( m) q8 u$ r: n' q
        struct L_Node *next;
      h  ~* g! L$ ]- \. C3 q+ K! L1 S. U    //struct L_Node *last;    //增加可变成双向节点
    % F# o  c/ I/ O}LNode;. ]+ f! [* S% L8 y0 C$ B$ n% C

    ( Q; O, }- |  W' ?2 ^初始化
    % s' o3 K* `6 c- a4 P5 B3 Q9 m0 X6 y0 h- \/ A
    void LinearNode::InitLNode(){
    1 R/ W  Z+ M1 @; C0 C( c    HeadList = (LNode *)malloc(sizeof(LNode));
    ' s1 t2 ]' L, v5 o    if(!HeadList){+ d3 @% v6 I. k* r3 f: k
            cout << "初始化链表失败!" << endl;   I4 V' H/ F1 G- K9 ]8 f
            exit(0); ; Z6 @# {% s, h% \" _% l$ ^# J* B
        }
    ' U# {  Q7 O, N; P9 a    EndList=HeadList;
    2 {. x, {% f' M3 R+ d    HeadList->next = NULL;4 g# X* j$ g; ^& Z, B9 s- O
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;9 E4 |, T3 `5 B, Z1 _! {6 b2 t
        Length = 0;/ k5 o: _! o- [, w3 e6 g0 H
        e_where= 0;/ N! f' O4 o7 A! Y) ^
    }
    + ]9 |+ R- c2 _$ c- y# m: a. v
    # J8 @! h( x& c1 ~0 [+ w增加节点
    8 O. ?1 T- F- m2 S/ L9 M3 a" f- H$ r" M) P4 o
    void LinearNode::AddNodeHead(ElemType num){    //头插法
    ; G; F3 J/ Q+ k  n5 t    node = (LNode *)malloc(sizeof(LNode));* J/ i0 x8 u& g  P' l
        if(!node){
    4 r5 O6 g3 {8 G; }5 l0 A8 E        cout << "新建节点失败!" << endl; - t, f- [& G+ A: b) `* N
            return;
    * t/ Q, F: k9 U4 D8 [    }   Q+ s" L- W7 ^: H
        node->data = num;) Y% b( Q( R  |* t- m' D
        cout << node->data <<"   ";
    % B1 {! V+ l0 M6 v) _" `    if(NULL==HeadList->next){/ b' J# {  F: T+ t+ I4 i1 k& Q" @4 H
            node->next = NULL;
    7 A: A0 K) M! p        HeadList->next = node;
    ( ?3 J2 I9 E  n! c        EndList=node;
    ! R, C; T! m6 e, h/ M8 M    }
    8 e& r1 J. \1 ~. U+ G" ?    else{
    5 a9 n  m7 `# K. H. A+ {7 A        node->next = HeadList->next;) K9 W0 w! C& Y8 ^! j
            HeadList->next=node;- u1 h2 l- I0 }# d
        }
    6 @+ g1 L6 V+ O4 C6 g% K    Length++; ; c& p8 @7 i: |0 M" z% m; Y7 k
    }/ W. N" f" z4 E
    ; [8 w/ R8 a( Y, ?9 Y
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    ' I. R) o3 W: u$ w( S5 F    node = (LNode *)malloc(sizeof(LNode));9 F/ S- |9 z6 r
        if(!node){: K. R; }! h  l  l
            cout << "新建节点失败!" << endl; 9 m& a/ t( N; `! w, e9 b
            return;
    . J9 q8 f4 W$ j, l9 [$ k& s    }
    % T' s/ l' @2 t1 t; C2 K. V5 Y    node->data = num;
    ( V) X1 f2 X1 L, i    cout << node->data <<"   ";
    % V# D4 o5 F. P* e0 @% F3 [: F    node->next = NULL;
    0 B% J. K9 j' a" h' ~    EndList->next = node;
    2 ~4 E4 s# F% D5 ~. U    EndList = node;& q9 g6 J5 T* g' Q3 G
        Length++;
    1 O3 G$ Q! R* f: D/ g; K: t}
    0 m  ]" B- ?  g) r
      S2 w6 q# z- }( n& B9 C删除节点; n8 I' T# w1 t3 T  t/ m
      l1 c( `1 v% u+ V% \9 A6 l( j# L
    void LinearNode:eleteNode(ElemType elem){
    2 L+ ]; C2 Z* N% J* K( O* C: y    if(NULL==(HeadList->next)){6 I% x. _1 P7 v, G; G
            cout<< "无节点"<<endl;
    : ]+ S4 A, S% M8 h9 ?, n& z        return; 0 Z2 u0 g( ?. W$ R( [1 }) i# }5 s
        }
    # q7 ?$ N, g) [. @    Node_cur = HeadList;& a2 Y5 Y; ?1 [5 Z/ L
        while(NULL!=Node_cur->next){% V0 l8 V- F& Z8 M3 s+ f
            Node_temp = Node_cur->next;
    + ?4 k4 W2 x; j7 T5 k9 e        if(elem == Node_temp->data){
    0 t0 q$ u; n5 ?! B6 J# Z            Node_cur->next=Node_temp->next;4 m, C: m' }( _4 j/ c  Y- _
                free(Node_temp);0 g3 |4 Q/ z2 _8 h$ {* O
            }
    5 W# j- P) f" l% v1 m        if(NULL!=Node_cur->next)
    2 N# F: d0 {; @3 u! ?: e        Node_cur=Node_cur->next;) q4 N8 S5 C8 i# w
        }
    6 M- `" l* C5 C$ v+ t3 R    cout<< elem <<" 元素已删除!"<<endl;
    ' V: ~- ^" M% m" C! z}
    , v. i- c+ S8 k$ h- t7 y6 x0 L" O7 O4 M6 }- j  D
    显示链表) L7 o8 @+ u5 g8 q

    * X# U* z/ @: R8 P+ [9 B' Mvoid LinearNode::ShowLNode(){
    0 m" o0 m. H4 I) D" ?3 l    if(NULL==(HeadList->next)){
    2 N+ u5 S+ w& c/ d) _/ b  w& Y- k        cout<< "无节点"<<endl;
    0 W# m# d  P% u9 I0 A+ q        return;
    ' N! q" c2 |0 P" @    }
    & G! ~. G& W$ @4 L5 E# R/ V) E    Node_cur = HeadList->next;
    1 k) ~4 J# `1 K- b    while(NULL!=(Node_cur->next)){
    " `7 \1 G3 z3 i! o5 M$ v9 Q        cout<< Node_cur->data << "   ";
    5 n/ U" `! u* e/ r7 N        Node_cur = Node_cur->next;8 N- ^  }3 q: l0 A( ]" X
        }
    ; ?1 |, g; C2 G    cout<< Node_cur->data << "   ";
    7 n: `* v6 b7 g8 s" e    cout<<"链表中的数据已显示!!"<<endl;
    . X# }2 ?6 F2 Y0 Z* T+ V}
    2 E5 u/ O# Z0 L8 A2 g+ F- x$ V0 p- q4 j! f5 }
    销毁链表/ v9 j2 t( Z2 R

    9 n, e# v4 s0 D7 d1 w/ d2 y2 o+ yvoid LinearNode:estoryLNode(){
    ! j8 ~$ T5 Y3 ^& X; B  B0 b& a# R4 W    Node_cur = HeadList->next; 1 O! t  J4 J+ y1 k3 H) I7 P
        while(NULL!=(Node_cur->next)){2 i% _/ l) a  R1 q
            Node_temp = Node_cur->next;0 S! |! g  w2 ^0 e6 }  J1 q
            free(Node_cur);$ \; ?2 V  L. u8 `: ]
            Node_cur = Node_temp;0 R# O! b) H, B* q
        }
    ( S/ z1 w3 P! W8 _    free(Node_temp);& V  Y) R  e) j$ E: Y7 j( j% V
        cout << "数据节点已完全释放!"<<endl;
    % J7 f8 f8 O& M2 `, x    free(HeadList);    // 释放头节点
    ' T( S/ |3 `' @    cout << "头节点已释放!"<<endl;
    # G, E+ R1 R1 i+ @# m: J. ~————————————————
    3 ^3 ^6 A, H7 k2 v版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: U# `0 {2 B' V. |- R
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    # \& U  I9 [0 o7 V5 C7 J2 X' C* \' s# Q
      \2 \. y* c) Y2 a) \
    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-25 03:43 , Processed in 0.616045 second(s), 50 queries .

    回顶部