QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1592|回复: 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
    ( {& C- @2 k6 a: x
    线性表顺序表示、链式表示实现方法及其异同点
    & m2 G" A4 T- l. G( E线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    ; X5 b3 j3 y, c% T' y) a
    8 o% C$ ~- _2 E) }9 f本文采用C++实现两种表示方法。& j6 `9 Z6 s: g3 Y

    2 l. S+ J4 `, G% U* `目录5 q% T# M4 C4 T0 N

    8 g' ]# ^: Z3 _4 N0 h+ x顺序表示和链式表示的区别:$ N# M( }( n, A

    & [3 q- i, T/ e9 l, ^1 ^8 x创建方式:
    6 T4 Z7 `9 |8 q$ B; K. u
    & t2 u( y* K0 u  r) V时间复杂度:
    6 H$ A! K: i* Q2 d# m# W. \
    ( v, h9 {9 h% i2 N5 \# P: g顺序表示和链式表示的相同点:
    , E3 ^. c" y0 Z9 u2 c0 n* a  X8 Z" V+ X% B( q  k' w
    删除内存空间:
    ! }9 G! G, e$ ?. n
    # }4 `4 k  q/ ~. |代码实现:" b2 r! D* j9 X9 t7 r

    - f- H$ D1 x, ^9 P顺序表示方法:2 }% p  [+ r2 Y: X  X4 B
    " |7 Z, R7 e) \8 ?1 ?8 K
    结构体定义
      X7 `6 T+ ~5 {- Q7 v3 c+ ~9 C( t. W: Q; }
    初始化  m; c! B- R2 Z; U0 r6 q" W1 Y

    # I  @' J5 T/ {& o& N增加元素
    # N8 A2 {3 _3 w4 D: f; o! s. _& v/ n( E4 R0 W3 o9 x! r' ]2 a0 J$ a7 F
    删除元素- f$ F0 r% k; _4 H5 z$ H( L

    , \7 V5 Y2 u9 F销毁列表
    ( ], i/ P% b. i3 y* [
    7 a) ]# R# B" m. z% Y链式表示方法
    , Y, c  y3 s1 [0 l' Q& A4 m7 X0 r3 q
    结构体定义* A  T2 G8 C1 `0 b# ?! U
    ; u+ v2 {% R/ y3 I! A
    初始化
    / K: E% Y' q' G4 I+ S' c, Y4 Y4 i2 O- _1 T/ ]8 E
    增加节点. _- u! i  T4 w- Y& b+ W* {- F
      W7 g5 s: j1 i2 v8 V
    删除节点' v* {; n% C3 A( n' }

    ! u9 C9 x- U# i显示链表2 {' Z8 v9 z! c3 a
    0 x0 ?% R; h  `. H' W6 h; Q- ^4 U
    销毁链表* L- ~2 L0 z% [; j4 p

    " e6 s1 O; V# N) Y" u$ m' S- P顺序表示和链式表示的区别:( J' |. B* n; A# {! G6 k$ n2 k

    5 R5 B& b7 W' N# V创建方式:
    ! `/ A8 F9 n, ?/ `- p
      T& `2 K$ x) p7 o顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    3 x# Z/ [+ Q$ g& a. P' D: ?
    3 r# c  _6 f1 D5 {6 |# h- {) P(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    2 \3 N  {! g7 ?2 J2 C7 l
    7 u, L" F& u/ F" v; U! q链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。/ \1 y% V/ [! S! F, T. G$ Q  [6 D) W

    . U. J% ^/ f, V9 H  i时间复杂度:% H6 V' I" X% H* \) D. G

    . E- v$ s1 _  }$ X. f增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)8 v2 P* ^& v$ f, h4 c! a- V5 K9 W
    ; Q( F5 E8 U5 E7 I; P7 |
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作), N( }$ A" k. w8 C- y
    " P/ A+ I) n0 u
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    * r! q9 |9 `! @" P8 }, T3 J( {7 M; ~- Z
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);/ `0 L' _) ?) W( g2 I. a, J. g
    % J- @" e1 L* F$ V, p
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
      l( A1 k# d* ^
    7 k- R% f0 T% P% w6 r) C7 P顺序表示和链式表示的相同点:6 r( d0 j3 q6 w" C" Z3 [, A
    , a8 w. C* D4 x' d" y
    删除内存空间:2 q; H: M% Q6 J/ j) h1 p* k' Q
    * |. J% f; Q8 F6 M  r6 }
    内存空间的删除都需要对每一个存储单元单独释放空间。" Z+ G8 V; @/ i
    . T: k' n9 _& p6 _; X7 g) n" S7 ?1 W& w
    代码实现:
    " ^) m1 K( d) X
    & V3 o- N' P( z( t, a* Y9 Q! ?- @顺序表示方法:
    ; v4 ^7 q! r- F4 c0 D  C
    / ~; o3 x' d& d; k' W* h! i' J结构体定义9 v, h; h( J- L2 V4 y

    & m; v+ {4 }% I6 C9 W# Ptypedef struct {2 J5 E; `  H, w% @6 ]4 }
        ElemType * elem;1 Y, u* u. l/ F) c- s) y/ ^7 F# M
        int     length;        // 线性表的现有长度
    & V2 W; X8 s: d) [/ u) j. ^    int        listSize;    // 线性表的最大长度; W9 P: n4 k$ N. t4 x# {/ `
    }SqList;0 M. ~) a; f" g0 @
    7 ^; h. C2 ?+ e$ U! Z9 ~% T
    初始化
    5 v; m7 R' g" l* ?1 w& ^/ a1 ?( ^' Y: ^( A0 [5 z; {( ~7 z0 j
    void InitList(SqList *L){
    9 ?* t$ G2 \# k    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;$ A) Y, D. U! n$ ~
        if(!L->elem) {
    & ]8 Y" A. n- G3 [# N2 R, |7 f        cout<<"申请空间失败!\n";; g- d6 u$ R+ p# o$ f4 ~. T
            DestoryList(L);
    - v7 Y8 X( L5 F  o! r' b    }
    ( I. h% @6 c, R& {' w    L->length = 0;
    8 I: C, y* }5 R# O" o7 E9 W    L->listSize = LIST_INIT_SIZE;! ~7 ]) H$ i# g: G( T
        cout<<"线性表初始化完成!\n";
    " ^5 ?% ~4 R4 t  D3 T- V" C2 l}8 F+ h5 t5 C  c& L* g) f

    4 g$ t: p! W( R增加元素$ I, Q2 Z& u4 w' c1 ~

    ) G. H1 s3 O) `) Uvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素" G+ U: ^* b$ ^" O) _7 i
        if(L->length>=L->listSize){
    1 i" H% g6 J  H  r, ?# f# d' A        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    ' w" \5 ~: X5 G$ [        if(!L->elem){
    3 k: ]2 \! U- m; D$ \            cout<<"增加空间失败!"<<endl;1 `( L+ y6 b1 r+ T4 J; W3 D
                DestoryList(L);1 P4 V( S4 m  M1 k2 b3 I
            }
    : B# v- U8 a$ a! \" }$ T1 A    }3 L+ s# g% d: Z6 X2 g. ?+ K
        * (L->elem+L->length) = e;% k4 Z, @* t) f3 A( Y
        L->length ++;   
    0 Q; Q" x! T' ]6 l  q. f  n* u}; r6 R  y. \- F! \0 s4 A/ _

    7 b; F. v8 u3 Evoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素1 F$ j2 Y* w* U6 p) A3 i
        int i;2 o) V. d1 R' j3 {, i$ ^$ X' C
        L->length++;& k3 {# E! F+ q- H: w
        for(i=L->length;i>=e_where;i--){$ _- A* x8 `; w1 k4 R; [0 b
            if(L->length>L->listSize){& [9 h- B( `8 M. t. O
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));' z: m6 v% C! }) m" b
                if(!L->elem){( T3 J  G1 u' s( R" G$ Q
                    cout<<"增加空间失败!"<<endl;
    6 P, e8 h4 n& o  i, g                DestoryList(L);
    + i% \5 z- }; P; N; L! G            }
    ( C8 [4 ?# V3 ?        }
    4 P; Y0 L' u- @7 i1 H5 q) K        *(L->elem+i+1) = *(L->elem+i);        6 i  Z+ p+ x7 c" A% f. K5 E  ^
        }- V5 S) V9 j8 t8 a( z& K: C1 }! G
        *(L->elem+e_where)=e;7 f  K% i+ S; A
        cout<<"增加后的线性表如下:"<<endl; , m" ^& L6 Y3 H, Q) b2 Q
        ListShow(L);
    / D1 G6 g: B; L4 q8 V. N/ @1 u} 2 M7 n- s) J) c5 E# i7 J
    # n+ u+ ]+ B2 `8 V9 \" u' M# Y# G# b4 d
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    & E, ~5 K0 P2 K8 w5 r    int i;
    3 f$ N1 L1 _0 i. p    L->length++;6 n1 f; i9 j- k0 L$ I
        for(i=L->length;i>e_where;i--){* x) ?# _6 N, k# ]. U
            if(L->length>L->listSize){
    + V% i( W+ S! i6 Z            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    0 n5 D2 o) U, I. P5 C            if(!L->elem){
    6 w9 a) A  y5 N8 {& Y9 A" C7 w# l                cout<<"增加空间失败!"<<endl;
    5 M6 R2 H5 o; N' P: t' @                DestoryList(L); 9 o, F$ u) P! C& u0 ~
                }
    4 f5 S: q3 P1 ^3 K        }
    & `  U& ], Y4 S9 N( V+ n        *(L->elem+i+1) = *(L->elem+i);        ) d& }' G4 Q+ a# K
        }
    ; P7 s, e  E- E& e$ q7 R5 t    *(L->elem+e_where+1)=e;
    . u( s4 Z3 N; [: \! N1 H    cout<<"增加后的线性表如下:"<<endl;
    ) A8 T1 c7 Y: B+ e$ v6 m+ A% a8 @8 i+ _    ListShow(L);7 N+ }6 u' `( N3 l
    }
    - w" V! r, ?% E) J( _" g4 {
    + j' J0 R2 q& J3 I1 `删除元素6 @) @0 I" u+ f" [" a5 B& _+ k8 D# F
    ! Y: P. B" U, @4 ]4 s. V8 ]
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    1 Q$ x& W% P1 I& B  `" g' u3 ~    L->length--;
    # z' a3 j0 @/ k' q0 V    for(int i=e_where;i<=L->length;i++){2 |! m& x" ~% q. Z  [# ]
            *(L->elem+i-1)=*(L->elem+i);
    9 I3 H* |9 q2 k0 t4 B# L# t/ C    }
    ' G& J% j! ~( R, ]2 y+ B/ Y$ N    cout<<"删除后的线性表如下:"<<endl; ' l& Y& W. q8 p9 Y' {1 S& c' Z
        ListShow(L);
    1 Z! b0 l  F& F0 L3 H}
    2 |. Z3 [3 S% n, N$ v0 s0 F2 F4 f/ X) T4 g5 A6 `7 f: T
    销毁列表
    4 I1 W/ b6 y% d; B, R& J# W5 z9 S
    void DestoryList(SqList *L){. P1 x# A! q8 k( G" H2 }
        int i=0;
    2 r/ i5 k- B* D6 C% G, f    for(i=0;i<L->listSize;i++){) `, V, Q! j! }* ~( W
            free(L->elem);
    $ d& Q+ R4 n5 A% \        L->elem++;7 @9 ]: g8 B+ ~, z. j
        }3 {2 O) `% h, s- `1 E0 k
        exit(0);        
    ( k3 c6 d7 E2 c8 {}
    2 n6 r1 @0 C+ B# k% A- K
    . x5 s, I8 r1 D- [) G4 H链式表示方法, H7 j7 c+ _  {: V0 r$ c& e
    ' W4 x& R1 I! p& Z8 [3 g& \
    结构体定义
    4 n2 U$ m# t8 e" C, v/ b6 Z$ i" i# D. W6 [( D
    typedef struct L_Node{
    , @4 h# }+ r* @3 S+ C1 b. b    ElemType data;
    ' ^0 S  C1 z7 h# a% |) P( d3 A+ R/ b    struct L_Node *next;4 f4 h6 L- E. a2 ^% a' i- t6 ]. n
        //struct L_Node *last;    //增加可变成双向节点 ; l: X& Z  k3 r; j. `# B% h
    }LNode;
    ' ?; s2 T1 j6 D1 n% t- O/ x* h* m! A8 t  t
    初始化9 C7 _3 B7 H# X) d4 ^; }

    4 e  o! i( F# r+ d2 w& zvoid LinearNode::InitLNode(){0 {, g! G8 ]& G7 I! N; O( y
        HeadList = (LNode *)malloc(sizeof(LNode));1 K- F. r* ?% {# l8 w( p% L% l1 P2 ~
        if(!HeadList){( a$ b- ?  e% @" ?* k
            cout << "初始化链表失败!" << endl; - d: G/ c7 P3 L: q- U  `3 F
            exit(0); 3 o6 U9 p* S/ t: }
        } / U. H. B# @8 g1 L1 l( C8 }
        EndList=HeadList;
    - g+ R. c2 N' f+ O* x) |8 g    HeadList->next = NULL;, E- d; z' v; ~4 ^' L& p
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;) b5 q- N9 }2 j+ E
        Length = 0;; B' h7 [- b) H$ V0 Y( E! h. ]
        e_where= 0;
    ( k1 r4 L! i6 I9 K0 C' K% j3 S& j}" b: G" ?+ o+ d& s  T5 b# c, ?2 e: \
    2 E7 M- P5 }9 e6 `. p. B6 I/ y: q
    增加节点4 \+ P* {% D& A& m0 `9 C0 K
    . E0 @9 D5 `5 ?$ ?5 a  R
    void LinearNode::AddNodeHead(ElemType num){    //头插法 $ v: p9 T6 L6 H+ R8 z3 ?
        node = (LNode *)malloc(sizeof(LNode));
    3 z7 N+ }  k& k    if(!node){% R4 t5 g/ z; M) p4 Z
            cout << "新建节点失败!" << endl;
    1 K+ S/ ^' j( e1 L9 v4 @        return; + S8 ?" o- a$ x& W' g2 d
        } 7 y. i+ I$ q2 ]$ b" ^
        node->data = num;
    ! F' n/ Y0 P7 q    cout << node->data <<"   ";
    - a$ U7 ^# i! t6 {    if(NULL==HeadList->next){
    8 g3 E( y5 T* R" B/ w* l( G8 b& u        node->next = NULL;: _$ H' T7 O' b% a. g9 G4 D0 U+ y
            HeadList->next = node;
    % f+ F1 [, H. ^% L/ v        EndList=node;, K; M/ [! z5 v% v" `/ X
        }
    9 [% |* t5 w, V5 C; t4 f    else{1 S3 q6 `% T/ M# N2 I; M1 U2 r
            node->next = HeadList->next;
      f6 l. _& D& [( X        HeadList->next=node;
    * j1 t+ C% ^3 O) J1 N6 H% w    }: F/ H% o# _4 J! o; ]- M
        Length++;
    . C$ X* L8 P% ]; l}. \, ^' M2 E7 @4 N
    9 b, z) u* G3 X# d4 l, X; S& W5 M
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法 " @) Q6 P& h! E+ o
        node = (LNode *)malloc(sizeof(LNode));
    $ d* C! `( f; J" [5 p    if(!node){" f; ~, O/ O1 ?8 [5 j' o
            cout << "新建节点失败!" << endl;
    1 v6 ]% N, o( z( q! E, D; e( y        return; 6 q( T7 a7 J- U9 l+ v
        } 9 J+ s! j* g/ I2 r+ k8 @" {4 c
        node->data = num;
    3 U! y. G" }& }8 ?7 k# d1 e! q    cout << node->data <<"   ";
    % y6 b. u' ?* o6 ~    node->next = NULL;
    7 A$ ]- X1 V; S$ V7 a    EndList->next = node;- h$ M/ V/ C9 W5 W4 f
        EndList = node;
      x2 W" e- k5 v( `6 d* y: b& |    Length++;
    3 _% q4 c8 m  t/ i2 H: R$ a8 Y}6 d* \) `+ G( S& J+ S% ^; x6 `
    2 ~, z! A0 @8 N: J# {; N) Q
    删除节点  a$ f/ {+ i5 H9 n! P* R

    : i' ^, a' m5 B' `void LinearNode:eleteNode(ElemType elem){
    $ I( O. I3 b  N    if(NULL==(HeadList->next)){8 C- H6 [" R* q1 j2 K
            cout<< "无节点"<<endl;
    & M$ O) ~9 i8 p4 i0 ^7 v% O        return;
    . D  G  F) p- a# m& ]5 i    }
    0 a: \' x2 {7 _, }7 W4 O    Node_cur = HeadList;) E" c: }/ u( P( [5 s
        while(NULL!=Node_cur->next){
    $ B% c! I0 F* x$ C) u        Node_temp = Node_cur->next; 9 }$ L8 o: t7 u9 B7 N
            if(elem == Node_temp->data){
    ) ?" m4 d* n* h2 X            Node_cur->next=Node_temp->next;
    6 w; B$ l1 b6 i7 d' p$ p) I0 q9 S4 Y% A            free(Node_temp);
    , X) a3 e3 E$ O: @* ^6 k        }
    8 J/ k( s2 E) y9 h        if(NULL!=Node_cur->next)
    ) k& S: O' U- ]7 {0 B. U        Node_cur=Node_cur->next;
    7 V" c; T2 A# Y2 E: ]5 A    }, t* }6 v& J4 w$ n# C3 V
        cout<< elem <<" 元素已删除!"<<endl; & ^! q, o1 H5 w9 Z. @
    } # n7 x1 i/ K' W1 N7 `' ?9 R
    5 h1 @  A" u$ ?/ D* _. o# z
    显示链表- u6 N1 Y: n' ~" ?1 q4 x- z

    0 a6 a+ L$ Z( k' x& k1 `0 Ovoid LinearNode::ShowLNode(){" i4 H' Q6 D/ E* }/ j
        if(NULL==(HeadList->next)){
    * `/ ?# X' ^" {' Z8 i  ^0 ~, i" N        cout<< "无节点"<<endl;
    % y6 Z$ l6 S2 P9 u9 d        return;
      i3 f- X  f1 o/ l    }% [8 n- F" h& R/ F5 M. J
        Node_cur = HeadList->next;
    2 Z9 g* F7 A6 {2 s+ b    while(NULL!=(Node_cur->next)){6 y( O9 {4 f! q: T2 _
            cout<< Node_cur->data << "   ";0 ], n4 K1 A  w) b6 H- X7 m
            Node_cur = Node_cur->next;4 J3 a6 C5 e9 `& B4 q' a
        }' j$ H0 c- c6 c& l: o7 r" h0 {
        cout<< Node_cur->data << "   ";4 G) [  j4 G) R2 K" Q2 f
        cout<<"链表中的数据已显示!!"<<endl;
    8 J7 j5 L8 E# q! }. \}
    6 z- {4 y4 J- J9 U) l
    8 G$ a. k, y. D; v+ R销毁链表( q4 f2 b4 W& w7 r  n

    7 r6 ]9 z. K. I( s2 H  j) avoid LinearNode:estoryLNode(){
    4 V5 U9 u3 O1 S8 |% L    Node_cur = HeadList->next; " p% R& w: v: n
        while(NULL!=(Node_cur->next)){( C1 a4 X6 l' |) f
            Node_temp = Node_cur->next;
    # C  Y- D) V8 s6 y$ {        free(Node_cur);: G. n1 s* {! Z) m% Q7 S
            Node_cur = Node_temp;# F# w# A: |; X! c9 `+ T
        }, N% Y- {5 p2 A  E* Z+ o
        free(Node_temp);" q, `6 E& N8 e1 ~( P+ P8 J
        cout << "数据节点已完全释放!"<<endl;
    ! E6 X+ v2 h" t: i* z7 E    free(HeadList);    // 释放头节点
    2 A8 ^4 ^9 g. E- _8 s    cout << "头节点已释放!"<<endl;   M% d6 _+ D- m! T
    ————————————————+ o9 P) e5 U! S* C
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 b& {! \$ L) J, d, g原文链接:https://blog.csdn.net/Baimax1/article/details/1060362869 l+ J0 w- l- n0 d7 v$ Y

    $ i1 U5 Q7 a7 a4 s* w
    0 c# Z( k- s7 J* b; ]2 G
    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-8 23:56 , Processed in 0.475514 second(s), 50 queries .

    回顶部