QQ登录

只需要一步,快速开始

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

      o, C* z4 [! r( `# ]. D6 T) {7 r) d线性表顺序表示、链式表示实现方法及其异同点
    $ ]1 Z8 s6 |# Q" k线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。4 F! S& [5 ?  Z+ k$ o( y: D) I2 v
    , |6 W. }/ A+ \( o
    本文采用C++实现两种表示方法。
    1 ^0 K. Z' e, A0 E  u! o3 w* {, A+ i$ g5 |
    目录. L) K, ~& t0 R* s% ?; n* ^

    8 y8 y) H3 b  ^  G% `1 ]5 i: p" ]顺序表示和链式表示的区别:
      L& n+ M- i# K% ^
    ! a/ `, U( Y$ p. O$ F4 A创建方式:/ M9 W% T7 }8 G$ m( P8 {
    1 M) T* e# P8 J9 I' j
    时间复杂度:
    : Q% I4 r7 ?+ _8 i- o
    ! l& T  t, s3 G) |3 G' @) a顺序表示和链式表示的相同点:
    7 o  H& {$ p0 f0 T- `0 f
    : \$ F- b- G: f# J9 c( t; u8 t删除内存空间:
    # \: T( R' O+ c0 I7 |2 Y( Q2 T3 T+ L0 U
    代码实现:
    / a1 q4 i% w/ v8 ?- P' ?1 R% I# g" U3 W1 |; ~% y
    顺序表示方法:
      P. U, S8 {2 {0 \0 `; ~* i4 I* G; q( f* T% l: d/ t9 n. @
    结构体定义
    ' Z! f( H7 O0 ^
    , v: d) ^6 }; n初始化
    5 Q7 M3 }& l$ c& c' t
    ; ^8 G* v7 x" j. ^1 l/ n增加元素8 B+ V! a; ]9 X- _* Y5 X
    , O) I5 }0 D0 f9 |7 K6 n
    删除元素6 ]) h4 w7 T1 Q& Z+ Z3 y
    6 E* g# R- ^+ V% u3 x8 Z7 l: f
    销毁列表
    # P4 W( b, T* J# P% p$ X6 o8 w2 Y$ d
    2 e# s+ \/ u: `链式表示方法. u: `  r) o" w, g' |0 O
    8 r4 l* c' ?! h/ a
    结构体定义
    ) U- h; M3 a$ \" i- y, i6 O# _! `8 @$ \
    初始化
      A* e/ O) V1 L) x( j$ A! j* ^& p$ u, G7 X- A
    增加节点
      S) Y8 G  C; \9 {, |, A3 Q% z% n: g
    删除节点
    + O3 Q  \( O- m. g+ u: A9 t8 H0 F1 R( U2 n
    显示链表
    # b( p. N6 T1 b  d% [, u/ W; V% ^& o& O
    销毁链表
    ( O7 C9 d6 M! O  ~0 X+ i1 A& W( O- K- n$ e2 I8 C0 ]1 @
    顺序表示和链式表示的区别:
    3 \7 |& |% _/ r6 g$ g, u- i7 ~
    " v- ?: B/ ~8 @9 O& v创建方式:
    " p+ k3 ~  H. C* d; A/ V
    . Y# y  Q9 s8 i$ J: _  t  B顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。! }# t* z; m4 c, c# V' V
    2 ^) L: @5 t; t: W9 G% ]
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    4 G. j5 ?0 B: E$ ?/ Z: }. j8 O& \! g* y
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。% j- g0 W+ D' }" d% C& [5 H

    0 R6 a2 q- o( X5 B) u+ ]时间复杂度:% E( W+ h3 ^" j# E- L" S9 |) x$ T! w

    6 m5 W1 w) b% E1 O6 ~' ]增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)5 h8 R# h* |' m5 q

    ; w5 K' {- S0 |! p# M增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    ) q( e2 N& J" q  E3 A4 l/ D2 s& P. u+ [0 J) Y5 r! h3 A) Y! g
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。' V/ i: E/ r8 t. n6 K2 F) s

    * |) m5 l2 v6 ?# C- Z  F# a修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    2 y* v/ g. {5 A4 m& ]% ^$ ]8 Z) o
    8 X4 p3 }& ]5 a查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);' b5 H8 k' o2 J7 H7 O0 b# y( C8 F1 i
    ' x$ M/ d2 I% K: ^! d( T
    顺序表示和链式表示的相同点:- g' e5 x" B; L: t1 c  s

    5 `. c; y) N4 j/ p( H! A删除内存空间:, a' \' H  G' h  k* g
    5 I3 @$ x- r( J0 B
    内存空间的删除都需要对每一个存储单元单独释放空间。
    % j) V& O  f. Y
    $ j& d" G7 q, d: J4 ?8 s代码实现:
    0 a7 Z- b, j& g6 L2 X* c' f) z/ ^4 Q
    顺序表示方法:
    ; a( g% W" J9 I9 n0 d) p
    8 n5 L7 b' G+ G+ N/ O! T! U2 Q结构体定义
    " `  ~+ Z( }6 U$ e% m; `
    ( P( d% D) G" X  Z" [0 t* j5 otypedef struct {
    : f' n. o# ]& A& \) O3 h, p% I    ElemType * elem;
    . n5 N& X6 Y; n+ \3 b    int     length;        // 线性表的现有长度
    ' {/ K# A8 y& s6 I8 \! f% A+ X; J+ D    int        listSize;    // 线性表的最大长度
    $ ]5 U: I' D; U: d}SqList;1 Q2 ?3 z6 y( ^$ b" C8 Z
    . E. [2 r5 |% X0 ~
    初始化
    6 ~6 h; `. p1 i) \& A
    9 }/ G! l! W3 Y+ \' wvoid InitList(SqList *L){
    % [0 L& G, v) F7 ^8 ?3 M    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;9 h/ X) W0 W% W' X
        if(!L->elem) {
    $ _) c1 C! m; X( m, o; a& K" Q        cout<<"申请空间失败!\n";
    6 ~) [# z! g. ?6 D        DestoryList(L);9 W% R. }$ [5 r
        }
    4 J8 y; ?1 W1 w. C* P! [( ^    L->length = 0;
    # `+ I6 I' o3 x8 x3 y8 O' q( g    L->listSize = LIST_INIT_SIZE;9 s; x- \$ G, b- C1 X+ i
        cout<<"线性表初始化完成!\n";
    4 L6 X) d1 t- k: @% N( K}' X  e  H8 C& u, x, A" a

    0 L6 S+ ^3 m8 r5 ^增加元素+ p! V& J% G5 `; G7 Y) z

    # x" C- z. T: i# I# Cvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    " c& W5 A% n- B, v2 Y5 B    if(L->length>=L->listSize){
    . a' R' m, S; k2 Z        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));9 g7 A8 l' f) r. F
            if(!L->elem){
    7 P$ i, s* t# V            cout<<"增加空间失败!"<<endl;( C" p, ~) K, C: }/ x4 F
                DestoryList(L);
      ^. O. C6 r$ n! Q( b* L& A        }
    ! l5 V) B3 a9 q8 r7 \5 Q( Y    }
    , S' d2 X0 A( }2 Y, d+ b' D    * (L->elem+L->length) = e;
    + I5 J( _9 Q0 _5 E& }    L->length ++;    . u* c7 _2 k" t
    }
    " s1 q% F3 g8 S. L# q7 t/ N" Q6 Q* g& J5 I3 _  o% S% T
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    : H5 V) [; ]; E/ R' Z$ ~% ?1 ]    int i;
    9 |7 I7 P5 |! T- A) z0 J! ], s    L->length++;+ v6 m) d! ^% I0 @' q. o+ L' W
        for(i=L->length;i>=e_where;i--){; u* q: h- E7 Y/ a' ^7 I
            if(L->length>L->listSize){
    5 h1 S: D5 t! ]" K9 `' M; }            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));4 A) Y4 G# p1 K% L' J2 o7 K% y* V4 P
                if(!L->elem){+ ?5 r  O' I- L% E% o; U
                    cout<<"增加空间失败!"<<endl;8 }$ o4 s/ _2 X7 \4 r0 R
                    DestoryList(L);
    6 W/ C0 M8 I  C0 ?0 P1 E4 X+ F            }3 @1 s* y. R( p" R
            }  S4 X& A5 P$ o
            *(L->elem+i+1) = *(L->elem+i);        
    4 R( l: j( Z3 b  x& T    }0 I" R7 L( R$ A4 F+ ^2 q
        *(L->elem+e_where)=e;. O0 z3 I  b) w3 B& l0 V% Y9 u! E8 a+ A
        cout<<"增加后的线性表如下:"<<endl; 1 @* m/ t4 _2 w( r; x$ p( g2 W
        ListShow(L);, G. z+ X8 \' x* [  s
    }
    ( t+ ?' J9 |0 y; f. }: O; z5 y* ?' t4 I! k/ q
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素3 x& W4 i( Y. l
        int i;3 n( c+ |* s- w% t/ a* g
        L->length++;
    $ V3 ?5 _- k1 B, b- G4 r/ [    for(i=L->length;i>e_where;i--){
    9 w+ L1 n2 D8 ^" F/ Q; y        if(L->length>L->listSize){
    . d2 O6 u& d2 w0 J* ^0 ?            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    8 J5 Y, L$ ^4 _, c) p) l            if(!L->elem){5 e% t5 H( a3 m$ D8 i) A
                    cout<<"增加空间失败!"<<endl;
    # l# ^- D& a7 @, ~. e  T6 @4 E                DestoryList(L); 2 L  W, D4 G/ x9 N, w) f2 j
                }
    ; g9 w, D, @1 |        }
    ; _; x! i( `: E1 Z' m. \. ~2 \# I        *(L->elem+i+1) = *(L->elem+i);        ( c& T" C. ?3 C7 J# G
        }
    6 y9 I& B" e9 z5 m2 W5 C    *(L->elem+e_where+1)=e;6 B9 h& u. h6 S  m( V
        cout<<"增加后的线性表如下:"<<endl;
    6 M+ q* n& E) y6 A    ListShow(L);
    8 L' \' U1 _% C: ?}, }$ D2 l5 F' o8 ^

    ) K; }- t3 s/ N5 ~删除元素
    9 q7 a% J" h/ i& m, R+ G0 T2 a+ |7 F1 l( S7 U
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    % e, h8 V; b6 [" q    L->length--;) P) e& k: x" T9 k
        for(int i=e_where;i<=L->length;i++){, k* X- I4 A' J
            *(L->elem+i-1)=*(L->elem+i);/ [. v$ y6 ]* k) A
        }! F, {" E# J( z2 U8 P+ @
        cout<<"删除后的线性表如下:"<<endl;
    + Q1 r* l$ o+ ]' Y1 M: k    ListShow(L);7 J0 a: ]5 b5 f2 a$ w1 `/ f0 E
    }
    % e/ T6 g; o$ x/ T) G
    & q* C% n# _% Q) R销毁列表
    ! e4 k9 X$ g0 q0 F. {' o! K) D( }" Z% p. K2 q/ J% b
    void DestoryList(SqList *L){
    4 K! a- X$ ^# i! j. y( T    int i=0;, [% F/ \. H5 A0 ~' |) A2 l
        for(i=0;i<L->listSize;i++){
    , t  \7 s; R. I5 q0 X        free(L->elem);4 l6 A. Y$ g8 Q# P7 d
            L->elem++;9 {0 I3 m' k, r- a# G
        }
    1 R3 R( U, p- j    exit(0);        1 N6 X, ?# H# C  z
    }  n: I( v9 x5 c/ ]
    8 ]4 f4 F+ d: F& l, {$ G, K4 L, f
    链式表示方法
    . h, Q' A+ r: `% r1 d% f
    ! [+ u3 T% G: z+ i) L% p结构体定义
    ! K; ]/ a, E' [8 X5 M* l: B; F
    - W$ U9 G' Q6 y. a! k; v0 b: `typedef struct L_Node{
    1 d; |& d. m. q7 K. b% ?8 W+ B" H' ^    ElemType data;
    $ z0 I# {6 t: g9 d& n6 o" E" L    struct L_Node *next;
    ( g; `/ U0 x) h: [    //struct L_Node *last;    //增加可变成双向节点 ; E# C1 ?5 e; u  _9 k$ U. K, R
    }LNode;  ^( `- v. a# t9 z0 d7 l5 S3 `
    * W# T5 l5 l/ u% ^! {) @4 i7 C
    初始化
    . R7 Z( M$ P. r# T. p
    3 B2 |: b( @* k- u  H1 d* Q/ Evoid LinearNode::InitLNode(){
    2 c6 A( Z0 Y& ?    HeadList = (LNode *)malloc(sizeof(LNode));! v: P! c! {& u; ~- [3 M' |
        if(!HeadList){( y( G- L5 |. z$ G7 h, r3 {  u& m) ~4 ?% _
            cout << "初始化链表失败!" << endl;
    . ^/ R$ V( l) M% L% B5 Z% x" z        exit(0);
    ) p* |: I, H5 e4 Z5 G0 {  ?    }
    6 [6 g  {, Q2 d    EndList=HeadList;  |- W6 ?- [) i1 E
        HeadList->next = NULL;8 [4 Y- N6 l; `/ i2 e) F
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    ! H2 ~7 k' p" ^8 o! _8 L5 f    Length = 0;% T! A& w/ q! @/ M( I! k/ }7 r
        e_where= 0;& B1 R6 p; _, D( F* s! w: ?: B
    }
    4 m/ [, O* W5 `! J: k$ e) I  {- v
    & U2 @% F* w$ ~- l增加节点
    0 H4 N7 \. t) O5 C+ a; u5 L9 [, R  p) s8 O7 ^' z3 }
    void LinearNode::AddNodeHead(ElemType num){    //头插法 / Y5 S0 ~& W+ S' k5 d
        node = (LNode *)malloc(sizeof(LNode));
    , J: e$ A) R, S+ @, ~; E    if(!node){
    . E6 I4 `+ R* _' p        cout << "新建节点失败!" << endl;
    7 x6 I' B" r5 ~( ]        return; * _! Y1 G* b  q6 y  ~9 Z9 `
        } : p' k1 u# Z% {/ o# w
        node->data = num;$ t% ]0 {2 C8 Z) ?2 V7 q
        cout << node->data <<"   ";. c  r9 s+ O; K* w; A
        if(NULL==HeadList->next){" @' N- |3 ~) W( w6 [  S
            node->next = NULL;/ K$ c3 f% K7 u
            HeadList->next = node;7 N8 t4 P  V3 T! T0 x
            EndList=node;. I1 D# N& S) U  X- D
        }
    + ?$ d# E) F' Z: m7 [3 ~( Q    else{+ h! @9 m) X1 N( V+ h& i4 |
            node->next = HeadList->next;
    4 y& g( L/ h- h; _        HeadList->next=node;% @( y2 G% e$ y" [+ h+ X
        }
    $ A. c. m2 W/ k5 Y& Z. W* P% Q    Length++; $ v* z: Z+ h# m& U9 I
    }
    $ W) X* R7 S: z/ g1 p! W/ q6 }* h
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    , n& \0 o0 q( [' [0 S    node = (LNode *)malloc(sizeof(LNode));
    + U7 b/ H& f- Y; ~) b5 p    if(!node){
    + L) Y9 n% E$ i        cout << "新建节点失败!" << endl;
    $ u* T" g, I/ ^' g5 }        return; ) }$ \. {& }/ C! g. T- M
        }
    - I( m# K( @9 d' V    node->data = num;
    8 @6 _. S5 q+ Q; s: V    cout << node->data <<"   ";) O* r& j; Z2 }3 o- t
        node->next = NULL;, \# m% l5 O, \# _
        EndList->next = node;
    5 K$ h9 N4 f0 z0 j9 `7 Q    EndList = node;  q5 c, n2 a; Y8 y& n4 S
        Length++;
    , T. b' [" x5 M* ~. |, K5 [}
    3 W" x( u0 h6 p  N, B( z# v1 W2 L: _9 g: @
    删除节点9 y+ j% h4 z2 U/ G  g1 G/ f7 M+ W/ G
    : v+ S+ q" M% ?- @- L
    void LinearNode:eleteNode(ElemType elem){
    : M. J1 V2 k% L    if(NULL==(HeadList->next)){
    , [% a# f, t! a4 [4 M; {        cout<< "无节点"<<endl;
    8 M' Q  `; v3 m/ f2 ~8 H        return;
    : c8 v& Q" k$ ]3 Q1 S2 R" O    }; x9 H! ~3 U& {* B6 s; T$ F
        Node_cur = HeadList;# e4 D; p" D3 g! m5 Y3 N
        while(NULL!=Node_cur->next){
    " b5 H. L+ n. T) F        Node_temp = Node_cur->next;
    % m7 \# g6 |' z1 {5 ]$ e: `& A/ Y        if(elem == Node_temp->data){
    6 V- W$ L/ F) R            Node_cur->next=Node_temp->next;
    5 A9 M4 p8 M6 Z; u3 x            free(Node_temp);
    6 A1 T' t5 o/ ?5 f3 {        }% `, }% I/ o, U) a8 j" N
            if(NULL!=Node_cur->next)  f; G& h& G" |% `& z0 w# L
            Node_cur=Node_cur->next;5 y. c9 }& D7 {* i: Q+ m& B
        }
    9 \( r9 r0 z- z3 w    cout<< elem <<" 元素已删除!"<<endl;
    & B0 i9 v+ f7 E+ J+ R- P" S  L} 2 Z+ x; N8 B  q7 Z5 U, j

    $ S$ }1 h( }6 A+ t7 Q4 p# U显示链表
    ! m( _6 A: _: j$ a; J
    ! r) Z' E: u8 w/ B4 evoid LinearNode::ShowLNode(){+ {8 p/ X/ E( e( b$ p& p
        if(NULL==(HeadList->next)){! f1 W3 `/ N: j
            cout<< "无节点"<<endl;
    2 B9 W, S5 ^5 m$ \5 J        return;
    - K& [/ _! h- T$ n& L    }
    2 _4 g9 P$ D9 w( Z    Node_cur = HeadList->next; 4 x4 J6 z! \0 Z$ }  P. k
        while(NULL!=(Node_cur->next)){- r3 D% b' L, C" B. d$ K
            cout<< Node_cur->data << "   ";
    ( J1 V" {! `; Y; {        Node_cur = Node_cur->next;
    & z* K1 Z: Z: e& |! R    }% g4 |1 l  V# K- P# z
        cout<< Node_cur->data << "   ";6 d/ `% }* j* r% N5 x- ^3 U. r6 F
        cout<<"链表中的数据已显示!!"<<endl;
    " [+ I* C; t0 R% K+ x. r}
    0 h$ @: j# a2 C$ |: N2 @; d) `2 O* @' I) a& a* p
    销毁链表/ T0 Y  S( k* \* J$ W$ H% {
    0 L% C" r' K! s. k) P4 g* [
    void LinearNode:estoryLNode(){
    , N! m/ x8 I; ~- h0 E  _  ^    Node_cur = HeadList->next;
    / A. E! x. h8 ]    while(NULL!=(Node_cur->next)){1 \4 p# Y4 u  h1 A3 o# Y1 C
            Node_temp = Node_cur->next;$ j. H0 S& c! S0 J1 h" q
            free(Node_cur);/ [; u! x4 E  J
            Node_cur = Node_temp;, W8 @3 @. w% L2 s  p0 x. J. m8 U
        }
    1 d7 t  n+ ^! C( i6 h    free(Node_temp);& k/ W% o8 v" U
        cout << "数据节点已完全释放!"<<endl; - D0 E* q4 A4 ^( {+ _
        free(HeadList);    // 释放头节点 / Y9 M) l$ f  L, b: K
        cout << "头节点已释放!"<<endl; ; X. o1 h, T1 B6 ^9 R/ k
    ————————————————4 a! S, l/ C( S0 C" |' e- \
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ' b; s/ M) F0 g0 z: G原文链接:https://blog.csdn.net/Baimax1/article/details/1060362866 Q2 r1 p. k( P8 I0 z

    6 {& d* T$ n; Z7 o2 e" L6 V5 D5 p" w! D/ l+ U# m$ n# o" R# j
    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 10:43 , Processed in 0.347291 second(s), 50 queries .

    回顶部