QQ登录

只需要一步,快速开始

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

      X% S/ \9 m( A( ]5 y7 w# g线性表顺序表示、链式表示实现方法及其异同点
    + K4 i( ?) f3 O; e7 S) r. S线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    / k3 U1 F3 w0 ]' q; `! ^1 m6 ?8 d
    ' y% h" t  b5 _% w3 P* |! Y* P本文采用C++实现两种表示方法。
    2 Y4 z* P  {  ?. E9 Q4 u
    4 y: }1 B' g2 K' J) d' x! e7 |! s目录
    7 m$ G0 J0 o4 T: `+ l+ g5 N  y. _6 X# N. b& M
    顺序表示和链式表示的区别:
    ! U# ?* S" A5 J5 b9 u1 P8 r, P- ^4 o! ]  f6 U
    创建方式:
    ) a$ k( L1 [% s+ t" L  O
    1 w5 B0 y0 P  \& i) m: |7 v' \时间复杂度:
    9 B1 m7 F% \6 ?# F) x" S* V, M
    3 ]1 J; a8 p+ T顺序表示和链式表示的相同点:
    + K" h7 L6 P' p, o6 y! v; K  j  `* x- q2 C
    删除内存空间:
    % c% g8 B: l+ L, V9 c6 U! N4 i/ p, Y5 E( K0 x
    代码实现:- l5 ]' V0 o- [8 L: ]* I1 M
    7 S( T: S7 {6 `9 w
    顺序表示方法:
    # \9 ~2 H' `2 j2 d! s. [6 c5 t/ ~  p$ k
    结构体定义
    " M' W$ a; J; [) M
    7 s9 ~4 V; t: w6 d5 X  ]初始化
    - X) O- Q% ^# r' s+ I: i2 X0 `, N) V- Q: G* H3 L
    增加元素- D6 M# B# D$ l. q6 L% L- e
    7 x/ `. `8 m8 w
    删除元素
    : Y! Q9 f4 l, h4 A# Q+ V8 k; {% S9 I" x5 V
    销毁列表) E8 X& P- l  F  {; u" R
    3 ^) c$ D, w# _$ b( g
    链式表示方法
    4 a, ?1 m( Z4 V* i' Z7 I! g: _0 }3 M& K8 ]  B6 p
    结构体定义
    ) E3 W& f5 E$ x' a
    3 d3 k! A& ?9 \3 k+ ?' r1 s2 ~9 {- V初始化9 }' F$ {) w8 W8 `1 a0 ~! _

    * X7 x' `, G2 ~0 f- i) E1 t7 y3 a增加节点0 y* a9 v& V! h4 m- i

    . ~% t4 Q1 p& J: ?. n* x, [; c删除节点
    ( n0 d7 h" q' T  g4 i& R% c3 y& l; q( h/ _. F( M+ \
    显示链表$ D- p/ t$ C! D3 u, T5 I  w
    " R' t( z/ y5 e' D+ U+ ^+ e
    销毁链表
    1 Y3 b  j1 P2 Z) [& z) ~$ t6 y( e6 I+ f' z( ~
    顺序表示和链式表示的区别:
    * B: N  v' u0 w& ~" ~- u/ n- I! e3 o1 p0 A+ c
    创建方式:* R, _2 R$ |* v

      @2 R7 ^" a- r. Q* H顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    ; T/ L: c  h' A& ^* i4 w' O
    . A& r3 ]2 O" F% n; u(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    + R" d  G0 ^* K% g! v' ]+ K9 N1 D8 f0 T2 O+ R) [* K9 f
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    ( a0 g- P- y4 D( G, X, k0 i, {5 C1 n& j& K& M1 g6 q5 F# ^" V* T; S
    时间复杂度:
    4 Y) p1 F$ V6 p7 i1 _, Y& X
    % a6 a/ Q& }0 s+ e# z/ m3 z0 u增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    + M' t9 m& |- I- P+ B: D1 m8 P$ l6 i; P) ]' [
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    ' H6 m2 E8 C% R& B! f; H9 I- O" K% c0 ^3 }1 K+ s' G# E$ [3 B
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    " O$ D3 Z+ F8 g& y: V  y5 ]1 e  W# b3 ~) g2 K
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);" ?2 n/ c) J( a& N

    * n& x- v' q7 |1 S% r- n( |; z查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    4 j# [5 |* V! b( L( a3 Y, g# s+ ]8 X- k& p
    顺序表示和链式表示的相同点:
    / S% ~! N/ Z( I
    ; S8 p/ n! ^) h# M  ?/ e8 O7 M删除内存空间:' `# @7 u) Y6 E1 V

    ; @: K$ Q6 t2 l内存空间的删除都需要对每一个存储单元单独释放空间。* M" y; p0 a% ^
    6 e- E4 f; N) A  o. |% _* e2 V
    代码实现:
    ) d5 z, g' |7 w9 `+ u: D% B2 I( W1 T4 E- s3 M( R1 q
    顺序表示方法:
    0 M; C; ?7 X& {$ m7 }
    $ b4 g4 ]9 j; D; L+ `/ E! P" z- h结构体定义; I* Q  ?7 e7 W2 S, ]" k( K( G. c

    $ @% l) @$ W" ~6 d+ Ytypedef struct {$ p3 K1 R: v0 W& C7 z
        ElemType * elem;5 }, v4 n5 R- Y0 ^6 ?- E% r
        int     length;        // 线性表的现有长度
    / {) i- V# G: B5 h    int        listSize;    // 线性表的最大长度% ]' V! l4 v( O8 V# \' }
    }SqList;4 D1 }7 J1 K- X6 H1 ?6 c4 ~7 ~' T

    9 A4 ~' }1 f+ f% ^) i初始化
    " }0 Z( i5 b, r; S! ?' z% h; X' Y" x, E4 z4 W
    void InitList(SqList *L){
    ' k; a- s1 Q) Z$ I    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;1 c$ j) c* X" Q+ [. [, f
        if(!L->elem) {
    ( P4 ^, T* u8 v2 y& P! \4 l2 ]7 X        cout<<"申请空间失败!\n";
    : O7 S+ C5 \+ S% k  l        DestoryList(L);
    : h) F# N9 q8 ]5 w8 i- e    }8 E7 E& ^2 D/ _
        L->length = 0;
    " x3 ^# |0 r7 F" y# E    L->listSize = LIST_INIT_SIZE;
    % G" ^1 m# z& f& W1 v( F2 g9 J# K    cout<<"线性表初始化完成!\n";# B& x5 K$ a- H# ^* h9 c
    }
    ( c9 M$ S1 I3 d0 u/ z- Y
    . A: ]; b. S0 j+ j4 M增加元素1 m. D" d$ ?" `* K8 G; ^, h$ z
    4 e* t) ~- P$ Q6 c' M2 s2 Y, W8 A
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素0 y/ v+ A) p- b( a% V
        if(L->length>=L->listSize){- ?% i1 y- t+ Z
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    + ^! G" U1 H6 Z+ |9 A/ v        if(!L->elem){& J9 o. F  r4 \: c/ u" |% n
                cout<<"增加空间失败!"<<endl;9 Z2 ~, L7 c7 j6 Z. ?( Y
                DestoryList(L);9 ]( d1 V5 W# G" x- O+ Y
            }5 V: v& s1 t8 t1 {
        }0 F/ X: ^  [% ^' u  _7 I
        * (L->elem+L->length) = e;
    - l$ P$ _0 h! |% @" S' f9 \    L->length ++;    2 @$ B3 u1 L5 g
    }/ N( Q' F) L; `
    , d6 v. ~$ s& d: G
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素6 C2 D+ x' o  \$ C' g" a( _& g
        int i;
    4 {0 _7 S' v6 @2 V! s    L->length++;
    . Q' Q: T+ @9 J    for(i=L->length;i>=e_where;i--){
    4 A& r( F# x# U$ L* n+ u: A        if(L->length>L->listSize){
    # k" X5 P: x& B# k, M            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));( ]2 B- B7 D$ f) o, b+ t9 ?
                if(!L->elem){  p3 ^+ o3 N) G: c
                    cout<<"增加空间失败!"<<endl;
    ) X( S$ A! }& c" I; y% _                DestoryList(L);
    ! k" a3 S7 v7 E6 Q) }4 D            }
    1 }" ]& t: N+ G2 F( y, U& g        }
    & o& P( s# Y6 |9 i/ F        *(L->elem+i+1) = *(L->elem+i);        
    2 m: |/ a/ y5 x. s- ]$ H    }
    7 c1 g2 n! Y' f0 n3 a    *(L->elem+e_where)=e;
    : `- Z5 X' K! D! e$ j7 S1 A    cout<<"增加后的线性表如下:"<<endl;
    $ s, V% w; H4 i& U6 M7 U    ListShow(L);. F- Q" r! L' e' M) X9 x" p+ S. W
    } 2 n6 t9 X7 |2 M4 j
    - |6 B) k; Z# E: P; ?! Y/ Y
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
      \7 Y3 ?+ q2 C+ P$ J* E; [7 m    int i;
    8 n6 I- s, D) ?8 ]2 R- X3 f* \3 z    L->length++;) c. U* [  G2 M) M# t- g7 f) z
        for(i=L->length;i>e_where;i--){4 R2 }  v; O. f# p2 J
            if(L->length>L->listSize){- T4 d7 x3 {* x5 }9 o( a9 f1 h
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    4 }/ O5 r0 L2 _# U& B6 K% h. {            if(!L->elem){
    " H' }; W. E% W. H( [9 E% f                cout<<"增加空间失败!"<<endl;
    & f1 ~  @: e. Z5 y6 N. k                DestoryList(L); + m5 \7 e6 }; B6 f# v' A) _
                }
    " g1 L  H0 i5 @! }* g8 S        }
    + N$ Q! @$ i/ f( {# O% M; K/ I        *(L->elem+i+1) = *(L->elem+i);        
    3 b& G! @" @- K2 T* T    }
    3 d; h/ K4 y- z/ R- i  p    *(L->elem+e_where+1)=e;7 J0 d& U8 o5 ?/ x( k: l1 ]& h$ T
        cout<<"增加后的线性表如下:"<<endl;
    1 Z. j( W/ z! f& i' F# S    ListShow(L);/ b" W# o. n! X: E- K
    }% ?) \1 I7 y/ W8 J, S' y1 T% [

    : f3 b. k4 W6 A# i; I" D. }  x7 U删除元素" h" ^' e, b, I0 X" y
    # j$ L4 J2 y: A" `/ o
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    % M% ?, P9 M6 K    L->length--;
    9 Y& I4 t3 h" t* b; R: ]/ r2 D    for(int i=e_where;i<=L->length;i++){
    4 u5 D& h% q9 Y/ \: B) h* a        *(L->elem+i-1)=*(L->elem+i);) \' J) z2 r- d+ Q3 H4 i0 {+ a
        }) {; v$ n( N8 d6 s
        cout<<"删除后的线性表如下:"<<endl;
    5 p# i  }6 j5 C) M7 v; l, r" h7 d+ h    ListShow(L);
    - [: ]0 a( ]3 ^% z4 m}
    1 f4 B9 f+ a& K9 L
    2 d: A: v' T6 J+ m7 U; z4 m销毁列表; G3 i7 E2 Q, e1 Q# M4 p  q

    % M  ~# e: H' e0 j* f2 b8 W+ Zvoid DestoryList(SqList *L){# ]: M8 x. Y0 Y) _- S) N
        int i=0;5 G* D+ T5 D  Y$ Y
        for(i=0;i<L->listSize;i++){4 {/ ?- v3 l" k% v* C" F
            free(L->elem);+ P4 N# A8 Y$ [) z& _: F* c5 `* s
            L->elem++;
    9 E! T! t3 M0 T0 S% [( c$ q    }3 F0 R& o" ]7 Y: H+ }9 T
        exit(0);        ' G* U6 [, E, x! g: t
    }
    # D( T( B# A% ~/ }8 |# U: G& _7 p5 N; s
    链式表示方法
    % n* {' \$ e2 d; b3 @: W( K* j+ k* P7 S! s# j2 H+ n! I4 W8 ^
    结构体定义
    8 ]: P- ~5 l2 l$ \6 F3 b7 D, x/ a0 \- [6 {# n# K
    typedef struct L_Node{
    ; f+ R3 k3 Y$ J4 |, Z* `! {    ElemType data;% K  L, I) h! h! e
        struct L_Node *next;( c2 s6 ]( H1 M: _% r3 o0 C
        //struct L_Node *last;    //增加可变成双向节点 $ h  |3 H( E! U) ^5 k1 C
    }LNode;* I$ Z9 \( D) ]4 Y

    ; P. l: ^5 |0 [' K% v2 t初始化$ T2 T3 j5 A1 s8 {+ O3 \4 h

    ( b  p) `7 `9 g% Y1 g1 a$ Uvoid LinearNode::InitLNode(){& ]. z  a) Z) W! ~4 f( n5 r
        HeadList = (LNode *)malloc(sizeof(LNode));- r, @8 Q7 u# a+ |
        if(!HeadList){1 t% \3 B5 r# H) O% ?0 P! J
            cout << "初始化链表失败!" << endl;
    5 ?- V5 b" D- j0 P: A+ I! y6 B        exit(0); & o3 i8 H' \% H1 q, @
        } ' o) e- e) f0 S+ [2 c8 o
        EndList=HeadList;& E& e) Z  y5 I6 B. }9 e# I8 j* A3 }
        HeadList->next = NULL;$ W* y* i4 C3 \8 u4 C# u( q) C
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;6 `9 w1 o5 c( V) J1 A" N9 p0 i7 M
        Length = 0;
    , K# v/ x: w& O4 }4 I1 u/ e9 ]    e_where= 0;
      p1 t- R- F$ G0 `9 o5 x+ P5 n}7 Z' t" b3 G9 P6 z+ ^$ U# F

    5 r) W  ~1 k- R# y' ?- E增加节点6 a. q. a  Z* M9 {/ N6 G; G

      y3 o9 x' r6 B3 I4 fvoid LinearNode::AddNodeHead(ElemType num){    //头插法 - K/ m0 t. K. _. z
        node = (LNode *)malloc(sizeof(LNode));
    3 O+ F, n/ l6 I! R    if(!node){
    2 N; S6 }6 m- q/ ^% s$ W( @5 O        cout << "新建节点失败!" << endl;   w; _, T6 a! b' ^) D+ m
            return; 1 m! d$ j  G( r5 k- f
        } 9 e* ^5 X9 y0 G, p7 M+ \
        node->data = num;6 f% F& |' h# }6 P
        cout << node->data <<"   ";
    % i; O: K- G* D    if(NULL==HeadList->next){& y. u# S, c! t- T6 h/ k& y
            node->next = NULL;
    " }! c+ |  D  v& L+ S$ A- \        HeadList->next = node;" ~1 f: _% w/ K- G$ S. \: |
            EndList=node;) K% C/ U4 ], s6 o/ Y+ Z1 I- ?2 O
        }
    . A1 k; c2 h: H1 D! ~0 u2 j    else{* c# r1 ~# B0 |6 v7 C* C  D1 t
            node->next = HeadList->next;/ W5 n2 a3 `+ Q' G/ w0 r8 p: s
            HeadList->next=node;
    / E" l4 E) l9 |; `5 W( C    }1 Q4 D' @6 ]8 w: x
        Length++;
    1 m& d9 K, P" M& |/ g: J  W}$ K, v* p+ N, m7 W( [6 `: @
    2 O: J' J& T" N/ N" L% N
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法 " z0 {  M0 [( e1 r" X
        node = (LNode *)malloc(sizeof(LNode));+ [, Y; k/ {3 n9 v' |) J) }- v
        if(!node){0 q) W5 Q" m( A. l
            cout << "新建节点失败!" << endl;
    $ e1 Q5 E3 T2 J  C. f- \        return; ; ]% e) ^. E5 W- z% {. g2 A8 Y
        }
    ' {7 E  y& _4 y4 e* X    node->data = num;' x: {3 w3 |. b5 }/ r' f; l
        cout << node->data <<"   ";5 Z! N) i8 @$ n  o  v5 a2 s+ D* z$ y9 I
        node->next = NULL;
    & p( }; ?- X! S  U3 `" K    EndList->next = node;
    9 }" Z! H3 B' U7 F    EndList = node;
    ' p: z& c  K) h9 B' k    Length++; 8 H' [  ?3 b. Q/ k' u- \1 X+ u) e
    }! L/ U" k. o: k. R  h# X
    % e/ M4 G/ Q. P. u/ G0 k
    删除节点- w* ^  m5 {% u0 x5 U& |) H
    , N6 ?$ E3 R) M1 m  J
    void LinearNode:eleteNode(ElemType elem){
    " z/ l8 r* T/ N/ _1 G7 b" y$ y    if(NULL==(HeadList->next)){
    ' z8 ]8 H' J" t; @4 m; }/ ]: L$ b        cout<< "无节点"<<endl;  q' X8 w/ B5 q! e: @
            return;
    ' I* q* V- M9 }3 {: }7 \    }
    ' _( y, L; p& x+ A    Node_cur = HeadList;
    - {+ L1 t7 ^% f5 I/ j! f    while(NULL!=Node_cur->next){* C' Z; t/ M3 F1 i! c5 H; J
            Node_temp = Node_cur->next;
    " ?- r; G8 x* Q' I        if(elem == Node_temp->data){6 b  x! |* P% N1 q; R
                Node_cur->next=Node_temp->next;
    0 i( f1 {8 e  D1 z            free(Node_temp);, y) H  E5 ]" t3 l, P
            }
    0 G4 e5 c6 u6 X5 g. X9 L        if(NULL!=Node_cur->next)
    9 g6 F, O& v+ i- Y0 U2 V; q        Node_cur=Node_cur->next;
    # U2 @& N$ Y  t+ j( d, ~    }* `, B5 N; H9 D! s& ~& h
        cout<< elem <<" 元素已删除!"<<endl;
    ' W4 @! T; Z" U; n3 M, S, |} + N2 r  O6 d, b) Z4 X* _
    " I9 p7 L1 z- o: Z3 |
    显示链表
    $ |7 n8 ?* b3 A) m6 l+ g  b8 q4 g/ J% Q/ m- L
    void LinearNode::ShowLNode(){; Y5 D% a! z2 _4 `4 ?/ O) E
        if(NULL==(HeadList->next)){
    6 ]4 f! B& U: O$ v        cout<< "无节点"<<endl;
    4 h& d' y% [8 ^0 y8 P        return; , R4 Q! R* T1 I) O2 i
        }
    , I' U* M& M, _- Y& ^5 {' G    Node_cur = HeadList->next; ) x7 ?" F; {0 K% t# ?) j# b( H. e1 s
        while(NULL!=(Node_cur->next)){
    & }* G; S* F* f7 Y: [4 @        cout<< Node_cur->data << "   ";
    7 m: i' m6 |$ G4 t2 {        Node_cur = Node_cur->next;( Y: t+ N6 ?: e: U0 L* M% r0 C5 E
        }
    4 n" N6 c8 L. x3 y* t) V  F    cout<< Node_cur->data << "   ";. Y& W9 ?/ W( |- a8 X( ?; g
        cout<<"链表中的数据已显示!!"<<endl;
    9 C5 p7 A# g; t}
    3 c/ D5 z! d, H/ I; {& X* z9 ?+ N0 E
    & }7 r* Q9 o$ A7 s8 e& G% p4 p4 C销毁链表
      m3 [+ `$ a0 H5 n1 O. t; d4 E1 F, j& m+ p- ~6 n4 x
    void LinearNode:estoryLNode(){3 e. a) H* M' B' ^' H0 @
        Node_cur = HeadList->next; : Z, f, O9 v6 s# l
        while(NULL!=(Node_cur->next)){
    " H, b( Q$ n, [; l4 R2 v5 r        Node_temp = Node_cur->next;
    . O: ~+ k7 n6 M% F8 I; b& w  _. A- [        free(Node_cur);, p- ~5 \9 n# v5 y( o1 _# Y
            Node_cur = Node_temp;6 R. H' c' P' G2 C; o" C' }
        }3 {: x1 a% H; n" [* ^, S
        free(Node_temp);7 h3 X* V- e* M* c" f& l0 {# l
        cout << "数据节点已完全释放!"<<endl; ; i1 Q% l! J- J( v7 k# j' u
        free(HeadList);    // 释放头节点 $ d& u- Q' {1 ~& D  W+ Z+ C' [
        cout << "头节点已释放!"<<endl; * P3 ^& w5 M3 F5 e0 F) p
    ————————————————; {  [' d. y& V" [% d
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % t2 U  L0 Y+ d2 H原文链接:https://blog.csdn.net/Baimax1/article/details/106036286* j& F7 n8 w) ~8 A  X6 |8 z  d" L  f
    : W: L) R* N9 G6 t
    & c' m! N! j& `5 R
    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 14:45 , Processed in 0.425053 second(s), 51 queries .

    回顶部