QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1591|回复: 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
    0 [: x1 s7 o. M9 f" D, R2 ~, ]
    线性表顺序表示、链式表示实现方法及其异同点: I3 B7 L5 u2 z$ X
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    ; y1 X5 T, {, H1 @$ A* T5 G6 p+ ^/ r$ _: x. @" N
    本文采用C++实现两种表示方法。
    2 O2 m  b" n1 v8 A# Y
    4 o" P3 b. A4 g/ [目录3 v  F$ Y: t1 T- j! Q* E
    # H- L% k3 _6 \) [
    顺序表示和链式表示的区别:% B# J* [* w0 c0 T+ O$ B, {
    2 n/ z' S" {" a- c- X
    创建方式:
    2 T- S1 y2 c8 V3 L- ?1 l2 V$ q+ J' N/ s+ J$ i3 R- z5 S6 j
    时间复杂度:
    ' c& H9 N1 @) Q3 b. w3 Z
    % l) |6 w; F( K* N1 i* u顺序表示和链式表示的相同点:2 S/ U' x! W6 h- g/ M# n7 B& ^

    4 C" O* D9 @" I2 M* C; T( I删除内存空间:
    . s' |8 W4 k1 v" _- S: I: @* s8 d) p# F
    代码实现:
    2 V# ]2 o* R  G/ l# ?/ c2 V5 k3 j4 S! g& V
    顺序表示方法:
    ' f5 F. v! S* b2 z+ Z, W$ F
    $ [3 M9 A* R7 k2 ^5 e7 d* p结构体定义
    6 \' P* y* T$ b# b: ~# M- [. K3 \5 E( M0 G2 M! g
    初始化
    6 S' S% Z, b5 ]2 I# X; y8 Y) b) W$ q) C9 o, r+ n
    增加元素6 _9 l3 F2 c% N6 h/ X3 Q) [  {
    0 H6 {  P$ _: Z( J; q% w) T
    删除元素
    4 A# e/ @1 o8 \
    7 y5 T6 o7 f7 W4 w0 ~* L% Z销毁列表
    ! O! q0 c" ~% m' }1 z0 a( I
    ! P7 K- Q3 c3 N) J3 n链式表示方法
    : \" ?: A% y' T$ Z
    6 u1 m5 d' n; s2 f" K结构体定义
    . B% m2 H% F) v( g- @7 [$ A
    8 ?4 W, f9 d! i$ Y0 C初始化
    6 y  @' y8 l0 @* \6 v6 J
    # Y, t& k! n" `) Y5 O( N增加节点
    " V, x7 x: K/ b' b$ a  b6 J+ T4 G
    5 j* ]$ [* ]& q4 p$ F$ v删除节点$ g+ G1 P  P5 v, D1 d# w# T; E5 u0 o
    0 n! y3 Z3 Y; M2 T+ p: H1 c  D! N) m* l9 C
    显示链表( ~" o0 C( ?: d. ?% b4 q7 m1 _% ^7 W) H
    # d8 P  k9 M/ D$ J) c
    销毁链表8 T  m$ K1 `  V

    / w' z9 k! i% Q: [7 m- m9 t顺序表示和链式表示的区别:! s0 z0 ^3 M1 o. v+ C% I$ a

    5 @6 d) X2 g# ]$ ~创建方式:
    $ I/ n; L* C0 o# m0 F: w9 L, n, \6 g) G1 n/ e
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。) ^7 A9 a7 k, |/ H0 Y0 P% `$ X

    & w7 i& b6 a0 @3 ^+ L# O(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)* G1 }% ^4 X* Y; }) L
    , Z* x5 j6 v9 ^3 J: _5 r. t! H) O
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    5 m1 ~/ Q. c$ s+ x8 y% Y2 T% I, k5 o8 c8 U8 N5 i4 n
    时间复杂度:' q5 O1 A$ u+ k, n1 B. k4 g( H

      Y0 i, x$ X: [1 P增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    $ B" P1 c0 |/ {1 b7 M! z6 k! c2 C# L, r; j- A* v8 ~
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)" H* x9 E; R4 a6 S6 W3 z' f

    . R: E# I  A$ `+ i  kPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。8 I  Q# W, X# u7 a. C

    9 V8 a% U# G/ [; v, l+ |修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);/ G' G5 U# M5 N5 d/ s
    ( g9 Y. A7 O+ ^& r* I
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);$ x" O8 c  m5 S8 T# J$ q5 Q

    2 F/ ]& }' J: b5 g顺序表示和链式表示的相同点:" g) X+ w3 y9 R- C  l
    * R5 O/ H3 ~  V3 u! e9 e
    删除内存空间:( h2 x/ z: P) F+ w

    + g; Z0 {" Y. A6 P3 Y6 @& k" c" H- _内存空间的删除都需要对每一个存储单元单独释放空间。5 M* F! E2 D! j$ E

    0 _3 g8 i! h$ w( D3 E, f" \' e代码实现:
    3 ~9 a) R, i# \$ X
    3 G& {; d' ~6 f) u0 R) [$ `顺序表示方法:0 ^, b. c( D7 d) v; G$ v
    & P" ]5 q* c! O% T, i! a8 b
    结构体定义4 p/ \4 R& i6 e$ Q, O9 P: A

    ; e) Y1 K; j9 Y: O% H9 btypedef struct {
    ; r$ D% i3 o& L, D) r    ElemType * elem;
    ) G$ h: C- ?/ Y- t8 B    int     length;        // 线性表的现有长度 0 V9 \$ ^; h3 Q; g1 N; P
        int        listSize;    // 线性表的最大长度
    : t0 S9 `* Y- e}SqList;' o6 y% s- U2 A* U' h
    4 e2 N5 E' Y) O7 K: w7 A
    初始化) V9 z5 s8 H; T) a! {4 o
    + n2 F# |0 E3 _9 B# F$ e
    void InitList(SqList *L){
    4 A& V- K3 N; y. P9 x    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    / T" f& l5 y& M1 b; |    if(!L->elem) {0 Q+ c5 Q! Z$ b! s$ t
            cout<<"申请空间失败!\n";
    8 D" j+ N8 G, ~* N1 r$ c        DestoryList(L);
    $ [1 Z4 W; m5 R- T/ k# y& [) R, B    }# l- Y8 k$ @2 E$ \7 ^. m
        L->length = 0;4 k& l2 t; b( S% U% s
        L->listSize = LIST_INIT_SIZE;
    & \2 \: G6 h0 r* \/ o, i7 f( W    cout<<"线性表初始化完成!\n";4 Y6 W1 z, p7 q( N2 B' y) N
    }; ?) B7 s4 Y9 u' T) ]# }
    0 n% f* m. v# }* v7 h& m
    增加元素
    6 `9 g  I; g9 O% Z" |2 i
    2 [7 P, x9 i+ m' j+ W1 U" g8 Bvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素5 B' ]9 \) T& c/ q0 [
        if(L->length>=L->listSize){6 Y' V( E, _" q. i7 V% O/ [$ c
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));9 s9 U( U) d- A8 t1 k" [9 Q3 j3 C3 H$ y
            if(!L->elem){
    ! l! Y' |7 L7 i& ~- ~            cout<<"增加空间失败!"<<endl;) H' D0 E* w" j
                DestoryList(L);
    / g7 ?: j; u; J' R        }5 s# Y3 r$ t* |/ T
        }
    1 H) e, u7 n! y. Z0 `  g5 \    * (L->elem+L->length) = e;. b( _, ^# t2 l1 D; C
        L->length ++;    ( y8 s; S- Y4 ?% t& h
    }: Q) g4 x9 |5 J

    - q! G& h- a: I  O6 svoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    ! n6 u5 X) w% F# ]; K$ e  ^    int i;( x9 K: U4 u: M7 W: @/ N, s
        L->length++;
    ; U5 }6 i: ^0 {5 O, [2 i4 g" j    for(i=L->length;i>=e_where;i--){9 D2 P* ?- b- [7 U$ r( y1 m2 {( l) F2 M, `
            if(L->length>L->listSize){
    , p5 q9 D9 Z& q0 p            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    1 I8 M' U% x' \) `            if(!L->elem){; \0 p& c, I' p# t5 k9 M( m% U
                    cout<<"增加空间失败!"<<endl;
    8 Q( s* Y1 U$ H, ~; s5 Z" G                DestoryList(L); 6 q0 G( m! t% ~
                }
    5 F( C* Q9 Q0 O* i! c9 g# u& l: J. Y        }
    6 t- P+ q  o, K  E( W+ m        *(L->elem+i+1) = *(L->elem+i);        
    - E" N7 P& X$ \* M) L4 g/ z6 w$ Z    }
    * y% n! ]% Y# c( [- `    *(L->elem+e_where)=e;
    2 N  G- w, x- ?    cout<<"增加后的线性表如下:"<<endl;   p+ E! p# I& W6 Y- q& u
        ListShow(L);
    . _9 p5 {0 x! v' V: r. T}   S/ Z) S( J+ A5 k  J' Z& G

    9 _6 @5 t" v1 D/ f' R" q4 T- rvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素9 t, `! z% J2 K+ n* C4 S7 H$ ]1 t
        int i;
      {1 w& L  {- Y6 b& Q  F% k$ I    L->length++;) j+ y! p# l3 S' r4 J2 B' q
        for(i=L->length;i>e_where;i--){
    $ C) T) `& ?0 M0 h5 L        if(L->length>L->listSize){* ?) s$ C7 q* k
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));3 }2 Q! X! e6 Y) A& {$ \
                if(!L->elem){3 q( U, E7 m/ j3 C9 e( j/ E
                    cout<<"增加空间失败!"<<endl;
    # y# k) L/ a5 Z                DestoryList(L); 3 _/ {7 b9 ?- k4 ?' L
                }4 H# {0 K% c: o, z7 Z* ]$ K$ S
            }
    1 o. f% |: p: n& {+ N9 D8 u) `8 K        *(L->elem+i+1) = *(L->elem+i);        
    5 i  x8 B2 d% t1 ^$ m( N    }
      _; c$ b8 q$ p1 L# z9 w    *(L->elem+e_where+1)=e;! w8 l' D# n  M/ H' \
        cout<<"增加后的线性表如下:"<<endl; 5 r. K8 e! R( Z$ x0 I
        ListShow(L);7 s7 S% I+ H% A& b& s; t; R) z
    }+ q9 {$ M! C4 W- o( M

    - h4 y) N5 O1 D# u删除元素# Z% ~8 {2 b6 z6 H
    6 ?4 ?4 |+ d. W
    void ListDelete(SqList *L, int e_where){    //删除某位置元素 ( d/ O: ^' |  t- K! i) I. D5 l$ @
        L->length--;+ N& O2 }, m& _9 W  g$ U" O
        for(int i=e_where;i<=L->length;i++){
    " g" r, c; j3 @3 z        *(L->elem+i-1)=*(L->elem+i);
    & H7 J; G0 f# L8 J' H! V    }% u- N% V' f$ s! T  ]  z% A
        cout<<"删除后的线性表如下:"<<endl;
    1 R) u6 ^# V, k. U; s% z, `    ListShow(L);
    & d; ]- I1 n+ j& l* m}. }( D+ r7 g" g9 I. g( C
    0 B# i5 Q' {/ n' p6 @. k
    销毁列表
    ) A1 y( g) {& _! P4 k6 u1 t
    9 o2 N2 Z% q* _" ]# Q+ j+ rvoid DestoryList(SqList *L){
    " g$ t7 E  U8 x4 W0 H    int i=0;/ S, x$ Y, s# ]; f* G3 M
        for(i=0;i<L->listSize;i++){
    : N, k7 J6 V1 T$ N5 v  i* q- A        free(L->elem);8 F* a+ G1 B0 N- I7 S
            L->elem++;
    # o; a( O  i! ?    }7 j6 z/ r/ V2 U
        exit(0);        
    7 o3 U) |7 v! e2 x! Q& [. d}
    ) Z' t  T$ d: L: D4 l
    5 \) m* B, |5 @( d7 n! U( O链式表示方法8 f( c  |8 M4 `
    ( G2 l- ]8 n$ x( d+ _7 G  Q5 a
    结构体定义
    1 n3 }2 r5 R# ]) F, |+ J' K+ t- ~. A
    typedef struct L_Node{
    , Q6 H0 l' s6 u( D. p$ |- H4 X    ElemType data;$ l! l: G9 s: x$ k
        struct L_Node *next;/ a% H/ w, p3 T3 ?9 b8 X* B) k
        //struct L_Node *last;    //增加可变成双向节点
    ) X2 Z) s/ l1 S  }) \}LNode;6 L" \' w0 ]4 D! @# t/ o! C! Y0 c
    5 }  u, }; o" n3 h. L& X$ \
    初始化' G- X3 w6 m* k% ~" f
    3 X* ~3 F5 S" o1 q! y: D
    void LinearNode::InitLNode(){: X- f7 u' }& f* i9 O
        HeadList = (LNode *)malloc(sizeof(LNode));- e; y& Y( l5 q) x$ T* q
        if(!HeadList){3 D8 E9 f) j' [+ Q( D" K
            cout << "初始化链表失败!" << endl; & `; `+ ?9 H  i$ a- b
            exit(0); ' \) a+ D8 O7 x4 O' z
        }
    9 B2 B% F& z9 f( F  l    EndList=HeadList;
    4 w- v/ R# ~& S9 [& M    HeadList->next = NULL;
    7 ^! c" l, o+ T7 A& q    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;. ^1 @+ L) c1 @$ ~9 ~  f9 _* ^. s
        Length = 0;
    ; R; z, a# D' G* O. w    e_where= 0;& o! g; z9 \2 l: m0 E4 o* c* @# h
    }' U$ ^5 z! X8 Y3 v7 @4 q* ~
    9 l& n" c8 `/ h9 V$ J
    增加节点
    5 k) J1 E0 j- I
    . Q6 g  G& ?1 z7 ^7 n8 Dvoid LinearNode::AddNodeHead(ElemType num){    //头插法 & a# c" C- s0 }! f. A" C
        node = (LNode *)malloc(sizeof(LNode));9 n+ O$ R; F( E0 W: M  x" a
        if(!node){
    . z5 i% l- y( W( P' ?3 {5 K' ^        cout << "新建节点失败!" << endl;
    4 S# d% M& A( {9 u7 M; [) J        return;
    " g9 B3 j( P( F0 Z0 A2 Y6 w7 z& |    } & L. x4 i8 ?$ L$ x3 i; `/ |
        node->data = num;% ?0 c2 m; t8 J$ j
        cout << node->data <<"   ";
    1 i2 a6 j3 V; z' h/ p" n( b) |$ m    if(NULL==HeadList->next){, W* u2 b# F* I# y
            node->next = NULL;
    % q/ U/ \! _7 Y. H        HeadList->next = node;
    / g; N" T0 Y( c& k! r! c1 g# q        EndList=node;
    4 k, q# R, q' V$ }, {8 o' [    }
    4 q8 ]: \# a) Q) ?; u9 ]+ b    else{7 ?! d2 f; x6 P$ `& g! [4 Q# A
            node->next = HeadList->next;. F8 E2 s* D* l! u. g5 C% ~& _
            HeadList->next=node;* }. D$ a! D0 u4 O. ]
        }6 p* _9 E/ L! \0 w% m6 K+ b
        Length++;
    ! z: Z& `; e- Q}5 H  T+ S  x1 \+ m; Q8 R
    7 x6 O; X3 V- |9 m1 [: K, C" b* l0 p9 l
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    " y: p: X# ~/ Y' ?    node = (LNode *)malloc(sizeof(LNode));' `7 z& ?2 A1 |  [0 I1 P4 ]$ p. u
        if(!node){8 `; z' ], b: H( k. N
            cout << "新建节点失败!" << endl;
    - ^5 V7 \9 _/ b, m4 t6 E/ f$ q0 U6 Q0 }        return;
    ; v' I  B, r1 J* x, \    }
    8 v$ p, Q3 S/ B) H' ?8 ^    node->data = num;
    ; g- [& j2 a5 f/ x3 T; n3 ?    cout << node->data <<"   ";6 w9 e% F' u6 J4 F2 E
        node->next = NULL;
    7 S1 Z* Q% C8 G0 v. v2 p# J9 T    EndList->next = node;) z3 L  S) y2 e; ^. D* V
        EndList = node;
    2 z+ F) [) V- {% j; n: _    Length++;
    8 A& y- v" D- i2 _2 b4 ?. [}
    ( r6 v6 q  s& W. K. ]# ^' L$ p, t3 w6 K' W0 l' Y6 s1 G; f$ w% z
    删除节点
    ( u3 M4 ^6 |' \1 ~- D" n
      [! V. k* z+ [. evoid LinearNode:eleteNode(ElemType elem){8 z, M' a) d- r. y
        if(NULL==(HeadList->next)){
    9 h- I. k: G/ ^- ^/ j        cout<< "无节点"<<endl;
    1 u  w4 d6 b, {$ M& d        return;
      Y" W; s3 S$ q" V, \( m2 C3 f! Z+ ]    }( U0 s0 z6 p+ {& a/ H1 W* V7 Q
        Node_cur = HeadList;
      n& v" E+ h* d  Y    while(NULL!=Node_cur->next){
    ! x/ o' H- P% N& N        Node_temp = Node_cur->next; : Z( p: b3 m0 L; Z& a
            if(elem == Node_temp->data){; G3 ^- b# d( \  k
                Node_cur->next=Node_temp->next;1 z* F7 f+ q" E. u
                free(Node_temp);
    2 V- _1 ~" v- F% B% r  S        }, |+ Y- f, N' s2 H# J
            if(NULL!=Node_cur->next)* `% D. p) s8 f; c( n' P
            Node_cur=Node_cur->next;
    4 g- ?/ O. X- y; O# _1 R    }. J9 R, W% c3 g; F( c( |+ v7 _/ F* v
        cout<< elem <<" 元素已删除!"<<endl; - N* h0 m3 F3 x3 B8 L
    }
    . k7 j  e: \3 N
    0 g2 J# R* G: W! S) d显示链表
    ! o: ?6 x) b9 s$ v  W* y
    4 s: E4 G4 H; S- R9 d! ?: J5 ~; Svoid LinearNode::ShowLNode(){+ G; Z& C- X) x
        if(NULL==(HeadList->next)){
    ; r( C7 s& S  b7 y+ S        cout<< "无节点"<<endl;+ B) N, R4 @8 b8 W. q" y4 [) T, Z
            return; 1 ]# t* R/ d" b- j# {
        }/ y; M; ?$ z5 L
        Node_cur = HeadList->next; 1 t4 V' L& C' x6 j* @
        while(NULL!=(Node_cur->next)){& f' K# k; W- ~4 ~
            cout<< Node_cur->data << "   ";
      [5 O2 @& w$ b        Node_cur = Node_cur->next;- v+ H# `# I' `$ R5 g4 L* _
        }# ~2 @# Y" U0 E, a
        cout<< Node_cur->data << "   ";
    7 q/ x+ e" C8 c# m    cout<<"链表中的数据已显示!!"<<endl;
    . z* d, h" u! J" g/ F1 [}' C- F; s8 b& S7 A7 w$ t# O1 p
    + U  k- T+ z9 m( `4 q) u/ p
    销毁链表8 |( O* X1 ?3 `  y6 K# T. X1 s

    $ r! h% |! T/ l9 |( t, h8 R9 Cvoid LinearNode:estoryLNode(){6 _$ I2 @& Q" O: O* q/ }% I
        Node_cur = HeadList->next;
    6 w' B' w+ e  E2 S( P( d    while(NULL!=(Node_cur->next)){
    6 K% j" s4 `9 P+ Y        Node_temp = Node_cur->next;
    4 B% @9 Y) k% I        free(Node_cur);7 j+ T6 |/ Z+ _+ ^( g
            Node_cur = Node_temp;
    ) M+ b# E! A# x# Y4 r    }/ M3 e! X1 w4 a' C$ M
        free(Node_temp);3 K) s, T6 X, f  ]8 x
        cout << "数据节点已完全释放!"<<endl; , J1 D: O; i& s7 k
        free(HeadList);    // 释放头节点 ! `" t* T) p# U3 R
        cout << "头节点已释放!"<<endl; ( V3 d" G' W, w6 d3 _) Q  |) ?
    ————————————————9 W3 f. l' Q: f; p
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- A* E2 q: T4 Z. i+ u$ R9 x
    原文链接:https://blog.csdn.net/Baimax1/article/details/1060362869 O7 u/ x. [' _' j+ U9 X
    / M* |& o8 x, J1 x; V
    2 y/ N4 t- ^# X  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-9-8 11:45 , Processed in 0.379207 second(s), 51 queries .

    回顶部