QQ登录

只需要一步,快速开始

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

    6 q& ]9 I- A5 o% o线性表顺序表示、链式表示实现方法及其异同点  b& ]4 q* J; j+ s! R# t' D
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。7 ~3 L6 R7 s* M6 N0 m

    6 k9 W9 C9 a$ T本文采用C++实现两种表示方法。7 O7 L9 i& @9 s7 G0 e" I" j- E5 m

    6 k& n  q2 ]# u+ @; W7 l目录
    " u" z5 W3 Y/ E# ?3 w: a5 ?0 B& a( r8 s5 i0 P1 Y. d( Q5 a4 A
    顺序表示和链式表示的区别:* ~5 l3 J1 l9 n( V) s/ L, P; V

    & P- a' {/ R% }5 a7 ^创建方式:
    ' }: `* i4 m/ [  a
    , C' {& W, T8 k$ w8 H5 _时间复杂度:2 W4 P, W2 F' c: n; j

    $ i2 H9 B4 c7 G1 _6 i/ \顺序表示和链式表示的相同点:; G( x" J6 u" t" Y7 r( r9 m

    8 h/ C4 e6 n0 Q& t; y删除内存空间:
    - y" W7 g9 \5 C/ |2 ~
    / R( n  g( Y' s/ B5 B% N代码实现:+ i1 V- X- P) Z3 _

    & F  U" q  T8 i' u顺序表示方法:0 v  n' n0 J8 `4 W" |9 F* K
    ' b+ z+ v& P: ?5 `
    结构体定义
    , C: c5 q( ^4 D  }( s0 I3 Q; ?
    # |/ D+ [5 h% _6 u: m1 w# p初始化
    - S& v) W  Z$ b5 K( E' t
    $ U+ f; |' ]1 O$ H( e增加元素- @! _+ g7 s( }6 q0 g8 R: R4 z

    ) B) h% e' [+ @5 y删除元素# p: \4 b% K, i6 \2 p- R
      p" q9 W$ Q" c5 u
    销毁列表
    1 B5 T# |* s( E9 A, F/ _: I% {8 S
    链式表示方法* C( U* O; w5 t% A7 o
    / a+ Y" S4 }& y' c( z, H( J5 {' @- d
    结构体定义
    3 q) s6 p& K- p% E% L8 I0 m$ C0 b4 _0 q* C& H) b. v  J
    初始化4 C% q8 P1 z& }' @) t( b
    8 |+ j% T/ h3 G  X
    增加节点
    # y. i# g9 o8 F( k6 Y1 e6 j3 `' l5 d$ ^% |& e
    删除节点& l: Z2 I* X# q

    6 P7 e) X' s( r$ R. i显示链表
    7 D4 W8 b) [' W9 l3 C  O7 {; p; k4 v/ s; P* N% a- o
    销毁链表
    + k! C! L+ o* C: a9 S$ A/ x( e
    4 M" R, F6 m) S  [2 {顺序表示和链式表示的区别:
    % o( Y* ?. |1 L% C* @$ }* K0 b2 T9 e) n# W- n; _: i, a
    创建方式:
    * u6 b. I  ?- K& y5 o. `! s! Q1 ~+ L' U. s7 k1 y
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    7 l3 F* i5 e# p5 ?+ ^0 }" h. x( f+ j( r& g5 h* S  w: v
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)2 D/ e6 s) G) T) e- I! \* z- F

    2 z2 r8 |- L( c% s$ p$ A链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    7 q5 C- ], h1 G) }/ [6 {- u) Z8 p" K4 i6 ]7 S( W
    时间复杂度:1 X/ a/ O9 k- O- e

    / z4 [+ m* y* V4 o增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)' o5 Q+ }* Z5 s7 p5 {
    # v  M" x; W0 u7 h
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)0 U! r3 B( j- Y& j3 ]

    * r% ?9 ~( F/ j  R( IPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。# ?+ D6 _) ?. D  L
    9 ]7 }7 M8 Z6 P2 t" `4 Y
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    6 u" T3 k1 f" e3 H' v
      g  t6 ?# I5 S% B3 l查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    - Q9 a) j3 T% o. {& I& y* h  k& F
    * `" R* l6 M' ^; @# n顺序表示和链式表示的相同点:
    ! Y% x2 t# O* w4 Y, g4 S: r0 N9 x& |2 `( t4 F% P* g
    删除内存空间:
    , N& J% k" M8 I# r& v4 V1 F2 p9 v, A  G/ E
    内存空间的删除都需要对每一个存储单元单独释放空间。; |0 x3 \3 h4 ^7 n; ^' N, [. `
    / [) z9 q" V# l; V: M/ T
    代码实现:' z' `0 Z  [1 e4 I; j

    1 C* ~; M- u  f/ C5 X& A0 r顺序表示方法:
    5 x% v  t0 U! S! }/ p6 H# n
    ' k+ q" O5 m$ E  F2 [% P; v' [结构体定义, e4 x0 ]$ U  d+ g
    ! J7 U+ _5 l4 J$ {% z
    typedef struct {
    ) Z3 g9 d* W$ I1 g    ElemType * elem;: K9 Q0 s: w( ^2 S5 P$ U$ i
        int     length;        // 线性表的现有长度 3 h% \8 P, H: G, x" X# o
        int        listSize;    // 线性表的最大长度
    5 I% `" L: S$ r0 S# o& b}SqList;
    7 S8 S2 C) Z" l% ]- E& e/ P  f2 f9 t
    初始化
    / L6 \% h2 ]* T; H& w1 u! |7 Z4 g6 b8 D9 E0 L
    void InitList(SqList *L){' R" Q; ?: K! X) O- P& R3 k% O
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    ' |" U2 K, Y( Q    if(!L->elem) {4 A! O% h: W5 n: k! I
            cout<<"申请空间失败!\n";
      w" a' ?$ ^- h: U8 p        DestoryList(L);
    , s) O- }, s; K3 Q* U    }
    ) b% Q4 y, Z8 Y% a    L->length = 0;
    8 A" g9 e8 m" d  a6 \: g: J! q    L->listSize = LIST_INIT_SIZE;
    + R' V  P4 b0 J1 \. {! ?: q    cout<<"线性表初始化完成!\n";
    " W, e8 f6 k$ f$ H4 Z% e2 f$ J}7 A4 B; }) a6 `; C8 B
    / s( C" O/ c! ?9 @, E
    增加元素
    ) r+ m5 w% A7 \, f! `" q6 _
    . o0 m$ |. A$ S1 u0 p: Nvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素& _/ a/ y* y' L. ^# Q. y" U: B" A" j  \
        if(L->length>=L->listSize){
    6 K! u4 O0 ]3 |% t        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    ' C" B% g, u: _$ d9 E        if(!L->elem){) p% _1 y6 O6 m+ X
                cout<<"增加空间失败!"<<endl;* _% y$ M9 M0 ]* H
                DestoryList(L);
    1 H9 C! T: R6 X* \) f: g  H  Q        }3 G/ i$ o* m# v0 ^" ^
        }
    " F" o8 D$ f2 h    * (L->elem+L->length) = e;
    6 h( s. l8 p' u/ E% l+ Y8 |) T    L->length ++;    6 x0 R9 D! R+ n# \3 k
    }
    9 h$ n2 v: X6 U2 z& V/ W1 W
    0 F  o$ _4 F2 r- ~" H! A& N- Kvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    ' ^( _! c# T& \" @9 |3 b# |' I$ h    int i;
    0 e( D* Y4 x( [' Q& ^    L->length++;( M% [$ H; [+ c
        for(i=L->length;i>=e_where;i--){6 s& a1 a5 W' |0 Y$ F
            if(L->length>L->listSize){1 [/ l1 A# i" B
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));/ x, _& |: y! ]6 d$ e
                if(!L->elem){
      ~* o) H4 y/ O- p2 \( s  Z; u                cout<<"增加空间失败!"<<endl;
    % r+ ~+ _, n; A2 D                DestoryList(L);
    + K6 T8 @. |: b$ E            }
    - K- \+ |* q% q2 z+ h$ ]3 n, l6 H        }2 N$ i* ?, [# U7 b1 Y- L* H( P
            *(L->elem+i+1) = *(L->elem+i);        
    ' ?# i# D5 P% X9 U, W3 _. ~1 J* f    }
    , m) _) C( [/ O    *(L->elem+e_where)=e;- R/ a. M8 |  J. E5 j8 T
        cout<<"增加后的线性表如下:"<<endl; . c! q6 {1 n& Y4 U4 |
        ListShow(L);( w7 k/ Q% v5 |+ p
    } 1 }) e8 i2 E9 Y

    5 x' p0 K4 O5 m# g" j  {void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    ( c8 s+ @' {+ o! B    int i;
    6 P5 P# z2 l3 D$ d" C0 o    L->length++;
    4 }( y6 P, f6 O    for(i=L->length;i>e_where;i--){
    5 U+ W' k# D$ f9 }        if(L->length>L->listSize){! l; B! }0 i3 l7 ?! c9 G7 g
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));, C) ^& Z+ p7 V. `1 D5 M
                if(!L->elem){
    2 S+ q, c- N' M( j                cout<<"增加空间失败!"<<endl;% C7 P4 M7 q: X" M
                    DestoryList(L); , D) r7 k- i' Y! E. ~% w/ e* y2 }
                }
    . I. f" T, d9 e: U4 a. k1 T        }1 ]: C9 r5 E/ |% J
            *(L->elem+i+1) = *(L->elem+i);        
    " S2 \' R/ |4 J' E  {    }* b; C& P$ f: L2 _" u
        *(L->elem+e_where+1)=e;
    7 w+ O* K. l# r4 h" ~    cout<<"增加后的线性表如下:"<<endl; . @3 m8 d# v; j8 _: w3 h2 L
        ListShow(L);
    ( s% v, h+ x  ^! [0 L7 R$ n}
    % d) r' {/ A- R+ C- E
    3 [  j4 k3 _* K8 P删除元素
    ) V! S5 L* H6 L, a5 @5 Y- x; [) o  g& k
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    # C* v* E+ G- J0 K% A    L->length--;1 `8 ^6 e3 Y1 A. S* w
        for(int i=e_where;i<=L->length;i++){
    / }# ?& u1 q1 x  f; B        *(L->elem+i-1)=*(L->elem+i);
    ( ^% }: ~9 h, M8 \$ H' D5 v    }2 M8 ~4 x. J" |
        cout<<"删除后的线性表如下:"<<endl; " z7 `- d" C9 c0 J+ s
        ListShow(L);
    9 ?9 t' f& x! f* g: y- |9 J}. k" C- G& f5 u; d; C
    8 K2 N8 ~$ f1 k) i0 L9 P  v2 Z) j7 B
    销毁列表" h. y1 X8 u9 _3 @, l
    ) ~2 v" O3 c7 E* [6 U' u
    void DestoryList(SqList *L){' z! j0 V' h8 W+ }0 Y5 D* b$ _
        int i=0;
    ' r6 C( J( c7 x: W) G: P: b* W    for(i=0;i<L->listSize;i++){# M8 s5 |$ c& T. q6 d+ \
            free(L->elem);
    * H% h" e, ^" o9 r' K! u        L->elem++;
      v  D. \2 `3 F! Q4 E    }
    0 y3 f' H: A" z2 T: }0 H    exit(0);        5 D( t" M/ I9 q
    }
    ! X, W4 e! |3 v) k2 Q4 A3 n) m( p, e
    6 d$ A: r" F6 h- h$ p) V5 m链式表示方法
    5 z5 T1 n; R; N0 b. \- I9 d2 W! W
    结构体定义. d' g1 H0 C( J

    5 r/ O& Z8 t" F# R5 i; Otypedef struct L_Node{
    4 `$ W8 c5 j9 p    ElemType data;
    0 _# f5 A. P3 P8 O    struct L_Node *next;
    8 P" w% r6 }" V2 ^    //struct L_Node *last;    //增加可变成双向节点
    * M- |5 k9 d& [6 h6 x) y}LNode;" N5 l  F+ Y! s+ ]  R' r$ }6 j

    % t3 x. a  q" J" n- B6 u初始化
    # a: [$ k! K# o
    1 K: [( W9 p7 g; {! H; dvoid LinearNode::InitLNode(){
    3 p: `5 {: j1 M; u2 q- |    HeadList = (LNode *)malloc(sizeof(LNode));8 b$ p+ \' g; I7 ?. L
        if(!HeadList){1 D/ O0 u# F  G
            cout << "初始化链表失败!" << endl; , e4 V; p* X! n
            exit(0);
    / [& z  H% J; l    } " d7 Y( A$ V; k& g' B/ K7 a
        EndList=HeadList;
    / N" ?& t/ }& p5 Q: M6 C' }    HeadList->next = NULL;
    2 p! C/ W7 h' M2 @, ~    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;' A& @) y% B+ ?3 g
        Length = 0;
    5 V3 r) Q5 g6 I2 m    e_where= 0;
      R' W( v% L* ^# B4 t}
    ( v- s2 u& w" B, C# z/ e+ c) |! u: a) W% R: _+ [
    增加节点
    ) J1 h/ `! y1 }! i2 [2 X1 k3 ^. V" e3 F% @+ g8 o
    void LinearNode::AddNodeHead(ElemType num){    //头插法
    & Z6 p, e9 v0 X$ r    node = (LNode *)malloc(sizeof(LNode));& c' B2 P. T+ P9 @3 j9 ^+ w3 T
        if(!node){/ _, b2 R# u5 l2 b
            cout << "新建节点失败!" << endl;
    - T) h; e1 D3 L+ y8 _8 m# ]/ U        return;
    ; J- X3 t, N6 u7 z; E    }
    # r& O: H" v, n; \* M5 \) v    node->data = num;. Z! n4 r+ T2 h! r( n% `
        cout << node->data <<"   ";
    ( ^, e+ b( }' L& I    if(NULL==HeadList->next){
    ) a: ]3 N8 d! P# f6 D2 v        node->next = NULL;: {2 q6 I4 D4 D( n0 s8 e
            HeadList->next = node;
    7 X* w+ f. x  V) a% k! w7 \        EndList=node;3 \6 r: o3 I% D3 F
        }+ }- G3 x1 u7 U5 j$ L' C8 g
        else{
    . N  f- h1 X% w' F- z1 a$ r        node->next = HeadList->next;
    & ?4 V& u1 e( e: `$ c6 V. a' K& s        HeadList->next=node;' r- h% r, V; S8 T) X
        }
    , @9 m9 g/ A# {1 M) |8 P& _    Length++;
    ' X/ G( J  @& c4 c" s}
    0 w( c% y- B0 z
    7 Q2 i$ g" }% W" @  y& c- s6 C* Jvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法 9 c. s: E; |9 l: S$ e* Z
        node = (LNode *)malloc(sizeof(LNode));1 _3 l9 O9 U0 ~
        if(!node){
    ) H  f. ^  u9 u- q9 b0 a* Q" X        cout << "新建节点失败!" << endl; : D1 L! v# Y1 s: l
            return; ! W, i$ `) B) N8 }
        }
    2 M' W" s' W3 f    node->data = num;4 [/ C8 o4 `3 h  D3 g: G1 N# ~
        cout << node->data <<"   ";/ m0 o" ]* m$ G+ O
        node->next = NULL;  S: Q5 v3 B, s( x; d0 @4 f2 B! \
        EndList->next = node;
    : o8 O* x) J8 K$ }* A    EndList = node;
    : d9 G% a% n- W) {1 V/ t    Length++; $ s" B' l. u7 ~) K
    }/ ~9 i5 i( L; k5 p" i6 C7 {! ^

    - D6 c  z4 x6 @6 Q删除节点
    & C3 K0 \* O6 p7 r: o2 M8 U, H5 n' H, q
    void LinearNode:eleteNode(ElemType elem){* u: {+ m- u7 a  {/ M' ]. a4 e
        if(NULL==(HeadList->next)){, N6 @7 L2 e9 r2 C6 E9 ]
            cout<< "无节点"<<endl;3 w0 N7 Z# [. b% K  o
            return;
    + ^! ?5 w# d9 V8 O6 n3 ~" j    }/ B* c5 h5 t+ e7 q2 i
        Node_cur = HeadList;7 }! i- {) h* w& w# b& m# Q. z5 k
        while(NULL!=Node_cur->next){
    ) i5 o5 g3 @8 ~+ Q6 y, T: z        Node_temp = Node_cur->next; / r' F4 f: P$ q1 t8 X+ W: I$ n
            if(elem == Node_temp->data){
    / a, ~( a: @3 I9 Y            Node_cur->next=Node_temp->next;
    " ^% b  }1 R+ S. d1 F  A/ }            free(Node_temp);
    + O; ~1 A+ @, o, _        }) R* \  z( l' Q7 L  J. K
            if(NULL!=Node_cur->next)7 J+ u  n' J8 x) c) G; B- }
            Node_cur=Node_cur->next;
    # p! R% L/ _( z    }
    $ k: p9 m+ r+ z! U0 j' f    cout<< elem <<" 元素已删除!"<<endl; : E* w" r* b9 f2 P- Y0 S
    } 9 S$ [' Q: O4 Q5 N
    5 v; z' T; t; G: ~5 R$ K3 a. O6 _
    显示链表$ u, e1 \2 e; @
    1 ~- n+ R7 n+ y/ t
    void LinearNode::ShowLNode(){
    - |& e3 e% v# h) F$ R# G8 f    if(NULL==(HeadList->next)){
    - Q! G# A$ k7 ^( @' _! Q        cout<< "无节点"<<endl;
      r8 F9 o! W- R- L- ^5 X        return;
    / ~' N8 ?6 M2 Z5 O0 A1 y- K    }! W0 b* ?1 ^4 R: O' c
        Node_cur = HeadList->next; ; g6 Y5 @+ g- B' M. K
        while(NULL!=(Node_cur->next)){
    3 S6 M, z8 l" X3 X        cout<< Node_cur->data << "   ";1 c7 N) G$ J# l/ b
            Node_cur = Node_cur->next;
    6 {* Y& b" K, J    }
    5 J7 Q3 R4 A- d9 n    cout<< Node_cur->data << "   ";
    ) ~" @( T3 O/ V8 M  t; B+ Z    cout<<"链表中的数据已显示!!"<<endl;
    ) U' u' c& s- M! O1 H}
    3 \, @. c, x. i
    $ H, Q8 |1 n4 W6 i5 H销毁链表+ e2 W( J# x" p5 t- b2 A

    ( `( ~+ O( ]$ H+ Y  C; _void LinearNode:estoryLNode(){
    ( ?$ `9 }  ?1 l    Node_cur = HeadList->next; ) \4 n9 i4 w1 @$ L
        while(NULL!=(Node_cur->next)){! p" E$ f$ `0 B- B) w3 m
            Node_temp = Node_cur->next;
    # b9 Z$ S4 h" t8 `0 y$ M        free(Node_cur);
    . w2 \- b' y2 p, N, |1 {+ T        Node_cur = Node_temp;* k+ ~( u" h: B$ c( {# z2 ~' c4 r
        }
    6 r2 P+ P: `0 o+ g    free(Node_temp);% J( ~, L& z" R
        cout << "数据节点已完全释放!"<<endl;
    * J; D1 H" J' k) z7 s+ n    free(HeadList);    // 释放头节点   k3 Q; G) r. C' @& e6 Q
        cout << "头节点已释放!"<<endl; 1 C- t" [) N7 d0 V4 D, Q% O
    ————————————————
    % y6 G0 N3 Y4 |' m7 L版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# Q5 p' G7 x- E# L  b3 {
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286# z( F. \/ [, w3 H5 u' X  C4 h( C
    & ~  b: G1 C& F  H& G3 C: R' r+ d, F) B
    , W! W) a2 T( l3 C5 D
    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-6-9 18:51 , Processed in 0.620302 second(s), 51 queries .

    回顶部