QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1593|回复: 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 D8 b8 U4 m' z: p
    线性表顺序表示、链式表示实现方法及其异同点
    0 Y" c5 l# A  J) m* g9 M线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    1 ?( U7 G$ F$ z! z2 p+ b
    * A' O5 w% T5 G) o& P本文采用C++实现两种表示方法。5 E2 ^1 d/ v: e7 X" Q$ B
    5 \4 f7 h- s: M, F/ W7 g
    目录
    % _5 r& D; O# j6 p
      g) h& [; o& l( O! K3 O顺序表示和链式表示的区别:
    1 |; k) ^" F2 }# O6 L6 ^5 W$ I/ i5 M5 O  A' @; I, C
    创建方式:
    9 x# k/ p' J2 K9 I) u$ C# [0 k6 \# w. J% I/ g" b0 W
    时间复杂度:
    8 W% ~- ]/ Y3 r. }' s7 j: g3 V$ U( r
    ) @# b+ A. N5 N3 |+ `2 E) v顺序表示和链式表示的相同点:! T% `1 [$ y1 l3 l

    ' u# N! n% w$ w删除内存空间:
    % C$ F& F  T5 K% F- d$ A7 z. B% M5 Y/ A+ v
    代码实现:
    6 S( |1 V& |/ g; {$ D
    + a8 o+ U- ~& i. k顺序表示方法:
    ) _' Y1 r9 U+ N2 i6 G& |# T( B$ ^# P8 R9 r: Y9 X  J
    结构体定义" e, F- b- b4 u  q$ e1 ^

    6 n/ M, C! m1 f" w- p, e& l初始化3 F0 a, V9 R" H! P$ N

    6 a- g" k; ^; w增加元素
    2 c  `* @( f8 {% w8 U7 X9 \. ?: {5 R0 G
    删除元素
    3 t- Q4 R7 n3 u4 \' h/ c5 i: Z* G  Y0 @! T9 |8 Z: p# J1 t
    销毁列表
    + r& d- l! K. z
    ) c; [$ T( h) Q: Q链式表示方法" _2 Z, Z- F- G; l% ]* Z6 s
    9 }$ E& l" W4 }; k2 w! ?
    结构体定义" I0 m. h* `  N+ n1 {$ J( S

    & E: C) K5 ^$ P; z) {3 ]初始化+ G5 h4 ~- o! E

    8 c& s5 l6 s4 T9 o% y增加节点
    & ~$ D; ~* y7 l9 d# Y6 w' L# q6 F
    删除节点
    9 `3 `; T, D( i9 e" z4 R
    : H) i" C- U0 Y5 B显示链表6 D: M) i3 n  ^! X

    4 a, V4 [8 p* K销毁链表
    ; B) u# i5 x2 Q/ O4 ^! V  E$ d( q, J6 m  v5 H4 |$ }& n
    顺序表示和链式表示的区别:
    ; D1 ~4 A% d/ _$ D
    ' z! R$ A* W/ x: g  V: d创建方式:
    # p/ X) m, L; L0 v
    ! a. t8 o0 L' J顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    ( V4 z/ A! x+ N1 _2 d6 o. y4 D+ T% b
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)( R1 W( z* H+ t0 X- H# i* i
    8 k9 \7 d% `; P7 f$ l9 T: d; ^
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。' B. u* u4 m4 f

    ! h, j5 W/ m8 _0 ]* v) |时间复杂度:
    ; j. r0 a: ]4 |' M% {$ C9 @5 c& O
    / F6 c7 p9 Q# m增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    3 N2 n8 n$ t  z. U! ~; c
    : J$ p  A* `+ g增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作); o. N9 _: A6 g3 k( \% B6 X
    2 b2 d" A0 C! `6 ]( X, S' S* s5 F
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    * X4 p! F4 ^: j& k* Y4 e; Y* \: y0 D8 R& j0 N, v' g0 \7 Y
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);0 b- @5 P2 u! g! f3 p

    ; \' v% ]' j6 A- {8 ~: Q- X: v查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    ! `$ b' h6 I6 _" V7 p8 q8 f6 Y4 w% b4 h0 q2 L. Z5 P" h8 ~  [. H0 w
    顺序表示和链式表示的相同点:( F* I. B+ h5 P  o9 |5 P

    * H# M# o8 j+ d+ i, ~8 u删除内存空间:
    # f) O. ^. [% A% `1 k3 i: W& {/ e; j+ q/ U% M, U* ~& D
    内存空间的删除都需要对每一个存储单元单独释放空间。
    9 q& f, n) Q5 _) ?
    & p& g8 {: B$ [$ r: G代码实现:3 Q; r4 O, z/ X7 s5 M% ?
    $ S! H- \+ x8 G0 m& x5 _  [* m
    顺序表示方法:
    5 d. k2 g, O$ Z0 Q" g# Q" B8 R  E5 v6 S( Q4 z4 k
    结构体定义6 q3 ?1 F9 u: A: s1 }2 H8 ~

    , v' [. x5 O0 ?( G/ H1 ]typedef struct {2 t3 r5 A# V9 K& e5 T" U3 D
        ElemType * elem;
    : F; ~/ q+ z. G$ \    int     length;        // 线性表的现有长度 ! Z) ]. ?4 |# b& `
        int        listSize;    // 线性表的最大长度& z. C- ]3 l- S) S5 p! Y; N
    }SqList;
    3 r# D) q& u' h7 [5 u: ^: J! k' B2 E& _
    初始化  V# f9 K3 H9 b1 O& F0 @

      J. Q. h% A# z6 Z, A/ Fvoid InitList(SqList *L){7 o. Z1 Z3 \. P0 a! ~2 K! o" M. [
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;3 ]) Q9 u8 F* N1 l8 Z9 f$ g
        if(!L->elem) {
    % q! b% j7 m9 p( z( J' ]4 {% E- s        cout<<"申请空间失败!\n";2 |* |: Q" [8 `, p& @7 ?  b( |! Z& R. G
            DestoryList(L);1 b. d4 P$ [& c* H7 V+ ]1 g- _  l
        }
    : V+ I- V9 q: r2 E2 Y; h2 C    L->length = 0;- i- a# }) n- a+ L7 |
        L->listSize = LIST_INIT_SIZE;9 s7 {" A( s: R/ e  Y5 ?2 K
        cout<<"线性表初始化完成!\n";
    ! [1 o0 j) N+ g  J9 M3 {}
    , Y  J% J% R1 M/ n" [3 i+ J' T# W: B+ `& n; z4 \% M
    增加元素) z5 x9 F. O3 v  K; j
    + N0 R9 h8 h: B' Y) s, ]
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素' F, v' x0 `: q) S7 y5 R/ `
        if(L->length>=L->listSize){
    5 S. ~  y: d/ p. [: x6 a) v5 u        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));+ J, r( w* e1 N1 l  M; a# J9 W
            if(!L->elem){
    * p& g/ `* u' ?4 t            cout<<"增加空间失败!"<<endl;
    3 z+ w$ E! }& ^. O            DestoryList(L);/ |! D2 o5 C) X. F$ i8 }/ Y' G
            }3 P+ U% k! O  s
        }* O" K+ m* A) l/ i/ k
        * (L->elem+L->length) = e;0 R8 k/ v' Z  W6 F9 a( W$ N
        L->length ++;    . y& Y( v9 c+ o1 v3 ~6 s
    }$ y0 Q  y- `' V1 T5 }

    ; y4 w8 K5 `* l  Y) @* m9 bvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素/ y. ~4 H: C3 {6 d; m
        int i;' V; b( p5 k' G3 V" [6 I% N
        L->length++;' g4 L2 z# T$ X$ X
        for(i=L->length;i>=e_where;i--){
    , e& L0 a+ g! a  v$ o0 k- g2 d        if(L->length>L->listSize){
    8 \' E6 P( r% r) L+ W  K, K  [            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    2 \' ^/ I; l; Z) p% K  a            if(!L->elem){$ J+ q4 {" m; z- u3 K/ y
                    cout<<"增加空间失败!"<<endl;2 H: P7 a. u- w8 H5 G
                    DestoryList(L);
    1 k% _! J6 h: z/ Y( s6 R" p) [9 Q            }
    % [* Z) R0 l9 {( u' b) v1 z        }
    1 }' z2 |& u, h        *(L->elem+i+1) = *(L->elem+i);        
    # S* n8 t  F3 L, F# Q    }
    1 z! R* d; c) x. @) J    *(L->elem+e_where)=e;
    & I. y0 X" X! E! c* U    cout<<"增加后的线性表如下:"<<endl;
    - d* ]' _) _. K  y    ListShow(L);) q% g- P* F: u' a
    }
      L5 E! y4 A, A( F( X/ u& w9 y1 i
    ' ^1 Z. F+ y0 Y5 H) Dvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    ' l7 g$ G# D, {1 Z    int i;
    % Q% Y! c% H+ w& M% T8 {    L->length++;
    - g, `1 H: L( D) u3 M" h    for(i=L->length;i>e_where;i--){# z9 C% D/ M# @9 W' s+ i
            if(L->length>L->listSize){% A2 H* T  |; M+ W  V
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    , H5 [, x# ~) X7 \8 w& G            if(!L->elem){
    5 ]0 H8 k' E3 \# u$ D                cout<<"增加空间失败!"<<endl;
    ' M7 X0 M+ J- D% o0 e                DestoryList(L);
    8 e& M/ n+ \$ t& D            }
    ( G0 D' D0 R1 x1 G; t4 M+ y        }
    , X( u% c/ T' }& ]1 h0 j8 g7 Z( |2 V        *(L->elem+i+1) = *(L->elem+i);        
    3 D1 n, H5 Y0 U; X, ?0 s7 L    }
    1 Y. W8 I& y* t+ Y    *(L->elem+e_where+1)=e;
    7 s; p% x* {& c1 l    cout<<"增加后的线性表如下:"<<endl;
    + R/ n4 a# M( V) d    ListShow(L);
    ) `0 p# d2 X7 w0 P1 m- i& D/ ^}$ z! {' }- {* ?  x

    0 y* O: Q; ~" D& h7 y/ e删除元素9 W' J* m5 [" J' Z

    9 x1 I) C& H  Cvoid ListDelete(SqList *L, int e_where){    //删除某位置元素 + H/ r( G" Q8 H* A/ {
        L->length--;8 s3 m# [! d+ P$ x$ r. `% `# G
        for(int i=e_where;i<=L->length;i++){: s6 N, i% W& \5 g
            *(L->elem+i-1)=*(L->elem+i);9 W. }; V0 G& W" }4 a
        }
      _. m( B& P6 D/ d% y1 `* v; [    cout<<"删除后的线性表如下:"<<endl;
    2 i7 A4 D, }! l3 Y8 O6 o5 e    ListShow(L);
    ; \- j6 J' `. h  _}
    # Z) @- r- S$ a' a$ u# U- a" {8 C3 ]/ ]4 c% |/ N
    销毁列表4 U. v6 H1 X, R1 a
    5 P7 F9 @0 _  ~# b  _! p- x
    void DestoryList(SqList *L){
    * u5 H' c8 @5 A0 A& U! n# ~    int i=0;  b$ H3 ]+ w. r3 o' F7 B6 p" v; b
        for(i=0;i<L->listSize;i++){
    0 w0 _% |6 C' g8 t: {/ N6 R        free(L->elem);# V) m: z. O% ]
            L->elem++;$ o7 c- s, H" h/ W3 P
        }. d- E& ?5 M7 w- t: J: c
        exit(0);        + R! r1 Y' T6 A+ ~, r( F
    }
    . o$ I, t8 v% \2 ?) N- }
    : Z# k$ F& }* I% F* V链式表示方法
    , c+ h7 E3 @4 u$ k" U9 Z. a# H1 ~$ m/ v( L; Y
    结构体定义
    * d9 Y  u, e1 ^1 u4 h5 p' m8 T3 f3 \  C, i% }4 K" n; E! b9 h& ~
    typedef struct L_Node{
    5 O; O* e, {" Z7 N0 e    ElemType data;
    . t0 E- K! d% z. Y  `# ^4 F    struct L_Node *next;. _$ f& o# y/ o5 Z
        //struct L_Node *last;    //增加可变成双向节点 * f! Q* w8 Q5 {2 x7 U1 f
    }LNode;
    $ a- z: W/ W  K$ H9 e5 M6 p9 J6 m6 e  q4 }& k" C
    初始化- \+ Y7 ]8 e' N% r6 j/ J+ z

    9 W9 w0 Z$ K& }- J6 evoid LinearNode::InitLNode(){
    ( W  m: K+ L; ]1 R    HeadList = (LNode *)malloc(sizeof(LNode));
    3 D( B7 e0 B, l! ^    if(!HeadList){# M/ ]7 m7 q; K& f, S
            cout << "初始化链表失败!" << endl;
    & v. T( s) M  y/ i        exit(0);
    9 }/ p/ ~# W" Q& F$ w$ d* _5 L    } % U1 h" h; ]# |' X
        EndList=HeadList;7 c" t3 M9 e# b
        HeadList->next = NULL;
    , ]9 V  n; \7 A  y    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
      n) L4 r5 W% f4 m4 v) W    Length = 0;2 a4 j4 w; L* R& O% P/ A4 D. g* t
        e_where= 0;
    9 I1 g2 ?. D0 e  ]}+ n5 @% Q, W5 A/ m0 l6 U

    2 C6 m7 J% f7 N% L2 F2 f增加节点2 F0 \; O# t& z  M) p3 b
    % f1 Y5 z  h9 k+ s
    void LinearNode::AddNodeHead(ElemType num){    //头插法 1 w1 c3 F' K4 ~$ b) Z- q: P
        node = (LNode *)malloc(sizeof(LNode));, Q+ n/ x/ X$ e1 _9 V: [6 w
        if(!node){
    ( A' l% j3 k6 V' H: O$ q        cout << "新建节点失败!" << endl;
    : U% K* ^% F& P) \7 g/ D$ [        return;
    , l( W1 _5 U- V0 t    }
    4 p. L+ O# v: A4 ?; B) f% ]$ j    node->data = num;
    ( k, Q! U/ x0 P+ a    cout << node->data <<"   ";- T0 \3 t- p! w/ n! I/ e( G
        if(NULL==HeadList->next){5 t: f' A; t2 `5 T) y$ j- S) h
            node->next = NULL;( H7 b# c1 c' w$ V) |: F
            HeadList->next = node;
    0 G3 N0 G1 U( G7 K. [; k# a# i' H        EndList=node;
    * W; A& x+ {% f# k' N' }; b    }9 O# e6 k  n; {  x) G1 E% G
        else{1 a) x' J0 k0 _2 e
            node->next = HeadList->next;! A# W+ A2 a( n& _
            HeadList->next=node;6 A; ?# p5 T4 \3 |9 y
        }
    - ?6 ~$ U( G: W% K# q2 G) j    Length++; ; B# G8 Q3 r& ]) Z5 m& \1 O
    }/ r& ?" u+ S; B/ ?+ k4 }# K2 e0 r

    2 I5 H; B# R4 t/ q8 F4 ]$ Nvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法 " r4 w8 r+ Y$ O; g+ B1 |9 \$ ?
        node = (LNode *)malloc(sizeof(LNode));
    ' u. F, P, B: z    if(!node){
    ) P9 `- S9 T, l+ r$ V/ _' W. N        cout << "新建节点失败!" << endl; 7 e& l, H  b# O, R
            return;
    7 L& B* O; O! p0 z% z    }
      K2 q) |2 t  j+ X  G0 y0 y/ X    node->data = num;
    3 C" U$ d  X5 v    cout << node->data <<"   ";2 z; P; B& {1 i: h  B
        node->next = NULL;
    , h% u" b: {9 @+ C& ]' q/ V: V. P    EndList->next = node;
    7 |4 d; R. h) g! w3 G    EndList = node;
    7 \5 C' P5 @7 J4 `! Z; [4 O    Length++; ' G& H8 I, k# l4 \4 t
    }
    0 a2 T7 I( J; `, M+ m0 g3 Z, A2 s" T$ i% q" |
    删除节点
    " x4 O' j6 t6 Y4 {; s7 z6 i/ A( G) d6 z. U9 s, L% K8 d0 W
    void LinearNode:eleteNode(ElemType elem){- s  s4 ?/ n: K6 T- H  h
        if(NULL==(HeadList->next)){
    : C4 F* Z! x" x9 I/ l: o* z# Z        cout<< "无节点"<<endl;
    2 a% w' i* I+ }$ n! `2 @        return;
    ! H7 l5 V$ T, u9 c' A5 R1 w- E    }! H0 o4 H' h+ L6 N0 b8 w' F
        Node_cur = HeadList;$ ^; W; |7 R  b8 r/ Y7 y6 e
        while(NULL!=Node_cur->next){1 @) j% D/ X0 i0 u. m5 Z
            Node_temp = Node_cur->next; 5 e9 V# G9 j8 H5 }, V. q* c
            if(elem == Node_temp->data){
    8 b! S' n5 H% {$ B) N" {; h# Y            Node_cur->next=Node_temp->next;. M* {* N6 Z4 J. O& @: ~  W$ k
                free(Node_temp);
    . `) |4 B* |4 U4 _7 s        }+ c; Y9 L  w  L: [  h! B3 C
            if(NULL!=Node_cur->next). `" _8 \' E" c" r" z: v
            Node_cur=Node_cur->next;
    ) o* T! |$ g6 H* Y3 l: R- f    }
    ' k4 R1 [+ D1 f& E& L    cout<< elem <<" 元素已删除!"<<endl;
    + ~. `- U! ~6 l}
    6 X% k5 k! i# T. k( K% O( m# |! k8 k  M- I
    显示链表3 H, S8 V+ d6 f/ h/ a1 @
    . B, _4 U$ k" y) B7 t
    void LinearNode::ShowLNode(){
    ; H* X# l, t( e3 {5 K/ i    if(NULL==(HeadList->next)){' U2 P5 A4 Z5 U6 U
            cout<< "无节点"<<endl;
    4 I! \( T- f# u- }" u) B        return;
    % M) r% T: O' ~3 ]' g) c7 i. n    }
    5 f& Q8 Q6 `' u    Node_cur = HeadList->next; 2 ?9 g% D) R4 j4 O9 |
        while(NULL!=(Node_cur->next)){
    . s7 p- l: l! W7 x" m1 {# ]! h        cout<< Node_cur->data << "   ";
    . j  `% j# v( z( ^, r- x1 R4 @, ^        Node_cur = Node_cur->next;
    5 a4 ?& v) h+ G( M    }
    ' Q) J" r4 F3 F/ t7 Y1 V. n& E    cout<< Node_cur->data << "   ";
    3 o: e2 r) x( C. I. G) E    cout<<"链表中的数据已显示!!"<<endl;
    7 t7 y( E1 t* k, N}
    ' e0 O; J  U7 l
      A7 t9 S- P& l4 M& ~" \$ B销毁链表9 V% V5 b) h- ?! Q
    - Q  m) \8 l: r9 e( o1 f; x7 w
    void LinearNode:estoryLNode(){! \+ I7 q1 k, B. k. A
        Node_cur = HeadList->next; ' A6 }5 ^! s- G
        while(NULL!=(Node_cur->next)){
    2 J1 Q! x6 x  l6 R1 H        Node_temp = Node_cur->next;: d& g3 ~8 \0 A8 W& z' S+ F
            free(Node_cur);
    0 G! X$ O# ?% j; ?7 O: g        Node_cur = Node_temp;' |3 a! I! j0 S4 j9 M" j0 @4 D
        }
    , u7 H; l: S( R  ^. U; V    free(Node_temp);
    , @; i. |" m0 ~( x    cout << "数据节点已完全释放!"<<endl;
    . S3 \0 W' t$ f  ?1 J; A, F    free(HeadList);    // 释放头节点
    ) A* X6 {; q" X# n+ d" s( r- x    cout << "头节点已释放!"<<endl;
    * T. ]; m4 s, V+ L2 H————————————————9 z& E! ]8 w. d8 W6 k
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 B, Z0 S+ K3 G# E- W( b; j8 M9 |原文链接:https://blog.csdn.net/Baimax1/article/details/106036286$ W6 O. O- D$ H9 S) m
    % V0 g( G) I" T" _

    , l" ^7 @' q. M& h2 Y
    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-9 02:27 , Processed in 1.467052 second(s), 51 queries .

    回顶部