QQ登录

只需要一步,快速开始

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

    ; f. _# f( {* T/ F/ k) C0 z线性表顺序表示、链式表示实现方法及其异同点
    2 n7 Y0 i( C6 M% U; Q线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。* Q7 @& X+ l; I8 \( D* O5 T
    + J( D- v5 l, f+ I
    本文采用C++实现两种表示方法。
    ! B# n, [: e5 ~# B) h* o1 a) O% ]3 |. X% d
    目录
    ! x" g5 ?) x$ X% V  h/ {  q
    4 N* j1 t  G( P$ w! m# ]3 u6 |顺序表示和链式表示的区别:/ P# r& j( C9 a5 s
    + T; }8 T% J9 T) a$ h7 t1 {: s
    创建方式:
    $ Z! t; w: {# V$ x) a) W  E: y+ q. S
    时间复杂度:; K( ]% d9 [/ N" s
    & w. Y2 P: M" E  g8 H
    顺序表示和链式表示的相同点:
    1 w0 t# w8 f/ m! K, w* D# C9 X+ ^8 Q1 ]! O& v7 ^& `+ f
    删除内存空间:( ]( a0 n. W% b% |! K
    ; W7 D9 H# U- e; \& @% P5 D7 m, Y" d
    代码实现:
    % ~7 N- j- k4 d$ P7 t- M4 X7 E8 g7 w  U" o
    顺序表示方法:
    : h$ h- y' V; ~9 Q4 y
    & B/ ?8 ~7 f9 c$ E0 g0 L结构体定义
    * \8 x9 Q  ?0 n  G8 S$ N
    ( Z; z% [8 h1 V  X7 y: M/ L3 m初始化* J, p* w, U+ o  B

    1 K; c! c5 i# G/ ]( w增加元素
    6 Q( c  `, u* |& e7 d( d+ q2 u% x1 {# k0 _4 w0 p5 I
    删除元素& i4 ]8 Q- F% ^8 X: D- _

    4 s8 e6 d/ m) c. x销毁列表3 M. H2 V: B! [6 v; c7 a
    ; v8 H% J3 P* |1 v! \, e# X) _/ o
    链式表示方法8 V$ z9 x( j+ R( D- Q

    ; i9 e3 y8 d: H* R结构体定义
    : a  i5 f, O. W& b
    * _: u& w1 T$ L9 w初始化) p4 ~: B  a) o) h

    " e) t; C4 g  m( _& C: i增加节点
    * I8 a5 t' R# j; q! z) j/ X" V3 Y
    删除节点3 }* o$ `9 H1 P' d1 a9 v/ H: f
    & d9 A. a* G: V5 ?6 K9 e
    显示链表, ^0 V: V+ M: ~
    ) C8 X) ]+ x3 N9 J
    销毁链表
    & @1 f: ^# s! i, [
    ; j# j2 w: m  K, v- m4 M顺序表示和链式表示的区别:6 o7 h$ e5 s$ X4 U9 ]) P- e2 i
      m) z  z8 }5 S9 j
    创建方式:
    ( Z% H0 b1 W' u$ D6 Z9 i7 X+ k; X9 a5 a: z: J9 n; l! u
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。8 b3 v- x1 g: y4 a* _% d& q

    % {' P. @4 d/ R% O9 m(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    % j7 C  G8 e' I; M- @4 H" H3 V4 R8 \
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。- o( r6 G2 M1 H$ M+ g

    $ x$ {8 ~2 c% g- z时间复杂度:  e9 J! Y9 s, i3 u

    0 {$ y" v4 u8 z增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)( g  m# l, D6 J# D0 L: D2 h; Y
    + b5 l! A, b. U& Z4 E
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    1 Q- C8 M2 U+ F3 ?# ^3 N3 t: _9 j
    3 r6 e* [" z4 r' i8 PPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    + c9 X2 }* A& x' m0 ^$ K/ b5 Y, @  o: x1 Q5 Q5 r8 W1 w" C4 D
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);, ?1 x- v! u" U2 d. X- Q
    / B  d- p4 e2 {: g" U
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    / @; }# K$ o; a
    1 C' [+ o7 P" J1 }$ p! ?8 N顺序表示和链式表示的相同点:
    ' w( j1 Z8 J2 s8 c1 Y' B7 h& h$ s+ a% D& V% B" r
    删除内存空间:
    & t8 o  _$ H8 r1 m1 D2 @% x
    & c8 `- C* X4 t5 W; Z3 y内存空间的删除都需要对每一个存储单元单独释放空间。1 y% R: `! K! h8 o, O1 j+ Q

    8 Q1 \+ u0 T5 X/ w: q代码实现:3 G# P5 v; z9 j7 Q$ O% i
      d4 Q) u* j, O, N
    顺序表示方法:8 b; u* Y8 K' i  d9 _; [
    ! \9 ^( F* B% t: j  a7 S
    结构体定义
    ( ?7 j$ u( n* c0 z1 ?- [7 G% h0 p6 w1 P0 Z! c
    typedef struct {
    9 H: p5 {: A4 _5 g2 `    ElemType * elem;& V2 G; u& p9 n- g4 `4 g
        int     length;        // 线性表的现有长度
    + H; V% l- @0 H# x& q2 I    int        listSize;    // 线性表的最大长度+ |. S1 l# C( K) L- u
    }SqList;
    - S' z0 X2 n9 G- d; g: K) x
    # {: H. G- V8 X  c& B初始化9 T. b, H$ z0 U. F

    , ^, A' C, r$ j% j+ Svoid InitList(SqList *L){, ?2 E1 p2 \  f' X  N/ }4 T/ f
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    0 [/ i3 A5 v% M- _8 ^! {    if(!L->elem) {( C- B8 |: j* H; P7 _; z9 C7 R* |
            cout<<"申请空间失败!\n";, y3 G% d; {5 R6 L1 `/ m
            DestoryList(L);
    7 a/ Q$ U* A; Z    }) @4 g  s5 O7 o
        L->length = 0;( _; f0 V! H0 @
        L->listSize = LIST_INIT_SIZE;
    & c" R5 N2 e$ f/ J3 I( s/ U    cout<<"线性表初始化完成!\n";9 x- m% O4 O! r& P4 A% a3 |
    }, r3 e9 w, R" @* c* `

    8 U+ V6 G/ M3 [" `3 u, I  @增加元素, p! `) J. R5 C# P" z' t# ?! z

    * J' r7 V% o, w# k, }/ g4 Xvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    ; ?9 d; [- k  G* A% P7 I% B$ w    if(L->length>=L->listSize){
    5 U/ {! y/ O. T! U7 c3 `: X2 l        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));5 L0 M4 }, q1 ~0 O4 {  \
            if(!L->elem){7 h, {; U8 F# j6 M1 W
                cout<<"增加空间失败!"<<endl;2 ]8 k3 f4 @# M# c0 l% H. p/ b3 u
                DestoryList(L);
    ( O$ \1 {# }' c6 r  J$ a% z7 h        }
    & T' x1 r" b) D# G% U    }( q8 q5 p+ |: \- p8 L- x
        * (L->elem+L->length) = e;
    2 Q1 B: w2 F. m' W    L->length ++;   
    2 l% i6 k1 W! |. _3 ]}. S, U, O* b; g6 \7 g- O7 z

    - U1 H' O( X' V7 v9 a1 mvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    / w2 G$ z: r# d' `6 k    int i;% e9 Y4 E' v# ^
        L->length++;9 S% H" Q, s2 W0 C
        for(i=L->length;i>=e_where;i--){
    & i4 U; d* E! C, R% m. r) H: m  P        if(L->length>L->listSize){
    5 k; R# R0 u' x# ]( d$ U            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    % i; D: L, D" Q6 F8 F            if(!L->elem){9 B0 W% C; N4 h$ a5 ^% O. v& R2 y
                    cout<<"增加空间失败!"<<endl;
    : ~1 N2 h) U! }* k                DestoryList(L);
    1 c$ q- s+ M, T7 O, r            }
    0 |7 s$ l& ]. U* A, O9 ^6 c( E4 b        }
    . y: G; i. o$ B' s6 m' M# v        *(L->elem+i+1) = *(L->elem+i);        " I: l' O  f- W" |
        }
    $ Z' O' L9 ?) V/ k/ t! B" p' p    *(L->elem+e_where)=e;1 f, ?7 P7 R4 k" \) J; D! a: \
        cout<<"增加后的线性表如下:"<<endl;
    / C6 `- z  d* [3 H7 A$ ?$ M) F    ListShow(L);
    & ^5 z& e: S8 ?& ?7 k! C1 ?0 u$ M} 9 j: S: ]1 K" ~& z

    7 {' [4 U! Q3 Rvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素8 `$ S6 T6 F# Y: f1 O
        int i;
    , K) N& k; ]) n& y9 A) o3 p    L->length++;0 v, D; E* E2 f! h2 M8 v/ q# Y
        for(i=L->length;i>e_where;i--){( c' }+ ?& W2 D' f4 N0 R
            if(L->length>L->listSize){
    # L9 ]: R# d# R& F3 r2 z            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    6 `3 e: N( J( c  J7 D' H% [! t            if(!L->elem){) P! \$ k8 Q5 k" A- f) B( l
                    cout<<"增加空间失败!"<<endl;. z5 x1 v% ?8 [$ R9 N
                    DestoryList(L); " Y  i3 I. B4 o
                }2 q& ^3 y/ R. I* `0 M% U
            }$ j- {: t! H& k. Q& q' W' o
            *(L->elem+i+1) = *(L->elem+i);        
    , o; _7 e* E" \8 v    }
    8 t! s4 m. v: ^3 N: V: ?    *(L->elem+e_where+1)=e;$ i% }7 o' i) j( I8 i
        cout<<"增加后的线性表如下:"<<endl;
    ! \: M0 q0 }0 l+ ^5 _    ListShow(L);/ Q' H. P) U- P: E% X. ]$ S; u
    }
    5 N" [8 O6 a( d' O- d* `
    4 w; P' S6 v1 ^* L# Z- z删除元素# b" ~$ }8 d, g8 H/ i5 S

    # j# ]1 ^0 ^' K8 {" v) y! Ovoid ListDelete(SqList *L, int e_where){    //删除某位置元素
    & B/ p  b$ k" g0 L5 [    L->length--;9 S0 j( _! m# M/ M/ K2 r
        for(int i=e_where;i<=L->length;i++){
    : i' t3 `; S$ q2 [5 }        *(L->elem+i-1)=*(L->elem+i);
    9 x+ {0 z, k% r8 R6 T, t7 X    }
    7 U1 y1 |  t( n' w    cout<<"删除后的线性表如下:"<<endl;
    1 q. y5 ]. _9 K# E, j- a    ListShow(L);0 J4 |. \) v0 O) b' T
    }
    8 P# b" w' |! v0 u* O
    4 o( z* Y4 o! P) _# n% w3 X- p销毁列表
    3 r* p# E3 X9 z) g; ]9 I
    1 ~7 X+ G  ^* F/ ^: \' \3 H' ^( kvoid DestoryList(SqList *L){8 d; b& T, O0 v' |! }$ V# d
        int i=0;# Q/ E" n2 @/ f% N/ L
        for(i=0;i<L->listSize;i++){
    0 c% F/ j% D8 [# e9 l        free(L->elem);% |, K" I) x( A) K4 @* j
            L->elem++;
    ; m" O$ Y5 `$ ^0 i" H: w0 T! E    }% |. p9 t; X: N
        exit(0);        & }. L  f- Z0 J& x) t: m+ b" O) {) Y
    }6 x# {1 s) w/ D5 |0 g
    , Q/ ]  N6 h: O2 B5 D
    链式表示方法% Y' F# n) E; W* E7 U2 t0 p

    - ]+ A# ?7 @& W! E% z( z4 s- Q* }结构体定义
    9 H# o! {9 U9 U! }
    6 I; X3 \) }* q( S1 Ftypedef struct L_Node{6 H" Y& v% A' i9 ?: @, N; k
        ElemType data;: |; ^$ {/ Z6 z. G& f3 `
        struct L_Node *next;# O5 f. r. k* h1 w
        //struct L_Node *last;    //增加可变成双向节点
    7 Z( n& e1 u5 E9 w, V/ ]+ J+ J# O: @}LNode;1 ]% I" i+ d7 X  b+ f8 r- b

    ) i6 o8 k$ A4 j9 R/ V初始化0 `; R) p4 l: |

    3 B5 q) i# G9 ]9 Y* D3 Ovoid LinearNode::InitLNode(){8 w; t: v; F' e' ?7 \& U: t
        HeadList = (LNode *)malloc(sizeof(LNode));/ _# J% w1 `9 Z5 W! R, X
        if(!HeadList){
    " ^+ N# K  D: ~7 v        cout << "初始化链表失败!" << endl;
    9 C4 X0 \2 ~# n        exit(0);
    5 y. E  S/ T, |/ |  |    } ) A/ U1 w! X( g( m
        EndList=HeadList;7 L0 g5 X+ B& t
        HeadList->next = NULL;
    . S# P' _- P# u& A+ R- g    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    4 C* y; \8 V/ F, d4 _; k    Length = 0;
    9 g2 Y) A+ V+ ^, Z; }/ n    e_where= 0;
    - Z  R* }# U4 ^}' D2 t2 F2 B* R- `+ T8 \
    6 [4 |7 W( H& f% R) t
    增加节点
    0 P; R$ v  K9 m9 ]
    7 n' R9 w/ x/ F) j5 g% qvoid LinearNode::AddNodeHead(ElemType num){    //头插法 / [$ {& \; n2 h: J4 c
        node = (LNode *)malloc(sizeof(LNode));2 U+ ]0 b2 t  b% G* K/ R
        if(!node){% w- f) \" J; G
            cout << "新建节点失败!" << endl;
    8 \$ L& }3 [" D3 N* C+ X8 i        return;
    ( Z8 i6 ]$ B8 r& G! P    }
    5 h+ `/ `. C7 P  V7 A4 Q    node->data = num;
      B0 F  K: c6 D. v    cout << node->data <<"   ";
    ! x' o( G; F- l, R# f9 {5 i    if(NULL==HeadList->next){# F$ h6 v+ x4 c! e, o% v% S
            node->next = NULL;
    3 f7 D5 Q0 \$ d* z! d' n+ E& d        HeadList->next = node;7 x; D! W4 s: A; E" T
            EndList=node;( c( A  S# j' c% I
        }: Z. z. `! e$ C  c8 ?9 B8 M0 y9 B
        else{; `( o$ |- v/ A* U7 [4 S; V
            node->next = HeadList->next;9 D# `& t0 w: T+ [3 x
            HeadList->next=node;. J" {! ?3 h: Y9 e! T: f0 p
        }5 h, c( ]* v1 a& r2 d5 b  q9 w
        Length++;
    0 X4 p6 h& c; p- }7 A+ m}
    0 U( e- T: O7 o6 T1 {$ c  d, X1 }
    : D0 H4 M1 s3 \; q! Evoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    9 y# h+ D3 U" ?6 V: D    node = (LNode *)malloc(sizeof(LNode));
      w8 t& O* G$ j3 j, V    if(!node){5 a4 E1 x! Y9 D+ d
            cout << "新建节点失败!" << endl;
    : T3 o) J8 ^+ ]+ O0 ]        return;
    ! C% u. ], L) x  M    }
    7 o* h4 j4 j, l: t7 |, b  X    node->data = num;
    % I* f3 g6 f8 ~. ?- a' R: I    cout << node->data <<"   ";* i. L0 P# V3 a, Z6 Y; }8 S
        node->next = NULL;
    ; O, n: c; L0 v    EndList->next = node;
    5 l3 N1 t' |0 }% k% S5 r) b    EndList = node;* j5 O! Z& d) U# @4 t. F
        Length++; % ?$ S8 \" n. Z9 {
    }4 v0 I; Z/ J& m9 ~" j9 l- R* R" @% ?
    2 R% R5 ~. x% A* b& E5 e0 f2 d
    删除节点
    4 m' @: T6 _5 n* E, V5 z/ t4 U- d9 T: J& U9 y9 X
    void LinearNode:eleteNode(ElemType elem){0 c" C# W  B: r$ W0 r$ R: C
        if(NULL==(HeadList->next)){
    2 a; g- {7 X/ k* f& L1 P/ v) Y0 k& @9 ]        cout<< "无节点"<<endl;( S/ t$ K( l. I5 ]
            return; ' i, @4 n& j. @- o( {1 J0 o1 O! O
        }
    + D  m) P1 {$ ~) d7 o; ?* b. V/ A9 S    Node_cur = HeadList;' d: e4 o* r- I2 K/ J: A' @2 z
        while(NULL!=Node_cur->next){# t( @# I" ]) F8 s4 m/ F
            Node_temp = Node_cur->next;
    $ c- A! h/ @% p$ e        if(elem == Node_temp->data){4 j" K, I8 Y! Y( V
                Node_cur->next=Node_temp->next;
    & h/ j) G8 m" q. u0 [+ o( G            free(Node_temp);# P( T+ g/ M; p; C
            }# Z% C! V2 [8 a1 c- U8 C. i3 v( u
            if(NULL!=Node_cur->next)
    # I1 X3 D3 ?( n. J: G/ w. y        Node_cur=Node_cur->next;: r4 S" r- `0 _1 r( m/ \' i, a% l
        }; j3 _6 @3 F& ?; X: F8 F! t
        cout<< elem <<" 元素已删除!"<<endl;
    : j: e/ G0 ?  p% d0 o}
    ( `, Z- N; Z. i( w% r: ?1 D8 }+ Q- @  O4 D& T
    显示链表# Q4 s( p( x0 ~0 i$ R4 K+ z2 L. |

    + L. D3 M: r1 ^) m( {  Avoid LinearNode::ShowLNode(){! S4 ?" @2 U! U; p) q4 q
        if(NULL==(HeadList->next)){6 I( @6 V# o/ j" V
            cout<< "无节点"<<endl;
    ) I- [  }: E* {$ X2 ]: W. W        return;
    ! v/ M  _% i, ^$ a    }: u" l  i; e+ M% Y/ X
        Node_cur = HeadList->next;
    # l$ F" d0 B, J4 }    while(NULL!=(Node_cur->next)){
    ) z- z& F$ n! W+ F9 ?3 I        cout<< Node_cur->data << "   ";$ A3 Z, C8 v* w" Y" ]7 P9 ~6 P* b3 p7 s
            Node_cur = Node_cur->next;
    4 v0 m* |% a; ?- g7 x    }  S: L7 c5 X/ q$ C& {
        cout<< Node_cur->data << "   ";
    ; p& Y- v) w4 `    cout<<"链表中的数据已显示!!"<<endl;' N" S( k; E% l. X
    }  P, ~/ _8 S2 G7 u+ u/ I4 f' W9 e
    / G7 u% K) J1 x/ `. D
    销毁链表
    ( i2 P4 D( v$ N, n( p
    ) s% i; u! ^! f" Evoid LinearNode:estoryLNode(){" V$ |& o7 v1 b: }# X3 x* M+ e
        Node_cur = HeadList->next;
    3 C, L$ U" f. L8 G1 Q8 w    while(NULL!=(Node_cur->next)){: K  r: k- c/ x8 j
            Node_temp = Node_cur->next;+ S$ [5 r. R& O0 B0 O
            free(Node_cur);
    : ~; u* l1 R+ f% M, W2 t# G" {        Node_cur = Node_temp;
    5 v# z2 t4 J8 }4 j, X7 z    }7 Z* V$ C) G& g" R/ P; Y! {
        free(Node_temp);  W) f" C+ _  D+ {5 z2 m, v
        cout << "数据节点已完全释放!"<<endl;
    * w, n  p' k  ?9 v: R8 }0 y    free(HeadList);    // 释放头节点 5 M# e6 T8 k% r/ k1 j
        cout << "头节点已释放!"<<endl; - i3 ?9 m+ _8 R
    ————————————————
    $ E1 z! U5 K4 R9 E4 i版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 H% d' R9 o4 A+ p原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    9 W( w. h( {8 t- J7 O  K
      i3 u4 s! Y& W5 B  n" s8 W# q2 ^5 I- Z, L
    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-4-21 17:43 , Processed in 0.383048 second(s), 51 queries .

    回顶部