QQ登录

只需要一步,快速开始

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

    # S/ A" Q# K/ p  a! A7 e线性表顺序表示、链式表示实现方法及其异同点
    " |& n  l6 \. P2 l; @% ~. b: w线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。( ]0 J; M) s  r( `2 Q: v4 [+ u0 t1 H. `

    , T% ~" Y  d) F+ G本文采用C++实现两种表示方法。
    9 Q6 s2 e8 D* d/ \# z! [( o1 U( b  H# q8 e. a
    目录# A1 T# d7 W7 L) q7 C# u
    : @! q8 p9 ?" D" I0 ]. T  u) i
    顺序表示和链式表示的区别:2 U% h  ~& P$ @2 Y; I0 D
    ; f$ v$ Z5 d5 C) D$ V
    创建方式:
    7 O. I! T7 I+ q4 L; s
    8 }, n. L! H2 H' C, t. c7 m" H时间复杂度:
      R# U) y- |# I% W4 f1 q
    : Q* A" w, J/ C5 x; }顺序表示和链式表示的相同点:. c# |) `8 J6 U7 s
    0 Q% [% x+ C8 Z
    删除内存空间:! f5 B+ |  S& d8 x  P
    ' C& @! ]) t& j8 ^
    代码实现:
    3 T9 W/ _% y' G* u  b- D& C* z' U/ V3 v& ^& H
    顺序表示方法:6 y, b, a- R( u$ \
    1 Y$ u7 F* f9 q. \4 b, C
    结构体定义
    & l2 S3 j* n9 G
    $ q! d) k6 I) ^1 {初始化
    8 |7 s( u$ |3 |5 f
    $ }5 G* J: {: H+ i增加元素7 Q) \4 T$ Z9 Z. F
    ' G0 \* X& }% E0 P
    删除元素& a: a2 F' [" K& ]& m
    1 o8 X! O, g9 O/ J" I- w. K
    销毁列表
    $ |" ^5 {- ]; r  J" r2 j% a8 |
    ' L3 x8 k+ B+ ~- C6 |/ v4 _链式表示方法  o1 e0 Z+ W- }7 I% V

    ) u8 E- B) M( @8 U! W6 Q结构体定义
    ! J& P" X/ \, Q& A% V% J) V+ B7 r9 N2 e& L  n  I
    初始化% X! f1 C# ^8 ^  |) z' b4 r0 D

    8 F9 K& N* e* N1 H增加节点( b9 S( T/ g3 `8 V6 |* J
    3 t. a! G$ E. R1 T$ M4 c
    删除节点8 `% |; L! {0 [- d2 B

    ; V8 [1 j1 G6 W5 E- p1 c# X" ]2 p; i显示链表
    7 B' {, \* R3 w6 c, q9 O
    4 v$ O- J# `7 _+ U销毁链表
    3 D' ?# r0 Z7 E8 h* D8 a8 N7 V# O  e) {+ Z. _: q1 z- y
    顺序表示和链式表示的区别:4 m! e- q* P! W& e) j+ U' ?6 t
    ' b. C0 ^% g. t" U6 f
    创建方式:+ s7 v6 k8 v; b) m3 X/ Z

    : A, H7 {( }" y  T. o, c7 M; c顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    ( @8 [7 A# Q8 D8 X3 W  x2 V
    0 b, u, e, \5 K2 m; n+ U6 I(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)- V2 ?& d0 K# T7 \+ u/ H5 n- }& W

    # O0 b5 X  Q. K0 M链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。2 g0 s' {4 D6 ~8 d% f) @; x  z

    $ `9 X# I1 T6 V3 o5 j0 T8 K时间复杂度:% l# d5 g1 Z% F8 g' h, i2 g% ^

    / z6 y2 {9 M! W& D' K增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    - m8 M! d- z3 F. G; D. s. B4 B- u+ d3 K( ^
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    % c! s& ?# P; ], P" z
    - X( K: D4 \  Y: l6 c* P$ }) aPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    / x0 i7 I$ Q* q2 B' D4 x
    - w, M/ D2 R: h1 D修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);0 P; i; E: J+ a$ A$ L1 p9 Z

    4 W6 o. ]; D3 |查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);( n1 ^* {. y# B# |5 Q6 g
    ! Z" |& H8 s, x( J% o* G- E8 |5 n
    顺序表示和链式表示的相同点:
      ]) E7 D5 l$ `2 W
    8 Q" v2 m9 a) ^* O, ?  v' W删除内存空间:
    3 l. d9 D, B7 S" N4 [: O  L( p% Y9 }6 L7 [0 l# ?% i
    内存空间的删除都需要对每一个存储单元单独释放空间。0 h, X8 C& M7 p/ V# u% w4 D

    9 u0 o4 p9 S- k5 ~; v& D代码实现:4 z4 I0 L6 E& P+ T
    $ z6 n3 n$ t. Y4 \
    顺序表示方法:
    0 t- M, R  t7 \4 S& z( ^  W/ N* Z4 Q
    结构体定义& ]6 }  t0 A0 f/ e8 h( a9 d

    & z) U: I' T! A3 R- d5 Ytypedef struct {
    % @1 W+ d7 o! X* b8 F" p    ElemType * elem;8 A- m/ O& \4 X$ w1 K
        int     length;        // 线性表的现有长度 % _8 g1 j" V: z: P3 J" [/ [- V
        int        listSize;    // 线性表的最大长度
    ' B  J$ \4 L$ j) D0 I}SqList;
    , l( m% w0 e' {) U; U& V% E3 K0 [* s9 M: Y
    初始化0 d) k9 J3 y0 [: g, F6 S# f! m  T, J

    ( G  e$ n! e" H: d, k0 wvoid InitList(SqList *L){2 o/ Q/ V& {4 R. M1 F9 v3 O# r! k
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;; L, m$ b) G: U5 ~& K( i
        if(!L->elem) {3 O7 |0 S9 n* [5 _
            cout<<"申请空间失败!\n";9 X2 S, T7 o  n% q2 x" k3 ~
            DestoryList(L);* x, b) D& r  U: R0 K, ~) s
        }6 c# T. E" V  t2 K0 q3 G. U* }
        L->length = 0;, w8 y( i1 M5 D) E
        L->listSize = LIST_INIT_SIZE;
      E$ g" ], W- E% l    cout<<"线性表初始化完成!\n";
    , l' \6 }; T: f6 l3 J}/ u& N: e+ @3 x
    * z% C0 g8 ^" w! H& k6 E. N
    增加元素
    , D4 S, m& U4 w9 r! G4 I8 A/ y+ y2 o5 ~9 p5 Y
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素( z; s+ c1 e. q! ^! d! R  K0 }
        if(L->length>=L->listSize){+ m6 g" g$ T" u' V" N
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));: Z: _; g+ W$ ]1 s& N$ \0 F! y/ P8 X
            if(!L->elem){! E) V. w  |" ?8 d6 G
                cout<<"增加空间失败!"<<endl;
    ; |$ V( ~4 {: m. e! n! f7 T            DestoryList(L);
    $ y+ O* z" e5 z0 Z3 z3 O        }
    + _% `4 f' d% t1 J/ i4 W    }3 D  C2 I% D6 L' [
        * (L->elem+L->length) = e;
    ) g4 o9 f! Z7 X. D! d, S/ b    L->length ++;    3 ?, }& n' V+ k+ M! ?
    }' O: l3 ^& |  {, G* a

    4 o. t2 _  H5 y& P1 F" G: K' q0 a2 hvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    ! k( O) @( @- b1 [- K    int i;' {/ X; }# f  r
        L->length++;
      m$ o6 o" e' }    for(i=L->length;i>=e_where;i--){8 ~6 M/ a) t0 J3 ?/ g% {. O
            if(L->length>L->listSize){1 D9 x9 \7 T$ e' W
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));! ]6 ^1 V$ j, z% Q# Q
                if(!L->elem){
    : l. M6 D& _; `                cout<<"增加空间失败!"<<endl;3 b1 i, o% D! G9 e
                    DestoryList(L); 2 _0 {' H1 {9 V  y9 s) @  H
                }
    : f  H; `! h% M5 f( }        }7 [/ t- j! T0 q! A* g' G( B! D
            *(L->elem+i+1) = *(L->elem+i);        ) v. x- i4 o9 ?0 u7 f) K
        }
    . O, o2 _& w# R* Z/ Y3 x    *(L->elem+e_where)=e;; a8 y# ~* r0 W8 ~# ^
        cout<<"增加后的线性表如下:"<<endl; 0 H6 ~4 a, U3 |9 _; d% q$ j, B
        ListShow(L);+ O' \& R3 I8 v! G' k2 D& r* x
    } 6 F* {' [2 o; E, e" Y' \( ~2 [

    - g# s; _$ y7 r% t9 }% o# [void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素4 h* r5 N% t+ X; L
        int i;2 B" d- [8 X. ?* m3 w- o
        L->length++;* L3 k5 o  b' @' h8 M
        for(i=L->length;i>e_where;i--){# O- H1 A% e* a9 |
            if(L->length>L->listSize){8 ^; D7 }4 Z3 ~4 K
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
      P" ?. C3 Y  U1 W2 u2 |            if(!L->elem){+ D. ]  E0 y# ^. V& `: [9 k8 r3 d
                    cout<<"增加空间失败!"<<endl;
    & G: @4 W5 M# Z% T' Z  z                DestoryList(L); 9 ]2 h; D7 j$ ?, y1 Z+ L( I
                }+ e3 O4 w, Z2 x- o
            }
    + G- r, x) O) H. P        *(L->elem+i+1) = *(L->elem+i);        1 X+ I( @, e+ L" @- y, J  e
        }# a; e: }8 ?1 Y" u+ t: Q
        *(L->elem+e_where+1)=e;7 K8 g' d6 k9 [! O" @
        cout<<"增加后的线性表如下:"<<endl;
    : L( k* V6 O7 c    ListShow(L);1 i2 M/ _4 R/ f% x- A
    }4 O9 z0 y8 H# {4 c% X
    ( u: R  Y; X3 d; ]- Z: g; g
    删除元素
    ) N: m: F% _9 P2 [) G7 {- x% x  I* I0 M) y
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    ; B  g' ?2 M/ ^1 `5 O) v4 y( f    L->length--;
    3 \) w) A  B: s2 s! F) _    for(int i=e_where;i<=L->length;i++){. J, T' A# J( q% N  E
            *(L->elem+i-1)=*(L->elem+i);1 ~; P- Y: ^- O3 I" X5 J3 |% \; v
        }5 V, |/ }8 z' ~! n4 V
        cout<<"删除后的线性表如下:"<<endl; ' c, W2 [# I4 {/ y* q* o. j+ N
        ListShow(L);- B, c# I# B  X6 N9 X+ z9 D
    }$ g, \6 F& \# b; B9 D2 G0 ~

    0 X- ~) @! F7 J4 x$ R4 m销毁列表
    * q: Z* \, v1 _  ], S0 R/ f! X
    & Z5 s9 ?. O& |3 ]void DestoryList(SqList *L){2 f) E% A& n4 _% ^/ g
        int i=0;, i' u! N. [; N) a! Q
        for(i=0;i<L->listSize;i++){
    ! ~$ O; \$ B: \4 ~' Y8 [5 W        free(L->elem);
    ( \2 I9 A. t9 W5 n# z        L->elem++;5 c2 r# k3 @2 H- M# H) n! {
        }
    5 _& X) t7 k# L    exit(0);        2 K& ~6 y! Y( S3 k( V# v2 K, F
    }
    3 h) _" q9 |* O: [' e8 Y7 j
    6 q8 W; Y9 P+ v; d链式表示方法
    0 s1 X, q; i8 k# O3 z' b
    # _& w7 E* T) C7 V) a! g, r结构体定义
    ( p$ F+ g3 N% c7 A6 {2 J0 p
    5 s1 A# o4 e- e4 M1 W5 ctypedef struct L_Node{! P! p! T5 i( H2 v
        ElemType data;. T; O) f% P' ^* B( Y% q# x/ C
        struct L_Node *next;  h$ o+ g, I  a( R. p
        //struct L_Node *last;    //增加可变成双向节点 1 c1 n( i+ ~8 s! L# W: y
    }LNode;% K+ q, D: y- j) K, [' p  H1 V% {

    / P' F( O0 e4 B/ D5 g% \初始化7 \) y" W1 G5 X0 Q, e* K$ i# n
    % T5 }* U5 B8 i7 Q0 ?
    void LinearNode::InitLNode(){9 T5 z0 p' ], M. ~9 T0 G! E1 u/ {
        HeadList = (LNode *)malloc(sizeof(LNode));3 l% G8 V% n. w6 m$ G' w/ t. p
        if(!HeadList){9 @0 `; a7 p8 k: `; \0 _- V
            cout << "初始化链表失败!" << endl; 7 N/ B0 A( ~( J( v/ Z/ E6 ?
            exit(0); " a7 s  b6 n5 O
        } 4 b& C2 X& Q& q" {+ m
        EndList=HeadList;
    * m1 n/ B  l* X4 ?8 o    HeadList->next = NULL;
    . a: t2 f! _% O6 ^) L    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    5 G% b5 l6 {& _, B) K5 v& e    Length = 0;
    ! G, _1 m9 Z' J6 h  [  p    e_where= 0;
    0 g+ i6 c" u( l}9 }" W+ |1 T9 N2 t

    - z3 @! [: O: n增加节点" g% x; @. H/ M

    * g& a& o  f2 M& y# h- _  |* @void LinearNode::AddNodeHead(ElemType num){    //头插法
    * B/ {6 C6 m4 u6 R8 c    node = (LNode *)malloc(sizeof(LNode));; M; R. M% f, S
        if(!node){/ l; j4 Y4 P0 o3 f: }( Q/ A0 z
            cout << "新建节点失败!" << endl;
    * Z! n" P) }; R1 {1 S3 {& j        return; ; W" [& G- j. q
        } # c3 {0 J& x, d) Z8 u
        node->data = num;
    ' K8 j+ K8 V7 q* g  C4 B    cout << node->data <<"   ";# \9 n9 n8 N4 ?9 v$ @0 F0 K" B4 q
        if(NULL==HeadList->next){3 D* o# k+ H- V
            node->next = NULL;
    ) g7 M& |. k" d2 ?4 ^& N        HeadList->next = node;
    5 |6 j6 z* W6 i3 f$ ?! M        EndList=node;
    ) I3 Y/ a/ Z# m) I# E1 H! z5 v4 r    }) \  u6 J( z! n7 U5 r
        else{6 G; f8 {" \8 e: R
            node->next = HeadList->next;
    ! I8 J! J$ u2 |5 Y' h        HeadList->next=node;
    : d" {: K! \1 m4 t- J" p    }4 M! Z. X, a: l
        Length++;
    : u+ H* i  R6 _0 R}1 _- }' L2 D2 B. O

    & D& Y. ]2 i- Y+ J- pvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    6 `8 T4 i4 k/ M8 ?    node = (LNode *)malloc(sizeof(LNode));
    / j' m5 Z3 A8 K/ @    if(!node){
    ' R- B6 w$ P( O( Z' j; I1 d        cout << "新建节点失败!" << endl; $ q! F/ b  ~0 H3 W# \2 A
            return; / Q9 i5 n1 M+ c; Z( r( {! T: b4 |
        }
    ( f! o! ~: j, h$ u) s: d* b    node->data = num;
    3 ]2 T* j6 D" Y6 X1 v* |" G    cout << node->data <<"   ";  e! [  I0 U9 e" L5 `5 R+ ]
        node->next = NULL;) Z8 q# k9 \: d% A- {: \$ y+ q, Y
        EndList->next = node;
    : k! t5 p$ W# _9 D5 ^( X( v    EndList = node;
    6 k& f* l6 F1 ^8 Q+ l    Length++; ) t" X- K2 `. \, y, P
    }$ a4 u" H0 X9 K9 X0 U

      Q2 r* g; ]! [; K删除节点* ^' k4 e. u: v1 q- a# b8 d/ h2 i
    5 Y: i1 s- ~9 p$ J+ Z
    void LinearNode:eleteNode(ElemType elem){! N$ x$ V$ y6 X' A
        if(NULL==(HeadList->next)){# X% E( |3 B5 I4 T
            cout<< "无节点"<<endl;  j$ d" E) Q* t  V1 t3 L% {
            return; & h" z+ {& C7 E& d
        }
    - w- E' o& X$ H- F5 p' o6 s7 {    Node_cur = HeadList;2 n$ e2 y% m0 ?, z9 D3 g
        while(NULL!=Node_cur->next){
    % f, ?4 L6 o( H7 A$ Z3 `# ~6 ~- z        Node_temp = Node_cur->next;
    * }. G' x% o1 \0 K; v4 _6 {        if(elem == Node_temp->data){; u; z" E9 `; {* k5 M  @8 m& F
                Node_cur->next=Node_temp->next;7 l  j  s5 c: D/ h  v
                free(Node_temp);
    8 {; }, [4 G9 A! m        }
    & t# g4 |, v' a4 A' t        if(NULL!=Node_cur->next)4 i& Y5 c9 k0 f2 i; \- n, F: u+ @. r0 ]0 H2 i
            Node_cur=Node_cur->next;
    . ?3 D: b  p. d$ @8 \$ Z    }
    6 Q/ t% o& w. s7 t, i    cout<< elem <<" 元素已删除!"<<endl;
    ) ~! [9 c: O, U' S% V4 \# p( g}
    ' s$ [  _9 O2 V- o/ I
    . t# v9 c  t+ K/ f显示链表$ b7 j3 ^& F' R8 L$ g% z! J9 `& V

    & H7 F5 |! ~2 W+ m6 Ivoid LinearNode::ShowLNode(){
    " f( s/ Y4 q" u% U; G    if(NULL==(HeadList->next)){& d% j' W- q3 ?6 L$ E* C
            cout<< "无节点"<<endl;
    0 z+ }5 M% E0 W$ W0 f- }        return;
    . G% W  |7 a8 M    }
    + R: D) g) v3 I2 [7 ]    Node_cur = HeadList->next; 4 h, x3 a' U* o( h# z
        while(NULL!=(Node_cur->next)){; e- n, L0 `' x( i
            cout<< Node_cur->data << "   ";5 M/ b$ j0 i6 q, k. \
            Node_cur = Node_cur->next;
    6 M" I" W) k; k0 G9 E0 i    }
    1 P4 C  U. x5 i' R; M' W    cout<< Node_cur->data << "   ";( |/ ]( F6 Q+ E. ]$ r
        cout<<"链表中的数据已显示!!"<<endl;2 W% k* c0 E3 P$ y
    }
    9 j+ G% N4 S) j( [2 s
    ( }& Q9 j/ d, ^9 b: l3 q销毁链表
    ! X  p: c! |+ E, X. d' [' M" d0 }! d' h6 O
    void LinearNode:estoryLNode(){
    , _( q/ j/ D6 A& Q1 [+ W    Node_cur = HeadList->next; ; U$ w& S, D' e  R  w! _$ {, q
        while(NULL!=(Node_cur->next)){8 b* I( Z0 c* \; F7 q0 Q
            Node_temp = Node_cur->next;
    3 C) t( S2 d: B5 X7 I4 y8 M        free(Node_cur);, I  i, B$ {4 d& r) f6 p' w
            Node_cur = Node_temp;! [4 g4 O6 G2 ]
        }
    1 C. R! K; s; Z* U9 l! G0 z/ s    free(Node_temp);
    & k4 ]; I7 K- m; z# W# H0 ]7 z    cout << "数据节点已完全释放!"<<endl; ( v2 M3 x: N6 W1 Z
        free(HeadList);    // 释放头节点
    : }. B" Z8 V' w& u/ |7 u9 _3 _    cout << "头节点已释放!"<<endl; ; I" g+ r: m+ I1 p  l$ V% {4 ~
    ————————————————
    5 r% R) l9 Y/ k! }- M版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 @2 W! ^4 ?/ O; L原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    $ d- n3 a  M" Z9 e5 }, [, J; b0 s. R
    ! K4 \8 F4 ~- v: Z
    ; R" v, B! A: [. z! Y
    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-20 13:31 , Processed in 0.360824 second(s), 50 queries .

    回顶部