QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1538|回复: 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
    . D; H5 Q- z4 k. D# {/ x
    线性表顺序表示、链式表示实现方法及其异同点
    - A, \4 r# G! i; Q! P  n; M9 C线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。" ?1 |0 L( \* l0 i; ~4 B

    8 p/ c' T' A' z* p9 D) q  b本文采用C++实现两种表示方法。
    2 [8 B$ u, ~# y! Y& \
    0 p, E% H) I( |) W% o% ]' `* o: H目录- p) z* @8 N6 R& Y4 K
    3 \! v) p9 g# R% p. Y
    顺序表示和链式表示的区别:
    9 y, _! L8 _2 D# T9 @
    0 p( ?0 I1 L' D# S创建方式:
    % w2 \: o) ?0 ]8 b: o
    4 S) u! ]4 V7 b; c7 h时间复杂度:0 ]* b- ]) u( H5 f4 ]8 n7 I
    7 O9 |( Z% [" h! t# c. j. K: w
    顺序表示和链式表示的相同点:
    / x+ w% c7 C  k( Q* \3 N
    * n9 g& _5 c* T) i# ^* A( D删除内存空间:& b4 I# ?9 W! G" N+ e

    ( b9 K, f! H/ E" f  [" ^代码实现:' U# l6 W$ q- h6 j7 J% R  u

    2 l: q; D+ _* U: v顺序表示方法:- K  \2 K5 V' O8 D# L, Q

    $ T% x; ]; r% }+ y% ^6 q. Q9 ?结构体定义
    - b  P( d: |4 _/ a. R  n, b, J, @( y1 T$ L' {( e% l0 v
    初始化
    # ?! w  Z3 l3 i. E' B) @+ p; I8 F, O7 |% ^/ }) O
    增加元素5 u) d$ L0 _  V! e8 \9 ~4 R
    6 ?: k7 Z$ X8 `5 [% U
    删除元素" V) E; M+ c, h8 r

    . w3 \9 M! C9 @# H+ p销毁列表
    9 w# ?  L" I5 Q8 Y/ Y# S1 K0 b  a8 @/ X/ I6 _% k
    链式表示方法
    ' K. v4 v6 V. _) m" m- u5 S! Q  n0 L; D# e; F+ ?
    结构体定义
    8 w- O5 ^3 J& e5 r# z, ^3 Z9 g+ e3 n
    ! e( D: m8 |/ N初始化, G6 ^' ?4 w6 Q- B4 h' Q
    - M, s; c  M& m! r3 o8 U+ R2 x, K
    增加节点
    7 p/ R5 d' z) J6 j/ Z2 S/ w* _/ ~5 ?- N8 w: Z1 m
    删除节点
    1 a) B- i6 {5 b; D# F
    $ G% w0 V9 a) R% B; F$ i8 D0 \显示链表
    1 K$ P1 ]4 \5 h4 ]
    + S' p3 {$ ?. e4 W2 N+ b销毁链表
    3 T+ r) }, N. f* o9 D3 `$ Z' N' `/ d$ W9 W1 s$ `8 x" P9 p; i8 |+ X
    顺序表示和链式表示的区别:) v: Q- J& Q: r$ y2 D* b
    . j8 m0 {3 D. \0 A+ d1 h# V( w) v
    创建方式:
    * u0 g+ C  \! M% o5 k% A- K* S6 [7 y. |, ?0 w3 Y' ], D" Z: X
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    5 _& h3 m+ u6 [; b* n
    / g8 }6 h+ e; o0 @) X# c8 [" k(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)2 Y! H+ b2 c! R% T. f

    & d" b: i4 P* P链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。1 i: R) n. }0 a5 Y
    - u4 |  X/ U7 t) ^
    时间复杂度:
    2 T% |% n7 n' g; i2 K5 k3 @6 d5 J& S" ~% [# |) C+ U1 O
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    9 r0 m- k! X4 d# T- |% r, B) c
    0 q3 X- L5 G- z  _. n增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)/ B6 U) p- Y  v! W. n* [

    * {1 N. N( Y, a; O0 O' W+ aPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    7 {6 i2 l! H) W  b0 L2 R) p9 s1 u, P4 g
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);( z' Q6 j$ t8 ]% e) }

    0 b" S1 `* g0 q% T5 A* |* X$ O查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);. n# }- ?$ S/ g' Q1 W+ ?" c
    . V( A, N. k# E, v
    顺序表示和链式表示的相同点:
    / P: b; v2 i# Y. ~$ R6 J- |+ W
    ( s; Z/ ?+ \. e2 G9 q0 v5 G删除内存空间:
    2 t! H9 n1 R. y' t  W
    4 E; l) I: r% @- R1 o内存空间的删除都需要对每一个存储单元单独释放空间。
    $ Q8 `- V3 ~5 e# P; `+ A: J" b( p8 e" x+ D2 f7 ?6 B
    代码实现:
    4 a9 k! h8 A9 Q( ?5 ^' {0 L" g# _; t9 D* S1 b1 N9 V6 R% v
    顺序表示方法:
    6 l+ F( b0 @0 z0 [9 @" N6 t- \) Q/ Z3 f' E% V5 l8 t/ z
    结构体定义
    4 K5 w- n5 Z$ g) q/ c0 Y1 f' s1 S7 V* I  ~% e! {
    typedef struct {" D0 v/ A) ^: t+ T1 d7 K1 q
        ElemType * elem;
    % D9 k4 f3 m7 P) ~2 Q    int     length;        // 线性表的现有长度 + g; z: a. q/ C
        int        listSize;    // 线性表的最大长度
    * X! |6 c9 c! T8 g) G# C$ Z$ ?/ |}SqList;
    1 a0 x5 v' `. I
    ( [$ H2 j- B! {1 z1 c" g初始化
    , ?1 c! H/ V9 `3 Z! O9 A* ]1 J( O: H& u
    void InitList(SqList *L){6 ]% }. R& Y" x. V
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;3 |: v( L' p# e" T  I+ [
        if(!L->elem) {
    6 ~" t, I" a% H6 l- J  o( A/ c        cout<<"申请空间失败!\n";
    + z# H6 }* B) ^) i5 z; ?$ S7 o        DestoryList(L);% O$ ~6 h4 u) `" ~- Q: n) K
        }
    5 o: y; s4 p5 W" n, @    L->length = 0;0 g* d" B# ]$ F0 ?( L% Z
        L->listSize = LIST_INIT_SIZE;1 R3 c' p$ J+ }; ]
        cout<<"线性表初始化完成!\n";+ K0 ]9 L6 K8 x2 f# ~) o7 q
    }
    , z8 z- i+ d3 H& x* q! @. h3 [, F+ Y' i, U
    增加元素
    # I( Z* L2 c; |0 V  h( Z8 A# v8 [- O! K2 d
    $ R( c; C" E8 Y- l0 d8 `1 {1 ~& cvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    " T. ~9 I' {" i: U' [4 O* V' C    if(L->length>=L->listSize){1 R# R! A& n' H- d
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    " |( L8 C" X4 ~% V2 {# v        if(!L->elem){  s; B& M7 r  S. D# n7 O2 L
                cout<<"增加空间失败!"<<endl;
    5 e7 G; C$ T5 h) u! @# }            DestoryList(L);: b7 Z1 x, l4 q5 H/ |% T3 L
            }
    - m0 L" v9 t# I0 t    }; {% U$ |4 J0 o  ^9 p# D. X
        * (L->elem+L->length) = e;
    ! @( E2 s% I* s- c3 `* f9 B3 d    L->length ++;    . ~4 f  m0 p: u' g3 U' ^# V8 r
    }
    7 {2 U- e7 y* }( c5 I1 T
    7 `0 c' M* C" c- cvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    - H3 ?- T/ h2 n0 ?- e0 q% ?! F    int i;
    9 T( g9 E& p! C: `1 V+ f    L->length++;
    7 r% t& A* i9 k0 c8 O9 T    for(i=L->length;i>=e_where;i--){3 h' j5 v+ h6 k7 q! S
            if(L->length>L->listSize){4 ?- h. ~1 y! {/ [3 [9 [% z/ U% D+ w
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    * R$ X! s  [$ Z5 u            if(!L->elem){! M8 L) s6 Z7 g7 i8 m# S
                    cout<<"增加空间失败!"<<endl;4 E0 I: F* e' S" Q
                    DestoryList(L); $ b! T" ~! @+ n
                }/ g. L) f& U9 ~% Z
            }
    9 {$ t. O7 S4 t$ t6 ?        *(L->elem+i+1) = *(L->elem+i);        
    7 h# E* v4 g: @2 o: D    }
    ; T+ E$ c3 ~" B9 ?    *(L->elem+e_where)=e;7 c4 `0 I1 ]: Y' s0 A. u# R
        cout<<"增加后的线性表如下:"<<endl; ( a7 T2 h  o6 U" c( A
        ListShow(L);4 [3 ^! B, S$ y  g. r# H6 Z
    } # y* s: ~8 v0 J& P# J

    $ ~* \( |0 d* O  M$ s$ Hvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    2 q9 \' D/ [0 Z9 ?  L0 y    int i;
    + C) X  t! F! G* l    L->length++;
    * z0 m* F( D( _( j0 z    for(i=L->length;i>e_where;i--){$ t2 s  g8 V9 M/ M0 J! f
            if(L->length>L->listSize){
    9 P; l+ I) n" M  U3 j8 h            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    5 B( h. T4 g' V; y7 F            if(!L->elem){
    4 r+ B- @( T4 I7 a& N5 p7 D                cout<<"增加空间失败!"<<endl;
    $ `) {3 Y8 @% H1 k, @/ }: [                DestoryList(L); $ ^4 z- u# S$ K) A# L! a5 C1 X
                }+ _( ~9 L' q6 B6 O( _$ Z5 Q& A, |4 t; ~
            }
    ' l8 M* J' |- Q+ C9 s7 W* d        *(L->elem+i+1) = *(L->elem+i);        * C* f" _( T4 Y1 Z& `4 E
        }$ L2 ]5 C/ d7 n6 ~
        *(L->elem+e_where+1)=e;
    ; r2 `; G; c' C    cout<<"增加后的线性表如下:"<<endl;
    ' a( f. {3 L  X    ListShow(L);; }  u* G: y/ ^" S/ v
    }
    ; K# g) f/ h3 N0 T. R. {( K# S+ _& a/ ]" _
    删除元素
      Z! W* z; O$ N1 z
    6 t% z6 x, E6 u+ Cvoid ListDelete(SqList *L, int e_where){    //删除某位置元素 , U1 g0 `3 N5 t/ f$ w
        L->length--;
    1 E4 H2 _! q/ L0 w  K3 ^    for(int i=e_where;i<=L->length;i++){5 T9 T4 f2 o2 h
            *(L->elem+i-1)=*(L->elem+i);
    8 v5 @) j( q; A# a2 {    }: c6 \8 o+ K6 U7 `2 z
        cout<<"删除后的线性表如下:"<<endl; ' K; F) o8 h2 M3 b6 d
        ListShow(L);
    + e9 M) Y7 ?6 N4 H1 ~" D* Y& O}
    $ \$ O: ^2 ?! C* j9 ~& @$ o) _& c' Y% @. z3 j& n
    销毁列表
    3 h5 j& o' `  O0 l2 k$ ]  {6 J5 S% Z& R7 q% ^2 x. i* Q4 a
    void DestoryList(SqList *L){6 @5 p3 d8 s' X% z* m
        int i=0;
    - i. s; ~9 G% G. p' B6 w! E    for(i=0;i<L->listSize;i++){; \5 O# k$ p6 ?: z0 A
            free(L->elem);3 \6 W7 U& r( x8 \0 U* V- f
            L->elem++;3 s/ N/ X0 h1 C' Z% |& {
        }7 S" ~) K* k9 }( i8 Y
        exit(0);        5 N& w/ y8 ], N6 W' r
    }, z. O; _7 P1 E1 h
    # G" m+ n0 R6 S' C! H! E* ~) M3 t: _
    链式表示方法% t. s7 F# n$ Q  A5 k* X; F) {

    1 T% U- C% X+ Q5 o& V结构体定义" }5 b+ x& Z% ~% U. H4 l' d0 R2 O

    % f: G' G% W$ Q" G0 u' Stypedef struct L_Node{
    $ [6 N8 o, O+ @1 I. t5 `6 c5 v; C    ElemType data;
    ; ~1 G% ?6 ~2 B- X: g    struct L_Node *next;  d  M0 l- n) _9 `9 d. r; G9 |
        //struct L_Node *last;    //增加可变成双向节点 + W' N' g9 h7 P: t$ V
    }LNode;& V! X# l: P9 i/ L9 v

    6 F* [$ q3 ~  g- \+ Y初始化
    ' _/ L$ \) c. R6 @5 G' z
    # h8 l: w3 e: w8 \# z  Z- Fvoid LinearNode::InitLNode(){
    + ?8 k! Q% D! u0 Q$ H" X8 }    HeadList = (LNode *)malloc(sizeof(LNode));
    - _( t' C! g& b' N) Z6 `1 |5 R* z    if(!HeadList){
    1 \) j7 ]0 o: R8 U: v        cout << "初始化链表失败!" << endl;
    * T1 o0 O4 e; Z% ?/ K        exit(0); 0 d3 i" L1 k, h8 R
        }
    0 j3 G8 L2 k$ p) G7 k! {) y" {; A    EndList=HeadList;
    . q. R6 W. M, X# a) {) k5 v1 Y+ x    HeadList->next = NULL;  J3 r9 {/ a- j
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;& M: o$ j( p8 ?( [
        Length = 0;# X) V, _& }+ S" c- R3 R4 E1 Q
        e_where= 0;
    3 e" p4 S7 c6 t. w! h& f}
    5 e/ _! b7 {' V6 Z, N5 S: c+ R6 E4 q
    增加节点
    ' Z% S5 M* [+ m
    - o7 k* [! [# P7 [7 L; O& l" Avoid LinearNode::AddNodeHead(ElemType num){    //头插法
    . J) d. Y$ G2 b    node = (LNode *)malloc(sizeof(LNode));5 ^4 W; |# N' [
        if(!node){1 a2 x7 d. f, G" ]: r! P% c
            cout << "新建节点失败!" << endl;
    ' O  m: O: `7 b" s4 D: X; c2 |        return;
      H9 L8 m6 s+ I3 o    } + S( z- L. _4 R% _
        node->data = num;
    , ^3 x/ `) L' m% w1 _0 x+ Q    cout << node->data <<"   ";
    + F0 E( L8 |. R# R    if(NULL==HeadList->next){
    0 `. E, t+ C; Z8 `        node->next = NULL;
    & t7 n2 J* ^4 P3 M- u1 a  t        HeadList->next = node;, e8 |( y. G& E. Y3 U! y5 M% R$ q
            EndList=node;
    ; J% x8 c* n* A) d    }
    + W/ `* T# U0 u1 X; Z    else{! Y- Y6 v7 e  B& O
            node->next = HeadList->next;
    0 Z# g# g5 Q; u" o        HeadList->next=node;9 Y: G6 ]' K( U8 [  L6 F
        }
    ( O" P/ f: H6 \( W. O    Length++;
    . A* M! I% I. k2 b2 [, J}
    3 O$ e5 d6 E# s/ l) _6 U' ?& ?
    & U( G4 W; m0 j( J5 m" [' c: H5 }: rvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法 , _0 R! T& E/ N- a* x1 [
        node = (LNode *)malloc(sizeof(LNode));
    $ o6 s# J5 y# C$ h' O    if(!node){
    : z. D9 ~; w$ |' p7 B        cout << "新建节点失败!" << endl; ' V. O' C+ D( Z$ U) j
            return; 1 }8 |% h, P! b  C* a/ s1 @4 _8 D
        }
    ; i! B* F) B; d3 r2 i    node->data = num;' L# a# Z; n5 X$ {8 t3 Y
        cout << node->data <<"   ";; Q: n" U4 }( a5 `" r
        node->next = NULL;0 K7 E! }5 j* Y1 ^+ X* {6 S
        EndList->next = node;
    7 ^4 Z  d& h7 \% W# r; j    EndList = node;
    + P) t! k3 S4 ]! V    Length++; 2 K- M+ o4 @/ e
    }
    3 |% \5 J( k( v$ E2 v
      }7 m6 l  z( E9 y3 }删除节点
    - A* y% ~) Q; P* a# s0 t' i: y: G: d3 Q1 s4 T4 A7 E7 _6 T
    void LinearNode:eleteNode(ElemType elem){! r. [2 {8 ~$ @' ]2 z8 O' h2 g, @* N
        if(NULL==(HeadList->next)){
    . E( A- {( q! U0 ?$ H        cout<< "无节点"<<endl;) ]4 [! e5 ]1 |: s
            return;
    , N* e* F. r. F2 I    }
    * I5 w# K+ V4 F4 A( F  t3 C0 ]    Node_cur = HeadList;
    * R& s" {9 T( a8 `( G$ @' _    while(NULL!=Node_cur->next){3 J" B) u  S5 k: }
            Node_temp = Node_cur->next;
    . I1 D! O9 a" C2 [' Y% b7 N) ?0 b( ?        if(elem == Node_temp->data){+ }" h/ ^& G) W& l. {( K
                Node_cur->next=Node_temp->next;
    1 n% Y6 I% R- [. _$ C7 t            free(Node_temp);
    * E' Y; k; ~! @+ c$ C7 L" x' a        }
    4 y2 W3 Y2 Q, f' ]        if(NULL!=Node_cur->next)1 S  o2 z/ ^- I  R% z3 U9 h# q
            Node_cur=Node_cur->next;
    ( Q" ~/ k. z9 @  t0 T. g9 W  X    }
    : A& Y! U6 \  `3 m# B    cout<< elem <<" 元素已删除!"<<endl; 3 Q. I' t/ ]7 N. A/ l9 X% L% N, G8 |
    }
    ; P4 W6 e0 k  v5 K# j
    9 i  U# \: u" V1 q/ Z显示链表, K) W& @" H  Q, M) o& |

    . @' o2 ~$ f- s; kvoid LinearNode::ShowLNode(){: x: D! X+ w8 l, ?, D
        if(NULL==(HeadList->next)){
    ' Y( c' m, C# M5 T% L3 D' b        cout<< "无节点"<<endl;
    ! n# W! y$ L+ c$ w+ X+ }. O        return;
    % C0 `2 s6 L+ f4 N) }! C9 C6 b    }5 n9 ?7 a% ]* t4 p6 m
        Node_cur = HeadList->next; ' s9 ?/ O5 h/ N8 q
        while(NULL!=(Node_cur->next)){
    " N  c6 V7 A# |2 q        cout<< Node_cur->data << "   ";
    0 `9 s8 m/ t  ^* c5 W        Node_cur = Node_cur->next;
    2 z0 _, o2 ^) t2 h  h    }& o+ L4 x: _7 w1 g: z/ @
        cout<< Node_cur->data << "   ";9 S& @  Q& {2 m: p9 j" w$ B  D
        cout<<"链表中的数据已显示!!"<<endl;* i! ~* x4 D. Y2 o3 q
    }
    5 K. Q( C$ J: H+ H4 x8 y, t! {) I8 n, M/ T
    销毁链表. \5 Z! C6 @% T3 z

    5 P7 i1 I; g8 @4 yvoid LinearNode:estoryLNode(){3 G) t0 s& L. ]- j1 x: a  p3 r) o
        Node_cur = HeadList->next;
    9 O4 q; Y/ ]; r: p1 v9 o    while(NULL!=(Node_cur->next)){! [! m& k1 p, @
            Node_temp = Node_cur->next;
    . j) j8 @, X% _2 t$ P2 n+ [        free(Node_cur);
    ; m  G, M1 A7 c8 w8 o4 \        Node_cur = Node_temp;
    " z6 `7 w; C( C8 \    }  o2 k3 [& g; S' w  J0 d' a
        free(Node_temp);, b' j- D/ w7 |' L' W, P* Y
        cout << "数据节点已完全释放!"<<endl; 6 W6 E7 r0 V& O6 y
        free(HeadList);    // 释放头节点 6 J) u" J8 R( M( L
        cout << "头节点已释放!"<<endl; + Q% K, s. o' ^# V+ G
    ————————————————: R  B+ v- s8 F# G& ~
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    + a9 f- ^$ b1 M! b; u9 X原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    6 t; K, l. l# e/ t# L, b, q9 J  V4 u6 K3 g0 k! R- D
    ; l1 v1 p% h" w: l
    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 22:58 , Processed in 0.438089 second(s), 51 queries .

    回顶部