QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1560|回复: 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 w& m0 Z9 M; p5 a# x; h9 y4 c
    线性表顺序表示、链式表示实现方法及其异同点; l# ~2 f1 r' r$ j, I$ u* P. ^
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    . J/ e( G# o2 ^
      i+ k7 \4 _# c2 O5 E本文采用C++实现两种表示方法。
    . E4 B" z9 @2 f) k. ?2 U
    # [0 f4 X5 C6 S! x  i2 m" w目录% P3 s# {# O- b( ^  {& Z5 A

    , X0 X8 n% f8 H顺序表示和链式表示的区别:
    6 _2 D$ [' E. [
    3 w$ u* K8 ^0 ], w. c+ x创建方式:4 ?8 P5 X8 J% D% E# K, S) o

    ( ]# m$ e) a9 q/ i, {8 H; Y3 ]时间复杂度:- E) ~1 `7 ~4 J& {: F$ X/ R

    7 U$ v' f# O3 z$ I" [顺序表示和链式表示的相同点:* M$ a" @* R5 w, o- t& ]) i( z. M5 h! S

    * r! w+ P. X# b8 J8 V6 H删除内存空间:
    , y$ n( z8 W3 }
    ; q" J5 Y5 J: p' t: x9 N代码实现:
    & u) \) W0 s3 m% f' ], I6 N
    & X# `( O  B; w# Q, X- ^顺序表示方法:3 m" x; F7 L" N+ o- B; T

    ) N6 N4 S) Y4 b" v结构体定义; j; z  C1 |4 g' u/ d! }
      X& o4 _' p8 C4 |
    初始化8 N1 h; R% M; b) [* K

    9 j2 h5 ?1 a. ]增加元素
    0 E/ O7 D: D4 a- F% X' W! y" h4 B/ [0 W
    删除元素
    4 i& q  u) T8 ^0 q5 E* I: z0 Y& N+ f, t
    销毁列表6 [8 B* [; I: N1 k: [- ]( m. a

    ; h( ^! x( M$ @; q/ ?链式表示方法
    1 i/ ?7 d# k, h. l  ]9 J! a  Q6 d- [# f. a* `
    结构体定义8 z8 j9 N( U$ h0 F& m% x; X

    * M8 w! f7 W' L! R) j  k初始化
    6 a# ~( E. _/ Z. x4 ]$ E7 {9 c7 _, m+ n1 c
    增加节点
    " ]8 z0 `9 \, x! W- f6 }5 v. v: T. R. Q$ s& M
    删除节点6 M; f" K. C/ H' f; x# A" V
    + {, c: g: o- O6 i3 H1 ~
    显示链表
    . ?: J( v% ?1 H8 T3 a$ B( |
    * Y4 \1 f* E- F. o% [6 `销毁链表- w% P3 T7 j+ ^& l
    9 x7 O- y8 g, {
    顺序表示和链式表示的区别:
    3 S: p1 q, }+ T1 f
    2 h7 t5 i3 n% L( z8 K' ?创建方式:
    % [/ |0 W) e" N$ h) r0 t" l/ |; |, R! U7 g5 e4 o0 U3 ?
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。8 |) Z2 C5 v5 D
      C$ k* Y8 d% o4 _5 h' _1 i9 E/ i
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)" a3 w: E, U# I7 q  q  p8 _
    ' @0 ]' e0 P/ b- }1 E  y, r
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。: q% A& I+ w( M0 f. o& r0 x! B4 R8 d

    - C; N7 T0 U  M) C时间复杂度:
    3 H( q, i  M" m' c
    ' |8 h$ K2 w. z# [, a: @' ?( z( h增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)/ l3 z; L$ Z" ~( q. F. x( I

    ; d6 F  R3 N" K0 r增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)$ a% t) q0 p5 O" z: p6 U

    . Q+ ^; Q# i9 L+ u& U- YPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    6 k) T" ~+ Z1 Q! l. J/ F' A/ F9 O1 ^# ?) ?* r8 |1 B% U1 O. x
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);0 x8 N2 |2 @# h/ F' e
    - p$ Y' w( ^& E: \$ O0 I
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    ) u) b" J( [6 N! r; u3 T& K7 B- y
    ' y& i+ @! F% w3 M顺序表示和链式表示的相同点:
    # Q3 M7 ~; M% f4 h9 {. L
    - e1 i! A* c: r9 H3 I) k9 O+ L( ~# |删除内存空间:
    / m& V' v; ^7 E3 z5 H. q  Z2 ]
    3 `; D: S1 f4 v. U内存空间的删除都需要对每一个存储单元单独释放空间。0 |* O5 @7 ?7 h

    ; w2 d7 r! I  s4 G代码实现:
    + X, ^. S4 n1 d2 y# d
    : k  h# X% d. j) E6 y+ o顺序表示方法:
    7 |3 l9 O7 y7 O6 Q( B. E8 R) z6 D- r1 b; \- }% @! n
    结构体定义
    * X0 ~+ \: A, v* |8 a( G; I) W
    ' D  R, w/ a5 }5 X3 ntypedef struct {
    8 a9 p+ |: Z" \" u    ElemType * elem;; M' i. K8 I2 D: T1 K
        int     length;        // 线性表的现有长度 9 I) c1 x, W6 F4 D
        int        listSize;    // 线性表的最大长度% C! E& D& G/ ^3 z; M  I  W+ U% W9 [. V
    }SqList;
    0 s- y7 F$ N/ m6 @, i' {/ \$ a" ]
    ( L$ w( }3 y4 [  g初始化5 d/ F/ Q6 M; C( {

    . f) ~/ e9 L0 v# yvoid InitList(SqList *L){
    3 j( _, L5 u: S: k1 y; w    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;$ B/ j3 v! F9 u
        if(!L->elem) {
    5 z3 \- K6 I! P* [4 _% C        cout<<"申请空间失败!\n";/ n( v4 W& P' {+ i- A/ |( d
            DestoryList(L);
    " t* A7 x$ f' k    }
    0 w# \: n; a/ a8 w+ a& I' B    L->length = 0;
    0 L# O7 O4 Q7 D- X9 _2 B    L->listSize = LIST_INIT_SIZE;
    % I* L, r; E; L, t    cout<<"线性表初始化完成!\n";  N2 e4 D: t- {
    }. M0 S, F. l- e, M6 ~& E! u/ e

    6 i3 _3 `! \9 g; D) O: E- S7 }" K$ E增加元素& L6 G; Q- y8 N

    ( _% z1 n- q7 Q& }( {$ V; |" Ivoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    " j4 F  p8 z$ P0 S, i3 c, L  D0 j    if(L->length>=L->listSize){" M( Y/ R/ i& k: ]7 y
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    ! H+ m! d- N6 F% Y/ T1 \% P* x        if(!L->elem){
    ) b/ Y6 F! d: b( k- U/ a            cout<<"增加空间失败!"<<endl;. T6 J, A; w2 b2 [
                DestoryList(L);5 V( A; o& j/ _
            }
    ; j4 [- Z! `2 l4 o    }
    - ~$ p6 r1 Q! P    * (L->elem+L->length) = e;
    6 d. ]! _% r! ~0 l; w; n6 v    L->length ++;    9 q0 N8 \- W4 R* G& d% P
    }
    6 f) \- D+ e$ j8 O8 e2 [" P5 w3 D/ y+ D
    0 n1 _+ m, J" Uvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素5 h; D/ S$ L' S+ _& A7 m0 G; N" Y9 ]+ ?
        int i;; X, O) M8 m3 C
        L->length++;" k3 C. a$ L* j
        for(i=L->length;i>=e_where;i--){
    0 W1 n+ W9 [- d2 x# m        if(L->length>L->listSize){
    % {. R7 u- F& J2 e  {$ X$ u1 }            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    " ]  W# t: Z- h5 j/ F            if(!L->elem){
    & B7 b" g( h7 v! U                cout<<"增加空间失败!"<<endl;
    3 H. M4 k: _0 l: Y                DestoryList(L); 0 [3 e6 h- ^& n
                }! A" g$ H8 {3 ^: `
            }, r1 s7 T' L0 Q& r8 R1 P1 a, `
            *(L->elem+i+1) = *(L->elem+i);        
    ( w0 K- x7 q7 H& N    }9 P! \9 ~4 S5 F5 N6 U2 U
        *(L->elem+e_where)=e;% \5 Z3 x: i# S% m( _* B  p3 T
        cout<<"增加后的线性表如下:"<<endl; ! \0 I( I; B. C
        ListShow(L);
    9 k0 O  V) ]* m: j; `8 j# c1 H}
    ) V$ [/ a. Z2 j
    & Z8 V. [5 R+ ^6 {void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    4 O5 q' ?' w& m5 q( f! e+ u8 o2 B0 b    int i;
    7 g0 z3 r% C8 \/ q* D/ ]  J: a    L->length++;+ [5 F5 I3 h- A3 d1 O0 e
        for(i=L->length;i>e_where;i--){
    0 L* q) i1 G. m* D        if(L->length>L->listSize){) L% L0 z$ e3 r7 A
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    7 X+ I1 T- }5 l            if(!L->elem){0 E+ U" u3 Q) \) e: x4 A& S
                    cout<<"增加空间失败!"<<endl;
    2 Q+ ~1 w, f& B! D7 a3 p& e. O                DestoryList(L);
    ; t% S& d2 G: q3 F# m            }1 p. F3 [8 q, Y' E
            }
    3 h- u! p4 s3 j0 G        *(L->elem+i+1) = *(L->elem+i);        8 d$ h. S* y  n: n
        }
    * x7 h# M4 _- C% ~: G% y+ J    *(L->elem+e_where+1)=e;9 C" c/ |# R4 K3 [7 B
        cout<<"增加后的线性表如下:"<<endl; 1 F$ R, ]- `% F0 G1 Y, j3 Y8 N9 N
        ListShow(L);- P8 ^4 |' Q. l" u
    }
    . o8 V2 N& E2 a2 x/ s& x5 W+ H& k' y4 ~' C, ]3 m/ g. a0 o
    删除元素
    & B, U$ |/ U0 U6 y. n
    % x& y: K: D- B- D- ]6 qvoid ListDelete(SqList *L, int e_where){    //删除某位置元素
    ( f/ m, Q9 B  S/ Q! S, y    L->length--;% d8 M1 c1 l0 V1 R
        for(int i=e_where;i<=L->length;i++){7 k8 `( V4 ^: N8 A: i
            *(L->elem+i-1)=*(L->elem+i);: N0 I# x  F; j
        }
    ' }' x2 ]: ^9 Q: H6 Y# {    cout<<"删除后的线性表如下:"<<endl; ' X6 b( j9 i$ G7 s; w
        ListShow(L);- z. B' @0 O3 c* [7 O* E
    }6 R$ T7 y$ L- z& Z& r& e; F
    + c* R. V) i8 f
    销毁列表
    9 i$ ^2 p9 F5 }4 ], l1 D' E% e4 W8 N& W- I$ P
    void DestoryList(SqList *L){. ~7 x# X1 `- q6 U$ d7 U
        int i=0;8 a. q' d0 a9 `3 N5 B* A& O
        for(i=0;i<L->listSize;i++){( O/ A1 i: J$ r
            free(L->elem);
    ! J1 a) r6 d: }9 U0 y1 @        L->elem++;, v, f7 @8 j' y$ i' z/ r2 w& M
        }- l% s$ G. e9 y# Z9 u
        exit(0);        
    - y) D' x9 M& Q( I( f& Z$ P* ]6 r+ y}
    % V& ?8 K0 P' ~9 Y* z/ S% z9 S1 ^. d( F9 N; J, ]6 Z. F
    链式表示方法
    % \8 F! s0 G) u( O, o
    9 g/ p+ T( Y) J& W2 L: v  N( B  K7 @1 j结构体定义
    0 _5 P+ y7 |, x8 l1 q- @! \% @- j# [% R2 l( c
    typedef struct L_Node{
    8 d8 P; c' ]9 a; }$ z; E2 k    ElemType data;
    " F- @; k% r1 C* j4 S" B4 s    struct L_Node *next;
    1 b5 N, {$ ^5 d9 ]    //struct L_Node *last;    //增加可变成双向节点 ' P% C$ r' c; J& E2 M$ U3 A: |+ l
    }LNode;
    5 _8 W9 m$ Q7 n6 s( q6 o+ n2 ?3 x3 Y( k+ _5 V# }* B; x
    初始化
    8 ~2 h" N- g. M, h" i0 e. m, D
    . q& `* R, \& r4 G$ J  C8 b! `  u  _void LinearNode::InitLNode(){
    + a8 B% X) E2 w( y% D3 m    HeadList = (LNode *)malloc(sizeof(LNode));% U( h- E: |2 M0 {: `' l
        if(!HeadList){
    . O: \9 M* H! Q6 ?; j& i        cout << "初始化链表失败!" << endl; 8 b7 m. r( i8 K  x, l8 C, Z* I
            exit(0); * L1 l* K; K; K
        }
    & e: M7 E' L8 h    EndList=HeadList;
    # n$ o. O  k; f8 h8 y+ C4 y    HeadList->next = NULL;
    % F8 g/ j9 F) |2 C, o* K' Z+ t6 [    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    ) N& E' H- [$ O9 s    Length = 0;
    3 ~$ [( \( y6 D. n7 J    e_where= 0;  A9 k' G7 r" E9 [$ w. f1 y; d5 W+ N
    }
    4 N( O4 n/ v* i% k8 w; h% Z, r. R  V3 P+ g% U" B
    增加节点
    1 {: x& v0 @& J0 F" g1 q
    4 V' ]+ u& N6 l! n# |0 Bvoid LinearNode::AddNodeHead(ElemType num){    //头插法
    ! l3 F1 T& }' [# |    node = (LNode *)malloc(sizeof(LNode));2 S- F5 m( g: K1 D) T
        if(!node){
    % E" p* h2 J2 y7 q+ r$ [) j# y        cout << "新建节点失败!" << endl;
    - D; c% Y+ h# S, i        return;
    # G) Y7 x; k9 R5 P0 j0 v4 z9 V    } + _5 L: F+ i& J! Z+ C
        node->data = num;3 p! ?8 X2 x8 w& ~+ _, A0 g( G
        cout << node->data <<"   ";- L! f4 e  h! Z. i7 T# \8 T, q
        if(NULL==HeadList->next){6 T4 U) I  }5 X4 v% d6 u/ [, U
            node->next = NULL;2 T/ o/ G/ h* {0 Q/ L
            HeadList->next = node;
    . |/ X3 ~7 g6 ?        EndList=node;
    1 J/ }2 R% E; l    }+ P. \6 Z) y( j) [9 q
        else{$ ~8 l$ R. ?& [* _2 [
            node->next = HeadList->next;; D/ ~% V$ ~9 w' X
            HeadList->next=node;
    6 Y& b3 J7 n2 V- C8 D    }" M8 b6 c+ f; t) X, `3 A) q
        Length++; . K1 x3 A5 ?' N5 a* Q" ?
    }
    9 V& T! R/ [9 I0 X2 L$ q
    % M2 [6 i+ ~' I4 u5 p3 f8 yvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    5 ?  V' s# r- a+ U    node = (LNode *)malloc(sizeof(LNode));
    4 Q8 r; L" q/ F8 c1 ]    if(!node){! M3 ]# b, t" S  w$ S
            cout << "新建节点失败!" << endl;
    + ^6 S  p# u; Z! P        return; ! O6 L5 F0 m- ?# ~' x3 f) E% e5 E
        }
    0 k8 c, o. n; p. |& U! F7 o+ r    node->data = num;
    * J4 U+ X' g' G6 P8 p    cout << node->data <<"   ";. V" ^  r  _5 q6 l. l
        node->next = NULL;
    ! v4 Y5 U) G4 k" s3 M2 _    EndList->next = node;4 X+ F1 y- H$ I: I1 w( F
        EndList = node;
    . x$ K+ [, m5 Y: E: L* x    Length++; . l+ {7 u! w% U
    }
      k; F6 ?2 a: B, E# J& v# s3 N5 K2 u, R
    删除节点/ M- |) t3 ]1 S8 k* r" e) G' h4 @

    8 X# L# y% }' N; ]' x8 jvoid LinearNode:eleteNode(ElemType elem){( U# j: C; e. ?/ s
        if(NULL==(HeadList->next)){3 z2 ~! e+ y6 H. z6 I4 X
            cout<< "无节点"<<endl;
    " ~- ~: T7 u  l  f% ?        return; 7 g2 T: B9 G; l& N& s* T% ~
        }
    ! ^( n# C& u1 R    Node_cur = HeadList;
    6 C& u, J1 ]7 s* \9 _7 S/ f* |- \7 H    while(NULL!=Node_cur->next){
    * {! L7 Y) w* h( j2 Q9 D        Node_temp = Node_cur->next;
    ( h6 [/ i& w. r/ J6 J        if(elem == Node_temp->data){+ U. N0 K5 ~, B% A" N5 M
                Node_cur->next=Node_temp->next;
    ' x) O# {) ?4 B8 |" Y            free(Node_temp);
    . F3 Y: `, {+ S2 Y$ u) ]6 I! E2 a        }
    " p3 J( _: F* R, S' t8 V/ \        if(NULL!=Node_cur->next)
    * X; x! L2 n, k7 [: j8 i- N        Node_cur=Node_cur->next;
    . f. {3 l5 o& a$ d3 q/ t2 m: l4 C# p    }
    4 f3 v5 m- p$ c$ O' I    cout<< elem <<" 元素已删除!"<<endl;
    # B; p, s  H1 l8 ]! D9 T8 x}
    3 Y2 L* l) z; M9 W! N, J4 ^" Z) m8 p# ^' Q3 Q3 x- m0 i  E8 P, E
    显示链表
    3 j. r5 q  x5 t2 n8 C& f' N; i
    ! F1 I- p  D6 @" w* {6 c$ ^void LinearNode::ShowLNode(){
    7 l0 }4 L& U# J" _4 w    if(NULL==(HeadList->next)){) o; W- n3 o3 w1 I7 J
            cout<< "无节点"<<endl;* A3 s% _0 k; b2 d
            return; 3 N& ~( O  ~  D: Q  D) K- Y
        }: ]5 v' D3 T" f2 o: m! a4 Z7 S  b9 |
        Node_cur = HeadList->next; ) j% }" ?! D0 k2 y
        while(NULL!=(Node_cur->next)){) `) G! Y( g3 |# j1 _3 k7 o# ~( Q, Q
            cout<< Node_cur->data << "   ";$ N! r% M1 g: Q0 w
            Node_cur = Node_cur->next;  M3 ~! z3 \! ?0 W( D2 h& S
        }/ m" f6 W+ m7 W) V! o  t: c' e
        cout<< Node_cur->data << "   ";6 d" v1 _# `* H3 o! [& E
        cout<<"链表中的数据已显示!!"<<endl;+ a& l; w, r: S4 E" ^% Z3 Y5 e1 i9 V
    }/ L5 ~8 J* @( F2 C4 X5 o3 X( t
    & i! M( @6 b; C4 ~  Z
    销毁链表7 d- d/ t7 K8 `1 w! |
    9 |& @; [  X( E7 m: Z
    void LinearNode:estoryLNode(){5 t! s4 O- S" }2 _5 f1 \
        Node_cur = HeadList->next;
    ; P- y' c: m. _7 Z& t0 P* v    while(NULL!=(Node_cur->next)){
    " p+ h/ B4 Z$ L& ~9 f' C        Node_temp = Node_cur->next;
    6 }9 D5 m7 m/ R$ U( p) Q) h# ~1 y        free(Node_cur);
    8 Z/ j7 x+ t# |- F6 M" Q, D# s5 m& q        Node_cur = Node_temp;
    + e7 p6 x% g0 r: ^. H+ @2 E8 {    }
    ( J( p' r1 F* o9 @3 m, ~, o- Y    free(Node_temp);2 z7 e/ W5 _, l1 ]2 U& k% N) B8 g
        cout << "数据节点已完全释放!"<<endl;
    ; I" w. N8 A% q7 o    free(HeadList);    // 释放头节点   |4 d* ]$ I, s" X
        cout << "头节点已释放!"<<endl;
    ; @4 @7 |; p! ?+ P————————————————% R! k2 [6 n5 g" N: F2 t
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ) u( x1 g" S" [原文链接:https://blog.csdn.net/Baimax1/article/details/1060362869 Y- @7 O: K( V3 z8 o- y

    # M; C1 p0 t: S: i1 N$ s; l$ m# P: d1 A4 I: w( m* p
    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-6-14 01:19 , Processed in 0.451012 second(s), 51 queries .

    回顶部