QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1576|回复: 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 r% a" y5 H, w( u" L7 Y
    线性表顺序表示、链式表示实现方法及其异同点2 I: w$ B2 \* r' e
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    , t' }, w/ s) f$ A( X* T$ s. y* ]7 d: `: V6 Q& @
    本文采用C++实现两种表示方法。
    , z5 A& c, ^( Q# \
    * D, Y$ m7 H5 F目录
    9 _9 O8 F; d3 w1 _" N" C, p- O9 a4 _# r1 o' ]
    顺序表示和链式表示的区别:
    $ j. C# R% f# m* c# l
    " c/ a% \! p! M创建方式:
    " p  M! B  t/ F' E8 R9 r& H. _5 a4 R% a7 ?2 `
    时间复杂度:% h$ }, [2 F7 N7 v  k3 V4 n9 S' |
    # H# V* P5 h  p: j
    顺序表示和链式表示的相同点:  R4 i0 d6 q: p1 P0 o! ]7 t
    * z$ m/ G% U9 Z& Y, Q. d
    删除内存空间:$ k* s6 H. K: P5 [( k& {
    ) p! L  b$ g8 h- D3 z3 G0 t2 ~2 p
    代码实现:) n) T. C! w4 k1 p: a$ u

    * X  P% ?1 S* H& R1 t' q顺序表示方法:/ c. Y1 M7 O6 `4 R
      ~! I1 O  _3 o% e
    结构体定义
    1 B# B3 x- }& r$ w9 N
    # \0 N# V4 l$ ^9 Z初始化
    , t4 y& x: U: q5 T) j2 N2 p2 C! H, b
    增加元素
    # S3 F% k, V  N$ w
    ; u) G2 m1 b2 E' H3 D$ K6 |( p9 d: g  e( I删除元素
    6 A( B% w- t& d' U6 p% w7 I! H. z( s6 @
    销毁列表
    # _6 G. n* b1 [' ]( o7 s# c2 ~& ]- W( l% r8 e7 M! O' k9 u% N5 ]0 m
    链式表示方法. f. N/ |' {* k! x4 Y6 E' ?
    4 b) N# m- Y5 B7 x
    结构体定义3 c7 h0 p) }: I  `+ m; p- J
    - T; ~4 U  \5 P8 e0 f/ v
    初始化
    ; `5 o) T* O3 v2 w& p* W6 U6 Y" |( v1 z. N8 [$ M
    增加节点
    ! u' ^3 B, x* H
    ! U  p. W2 Y1 k, ^4 n& g删除节点0 j& b. N, m% p3 {( P7 }
    ) R6 D; B6 ^! f
    显示链表( B( U  i& c, [4 t( z
    ) h  n" S& c4 [* z
    销毁链表+ \* w) e( Z/ N+ o

    8 r4 {0 N: H3 V  K. C顺序表示和链式表示的区别:& Z8 E+ `& J/ z* n3 \5 }# S

    . J) Y" M2 b8 o& }# T  j  L" C7 I创建方式:
    1 O/ d9 s2 [. `/ H" c8 x4 G0 s( q+ R7 o* R1 j
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。: w' [2 W. I; ~* U2 L! `! w
    3 G7 J! N; _; E6 F
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    ) q+ u* O4 I& r6 i0 R
    ; W4 C& F8 ^( u3 |链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    $ {7 |' ]3 T& @; `9 N7 \, W" `7 ]/ ~+ T2 S! l. d
    时间复杂度:
    & g* @* y% ^8 z2 l" Q# @' I/ U% n1 e8 _# v% {: p) X9 a
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    ( {# M9 b: z* X' G2 K
    " L4 Y* L2 J& w/ d4 V增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)9 H/ D; M8 K4 o& m
    4 x# v5 W2 A& v
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。3 o" R; n- N' c& |

      a. j7 m$ x* \- @  p, P, X修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    ' G' h" ?6 ^3 x8 W  y' @# s. ?' a3 q. m
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);& |3 f$ H& K5 b& g0 J( g

    , d1 d9 o) m2 ?, D) Q' n8 v9 Q顺序表示和链式表示的相同点:
    7 a" U$ @* ~& o) E1 f$ W7 ~! X6 `! O8 |, A/ W- p
    删除内存空间:
    ! [6 o  h1 A  U5 ]; u
    3 y9 c' g# n; b' R% f, J( z内存空间的删除都需要对每一个存储单元单独释放空间。; Q( j( f- O" X

    ; A* g8 `& }" B6 K- L代码实现:0 e3 c/ m6 D6 o" h
    ' e' i0 H  E- S' i6 w
    顺序表示方法:
    * G2 J& S" e- T8 F2 H% k5 F/ H6 Y& V- C/ F
    结构体定义- o" C; ]4 {/ c

    3 e7 V( u5 N' r; Wtypedef struct {
    , F* `6 f: c8 t0 J    ElemType * elem;
    . @+ B; ^4 j  {% [' n    int     length;        // 线性表的现有长度
      }; q. M( N+ V3 H: M    int        listSize;    // 线性表的最大长度
    * R9 b* A3 p" J# V- {}SqList;
    % [+ g& [9 I0 I& h) O( W! |2 V3 z- H9 S0 [$ a
    初始化4 J* Z7 t/ E9 X+ W& q" d* S

    / y! b$ W3 ^. [, Y2 w# F8 |void InitList(SqList *L){9 R0 ?# o$ p+ N- W0 v: w, V6 x; P
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    8 U1 I$ q# V5 `: f& f& P- ^0 d    if(!L->elem) {- `& ^. r( e; ?9 v
            cout<<"申请空间失败!\n";
    - L* q( s& `8 t# H0 a        DestoryList(L);: F5 l- j8 N0 W# K! f9 M9 P$ H! `3 l
        }6 R: `8 o. r8 A0 f, d7 ?
        L->length = 0;* k, b  m; `+ R
        L->listSize = LIST_INIT_SIZE;' @& j0 L" g1 a8 C
        cout<<"线性表初始化完成!\n";2 l0 H1 Y1 `) A/ L8 F  v6 {% t
    }
    9 p$ p8 S4 r+ o2 o; O# F5 `5 U* I) h1 z# D
    增加元素' q& B" J! Z* x+ ]) V( z. R0 s

    ) K3 ]* n1 b; N8 C4 Q' t9 Evoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    8 X# }6 H& a& Z0 Z    if(L->length>=L->listSize){* X2 B5 q4 s% l9 T
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    / z# S9 `% r3 l: i* D/ G) p. g  X        if(!L->elem){0 r7 K7 Y) v1 f: _) K# C
                cout<<"增加空间失败!"<<endl;( m4 x# `& }9 Q
                DestoryList(L);1 b+ ^. z7 k, l8 Q
            }
    8 k$ y! A, r$ ~, h# u" e    }$ |1 H3 k* y6 }2 w
        * (L->elem+L->length) = e;+ v' i$ U7 g0 w. G" l
        L->length ++;    9 l( s& U" Y% m* o1 G0 P
    }( A* a$ k" b  {& C& G
    6 l3 r4 p7 H5 Q# s( c; l8 F5 f
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素  |/ E! \) m* Q6 E% S& L
        int i;+ ~0 F- b8 Y' S, j4 F
        L->length++;
    ; P% h! o! ~% [+ V1 b    for(i=L->length;i>=e_where;i--){
    3 E/ b4 M) `+ N* d        if(L->length>L->listSize){( f( \* M+ U; D2 O3 z7 g9 z
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    & V. F; d$ c/ y# L0 _8 r            if(!L->elem){
    , q$ D3 W" ]2 X( i                cout<<"增加空间失败!"<<endl;* f' G% B9 B- d9 x& W
                    DestoryList(L); # y9 T8 n- t( \% a5 a: l% I: M
                }
    + \; C1 N' S" }        }
    % A0 J) I- W, z7 E1 i        *(L->elem+i+1) = *(L->elem+i);        
    $ k! t- r! Q- z6 d0 |: F8 Q    }- ^3 T$ Q- F) q) [: ?
        *(L->elem+e_where)=e;
    3 W' \# B, q. N% M, B, M    cout<<"增加后的线性表如下:"<<endl; ) T1 A+ |+ E7 v# T
        ListShow(L);: ^% w1 P) v* B
    }
    5 |) }$ ?5 e9 U. E; V+ N9 _% P1 H6 w+ d6 a0 t. ~: x, E
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    2 L* p/ H+ v4 A% y3 P    int i;1 b$ O2 B3 u8 B. p$ n
        L->length++;0 l6 h- ]0 r- q0 V2 e2 ~/ S) c
        for(i=L->length;i>e_where;i--){
    ' D! h% E  M5 z- O+ h        if(L->length>L->listSize){1 M' R: u+ M4 ~. D
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));8 _4 W2 ^- s- O0 b) P
                if(!L->elem){( e5 B) q+ E- J! i' `/ j( g" i+ ~
                    cout<<"增加空间失败!"<<endl;
    9 Q+ b+ o# Q2 b' k* u8 c5 D                DestoryList(L);
    ! E' ~2 R# X0 f; n2 q            }5 n% c: M* A& R8 e# y% B7 ?1 p
            }4 M, {  ~, Y9 b$ h: s8 s0 R& |
            *(L->elem+i+1) = *(L->elem+i);        & U0 T3 h6 [- z% `( `1 J+ x
        }
    + K$ s7 A% _- G+ p2 T# ]( D    *(L->elem+e_where+1)=e;( r: `8 ~  x; i) E! O
        cout<<"增加后的线性表如下:"<<endl;
    + _7 i/ o4 N& \. l' ~- m; @8 S# E    ListShow(L);
    0 L) Y6 H5 G6 G/ B$ W}
    9 e6 I" ?! y5 j8 K9 c, O. W
    " j" ~$ s' W+ @! h5 w3 O删除元素
    ! C3 k3 B& X8 d2 p! E( J/ m' g. ]+ G7 L
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    ; e( q: J& M" M  X, a, B% Y    L->length--;) G* M: q  f& q
        for(int i=e_where;i<=L->length;i++){
    8 ~) B# [4 \: L3 c+ h7 T        *(L->elem+i-1)=*(L->elem+i);+ V# L$ J: ~" p8 j5 ~
        }
    9 {: m& ^3 c2 Q4 q/ X4 |' s    cout<<"删除后的线性表如下:"<<endl;
    8 [5 N' H8 e3 K% [    ListShow(L);
    : Z: M) m& r) p}
      q. T* J9 i" ~
    6 ]7 K" b& d: e. a/ g销毁列表. N7 ~- E  T( @; d; i
    # ]: m( {, c1 B6 v. ^# Y
    void DestoryList(SqList *L){' e7 n! y( ~# l* s6 @4 ?0 T
        int i=0;
    # W; |0 o! e! m) G    for(i=0;i<L->listSize;i++){  n$ F% n6 G# b" }4 ?! }+ [- f
            free(L->elem);* @" T, I& o' O& N6 ^
            L->elem++;* l% J* I! }! l5 K: o
        }
    6 V5 @' \) s0 U, H5 O! t    exit(0);          c$ a# f0 [4 L# q% ]) J
    }
    4 B4 c* w: f, Y% s) Q! q* X# k* x  ?- N; M/ [; g  ?5 e* t; O
    链式表示方法
    2 X5 _, q3 a* P9 c+ X$ R: O) E" S, g/ \& O( j) s! Q
    结构体定义5 `- e7 h- Z. D' T% h+ }
    / P; W1 ?$ c+ @8 E' y
    typedef struct L_Node{
    1 r5 G( ^# A3 A+ c7 _% J    ElemType data;
    7 v! z- x- w( _4 \" \7 D& {9 i" E    struct L_Node *next;* ^6 }. o# f5 z9 Z
        //struct L_Node *last;    //增加可变成双向节点
    " d' P- u/ ]/ ?, q  X5 \, S5 h4 G}LNode;3 S" z6 J+ v% e3 P
    . h" F' c: d( i3 a) q7 \
    初始化
    2 l; B; d! \( D3 {5 f( J) d. l+ k: m  i( F/ H: G2 i
    void LinearNode::InitLNode(){
    4 q" f6 t" L& a/ R6 x    HeadList = (LNode *)malloc(sizeof(LNode));
    5 D+ }  ]- |3 K  V( S+ h$ d0 n    if(!HeadList){
    ; p. M' q/ t* S! N" o$ B3 c' j        cout << "初始化链表失败!" << endl; # L+ y& |6 J5 N4 k
            exit(0); ( _) n% _& R! u( v+ Z
        } 6 R$ K/ s" Y- Y: j2 T
        EndList=HeadList;
    + L5 h" @' l- b- X5 P    HeadList->next = NULL;8 a& _, H. G. B8 L" h
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;7 x. o! r6 \" c& U8 ~* ~# M. C
        Length = 0;7 o8 l( l" p- O1 G. H0 ~; ^% n
        e_where= 0;
    * j, O$ @0 g4 i}9 U8 B+ E/ b: ]0 R) H2 x: I/ c- W
    & H; J1 R, l2 Z8 r3 B
    增加节点
    # m0 \  e6 k# C, c5 x
    : i  {, M& E: n8 f6 Z; i2 Yvoid LinearNode::AddNodeHead(ElemType num){    //头插法 8 W4 v8 [7 y% f3 I! P
        node = (LNode *)malloc(sizeof(LNode));
    # p! f& W. s2 l/ h& R4 M$ V% ^# w+ q    if(!node){6 L; g, L+ p5 z
            cout << "新建节点失败!" << endl;
    * F) u& ]) _3 b5 n        return;
    2 d# A5 _( ?$ s* y# M* s5 q+ c    } ) M5 l6 H2 ?) l% S; C7 F
        node->data = num;
    & d4 S4 v9 s% ?0 E. J2 [    cout << node->data <<"   ";
    . R9 M9 y$ ]9 G+ c3 Z, |4 n    if(NULL==HeadList->next){
    & c/ m. Q2 R+ \0 J, o& {7 H6 m        node->next = NULL;5 @9 F, O5 x$ i* g, @) Q% b) W# S6 L
            HeadList->next = node;) F9 r! T8 d5 S% k% V" k; S% j. Z
            EndList=node;% H7 @: i( d( f# j! S, r
        }
    2 x2 u  Z, j- m% I5 K    else{* ^+ G- P! @! Q+ c  h
            node->next = HeadList->next;3 Y1 K3 w7 g0 r3 [# v) k) ~1 \
            HeadList->next=node;' W- B, J6 D; \: e, `
        }7 t0 K$ u6 o* O
        Length++; ' A2 g1 R' o7 i# y" G
    }
    8 r6 x1 E. _0 Z  M# ?( }, P0 q/ }2 f  Z; ?7 l6 O; l  v' i
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法 ; a1 i( E& x; ~
        node = (LNode *)malloc(sizeof(LNode));3 ?9 ]3 u6 i5 @% E* L7 {1 L4 n- R3 L
        if(!node){
    ; ]0 }4 `% C0 p/ D. \8 t8 P7 o9 S        cout << "新建节点失败!" << endl;
    & y( T  S& g! B) @1 A* B7 |4 j        return; , }" D0 b1 `: a2 y: R/ v: q
        } ) {/ {& [) I6 Z/ x) i, j& ~
        node->data = num;
      L, G9 I: J1 f0 a+ _3 m$ A- K" L    cout << node->data <<"   ";
    0 Z) P" c6 G: I! O9 J' g& p    node->next = NULL;
    6 U5 n; u$ T$ R    EndList->next = node;3 w; k- S0 m2 n/ i6 I
        EndList = node;( n, I* q4 e2 F
        Length++; 6 O9 {: O2 W' N. J% W: {/ B4 f/ z' z# t
    }
    0 x- M5 @) E  r0 H
    : z7 B+ A" e0 d& M5 {" b5 n删除节点
    ! S% X! q) V7 G- [' W
    1 F8 h" i, E+ x9 \  lvoid LinearNode:eleteNode(ElemType elem){/ r& o2 |6 F. S0 a
        if(NULL==(HeadList->next)){7 c: S4 ~, T" d
            cout<< "无节点"<<endl;/ o( v' [6 E, m8 ~8 v
            return; * J5 y6 E# o5 x3 [& Y% Z7 s
        }
    - C, L, T6 x! K9 a' D7 j' H' Y    Node_cur = HeadList;7 n* W6 b* r: C1 j. r
        while(NULL!=Node_cur->next){  l, O7 R: x; s7 ~/ Q: x
            Node_temp = Node_cur->next; ' ~, v4 i6 ^4 U* k- X" Y
            if(elem == Node_temp->data){4 s* F; ~1 @4 e# A  V
                Node_cur->next=Node_temp->next;
    ; p- ~$ O# f5 K- v            free(Node_temp);
    4 e- j, I( P% b  B        }$ R8 Y2 s% E; ]' g+ g' H7 D- t
            if(NULL!=Node_cur->next)
    7 b" h$ X" S  q+ w, Q        Node_cur=Node_cur->next;! N. ]" U8 p/ ?$ q( c0 W+ v
        }6 [4 z2 \9 X( e' w$ F" v
        cout<< elem <<" 元素已删除!"<<endl;   V" {4 s7 L$ ]( Z9 Z
    }
    1 O1 s* a$ t4 V* U3 s9 w* \7 c( `
    2 J* l7 ^9 A4 `9 u* }显示链表4 S+ @! j9 p! D% k! W0 ]
    ; M* X1 `* w% G6 z
    void LinearNode::ShowLNode(){* q7 m5 ]/ K( }4 M' d! @" C
        if(NULL==(HeadList->next)){
    1 D% k3 k1 a/ d+ i2 S" Y8 N+ o        cout<< "无节点"<<endl;
    ; `+ ^( q% s& j" N4 A        return; % }3 O/ r& p, B0 T# H/ G$ Z- u
        }
    7 i$ f2 p. s8 G, ~; Y# W    Node_cur = HeadList->next;
    - w* ~! X% a5 U7 B8 s4 p# }6 O3 o    while(NULL!=(Node_cur->next)){' b2 L) i* |+ m, n; C
            cout<< Node_cur->data << "   ";: I7 q8 ]/ u" {' |% s
            Node_cur = Node_cur->next;
    3 m$ J$ ?* n. Z: L& @5 h9 \    }
    # ~7 k+ r  s( c' t; X4 g    cout<< Node_cur->data << "   ";
    ' t# o$ o! y( a8 Q    cout<<"链表中的数据已显示!!"<<endl;
    / A# d: X# H$ r5 ~6 s}
    ) J: q, Y* \) \' U6 C6 D  Y" A( A9 u4 b( l( n) F
    销毁链表& B9 B! l  M/ \, q  _, D

    . N5 q! L! E6 S7 U) Yvoid LinearNode:estoryLNode(){5 S4 Q, ^% z8 m7 t
        Node_cur = HeadList->next; % s6 _: g5 ~& l, @4 a- w0 z) C% Z
        while(NULL!=(Node_cur->next)){+ [- Y7 J; Q( V" u6 O
            Node_temp = Node_cur->next;
    5 o5 u, q5 J- |/ a4 K$ e- k        free(Node_cur);
    8 n. z  v2 f# g        Node_cur = Node_temp;/ w' i+ ?8 Y% B( J0 I5 Q
        }+ r/ d  V, {1 {4 y3 X8 W
        free(Node_temp);
    / [3 d6 U( S4 A( k" G    cout << "数据节点已完全释放!"<<endl;
    # q0 C! L1 b4 n6 V; b    free(HeadList);    // 释放头节点 5 H) O% ?. o) v, ]! ]+ s
        cout << "头节点已释放!"<<endl;
    : \3 d: @5 M: w) L; M  s/ Y5 l————————————————
    " P+ a) \4 J. |8 s5 F, j版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 F4 P6 }9 O  t& \& g
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286- x; H; ]% ]3 [8 \. e0 x; |
    6 f& r" {; f" a$ l! _7 a$ b

    ; x- P" e$ @+ O: F9 [! 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-7-25 06:22 , Processed in 0.556554 second(s), 51 queries .

    回顶部