QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1414|回复: 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
    * U# d9 V7 A& l/ f
    线性表顺序表示、链式表示实现方法及其异同点
    ( m" ^; h# i$ _+ w$ p线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。% g$ D3 z* F4 }* m; W$ @
    # A+ E2 B! [5 x9 G
    本文采用C++实现两种表示方法。
    ; I4 P& P, I* z& j/ P8 [: h2 z4 C  D6 |! x
    目录
    - k) u" k+ y6 G- F+ k9 D7 D, g) J4 ^. m. T" |
    顺序表示和链式表示的区别:# d1 B5 `1 l2 e& l( d0 `0 d; f

    1 L; ], }# \5 _  p" l创建方式:+ k" M2 z, m$ h5 U3 a( `

    : Y& k, O. Z& X7 P8 o+ w% H时间复杂度:6 u$ _8 d) R' \/ M) d4 ~1 x4 ?
    + z1 }% s3 O& Z
    顺序表示和链式表示的相同点:* q1 [: v8 ?6 D
    $ H% i) _2 N6 }  W& h! k9 |3 r
    删除内存空间:, t) F2 g& |" e
    $ A# }8 g- G5 w. \, V
    代码实现:( T( G: y" }" a! \

    ; |& ]0 r. \  P2 @7 v顺序表示方法:: s+ X" A* T8 N/ Z$ V, Z8 v0 i
    ! D5 ^8 c6 W. {( x' k" e: t  j
    结构体定义
    9 _6 b# A1 o1 B/ Q% Q/ Q: U; H$ t# U, f- e3 }5 {
    初始化
    0 L& r- g6 T6 V! k' E- s- n2 y* H  Q8 ?* o/ T
    增加元素
    2 }5 s2 Y4 L7 H
    . S  R; c. t  R* U5 m删除元素
    # y& X) u8 s' j- ~# T# E' r1 F) e3 g( D) n6 X. {; F
    销毁列表
    4 V& X; s2 Z3 K* B5 y+ b, U" B" C  o; {" K
    链式表示方法
    # N  z$ X* u8 D$ x; a5 {5 R: p5 o/ [1 k
    结构体定义2 t/ c* l) I; W) l" g) Y

    * M- p7 V1 r% x初始化
    # S+ Z3 r) H/ s
    ( y* ~# c( I2 C% D" g增加节点
    & ]4 N) i- J, o- l
    ) x+ }! R% A) A* `删除节点
    . K, p, W2 R; ?, \" N, N8 T- n5 O
    显示链表* s$ _+ b( K" b/ T1 D0 g$ k/ `5 q
    5 X5 Z5 I) f9 G. K1 P* o! @1 n
    销毁链表) p) p# ?/ }1 b8 m

    6 e8 }  p1 g7 y顺序表示和链式表示的区别:
    $ |* a  _# I- ]6 r" [/ S" L2 N" B  l! ]
    ( @  I" X0 _9 `  h: k创建方式:
    + Z$ E6 ?4 L4 h# ?0 t: I6 D; H" S3 W3 n6 j' b; U; N
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。" G. Q6 a  t. x/ d; }& H& {- F

    9 m! e3 V  }0 r' k(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)( ^- I" r7 u9 h4 Z; m, ]/ ~
    8 Y& E. q& J  b2 o" @
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。/ ~3 n1 J; A7 f# o/ y$ U

    % M- R0 s/ e1 O+ ~0 X9 ~0 R时间复杂度:( I! {6 U6 Z' G# ?* t
    9 q: j/ X( ?9 @0 \2 X
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    ! t% `3 ~9 D5 ~+ w+ b; u) j& }6 j5 K1 v! u! ^, ]" V# y
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    7 f. E, N. O; v. v/ }5 G0 J  a3 M: Z9 w
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。5 p; l1 [9 C1 ]. j+ b; L& t2 V
    . v/ b6 o. C6 j/ `! s/ {& g  M
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    5 r4 o; N/ X$ e( Z
    " B, H  c( f1 q! D5 y0 C% s查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    % W$ |0 a, L9 H1 c# f- Z( h! i' t. F6 J- W8 ]' Y/ b
    顺序表示和链式表示的相同点:) X1 h: e' N% n5 Y$ H5 m# K
    2 K# f" m; m7 v* T9 v
    删除内存空间:" t! c; _  b; L
    & [1 d7 P2 d" u( y1 s7 K+ Y+ F
    内存空间的删除都需要对每一个存储单元单独释放空间。
    % e: h% I- [# f& J3 N7 u
    - x9 R( z( I1 {  a代码实现:) v* t& M6 [: J* o& s7 s

    * o3 s. G: `; Z. s顺序表示方法:
    + c+ h; ]" q/ z! ]5 L6 T; @! t. u$ r% i6 q+ f  O9 N& j! g
    结构体定义
    ; P  H* i0 P  q, [# f1 P
    * n0 ]' X% J0 gtypedef struct {5 \5 a3 [/ S% M4 E2 K! B  y
        ElemType * elem;# e$ v4 O  Z' c8 Y- M! a. r: U7 `, O
        int     length;        // 线性表的现有长度 % a# Q6 w' }9 o3 z8 V- y+ R1 h
        int        listSize;    // 线性表的最大长度
    $ A3 [0 T3 v% }  }$ M}SqList;" ]) m& H5 D: C) z7 K# a% d  V1 W5 ~

    ' @% i( v" j* R. M, }初始化$ M2 @" @* ?, M% T) ^
    # V# l$ N% L1 y  w) M) _8 @
    void InitList(SqList *L){
    8 _, N/ h# P/ A( Q6 t2 z    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;. p9 Y/ x# ]) |4 E9 y% ?
        if(!L->elem) {
    3 T! M0 `$ A/ N. e# l& R. \        cout<<"申请空间失败!\n";( G( ~; i( J( `: R
            DestoryList(L);& A# X+ n  f: F- O$ M, i
        }2 @) f7 ~& t& Y3 w, t
        L->length = 0;
    7 S7 g/ L6 G3 p    L->listSize = LIST_INIT_SIZE;
    , Z  Q: z: T! B9 I" I    cout<<"线性表初始化完成!\n";+ b3 h$ {  @* e; U& f$ Y6 R
    }
    ' o2 m% a% a4 w, ~$ ~/ U* m# f; o$ Z2 }, b
    增加元素
    . c+ R+ w. t0 R* |: o3 m6 k
    ( n9 O3 c( f( N: uvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    , H3 ^- R8 P3 ^4 b, I" V    if(L->length>=L->listSize){
    0 A) N& J$ l1 l' q9 c; j7 }        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));% {3 ^8 V6 M  e* I0 P3 }
            if(!L->elem){
    8 _# ]) g! P; Q2 b6 L            cout<<"增加空间失败!"<<endl;- E0 P& q+ z7 B/ k4 j- C
                DestoryList(L);
    - I( X4 z5 x& o# d8 [0 C* w        }1 f% A5 S5 ?% Z# J5 s
        }$ v) w0 V- `. f0 X( S( R( N
        * (L->elem+L->length) = e;, x+ @6 e. q; H; H, Z2 ]- I% S: C
        L->length ++;   
    ) D- r5 i& R! a, D8 U6 [+ q! p}
    1 R# x: Y, U5 k1 y0 V( Q, Y$ e# |" l
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素8 _/ D! j6 i, {3 o0 z
        int i;8 F+ \: @/ W1 e7 a1 t7 ]
        L->length++;
    . {$ z0 s0 R7 Y8 O( b7 I    for(i=L->length;i>=e_where;i--){8 _3 \" ?! T  E! I
            if(L->length>L->listSize){
      ~' G; _' i% X# S7 B/ L9 ], m( \            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));$ Q2 S- C  S  `
                if(!L->elem){
    " Y3 V) i! H2 W, v- R$ G4 \                cout<<"增加空间失败!"<<endl;
    0 {, r* s2 M( r                DestoryList(L);
    7 D: i  m: h+ q- U9 H0 X            }
    , t# g6 R4 _2 O2 n) s) B        }& H: W% s" z" K' X1 Q! |! e
            *(L->elem+i+1) = *(L->elem+i);        & h* y7 W$ `& N2 e5 \1 o
        }" P+ t; J0 ]1 e, n; y
        *(L->elem+e_where)=e;- h$ R: U- G  t9 f( C
        cout<<"增加后的线性表如下:"<<endl;
    ! ?& e$ @% Y6 t5 S( g+ _4 t- ?# U    ListShow(L);% ~( z% |9 C3 G  N" a( |
    } $ m$ t# N, E2 \4 e& }' z' o
      T+ g0 P! x- O9 D# b6 l
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素3 `8 o7 N! ?1 X) b
        int i;3 a! @, D1 r, h3 A2 `% f. w
        L->length++;# J. b- d) }7 |  y6 J/ o
        for(i=L->length;i>e_where;i--){. z9 Y) T0 x" e0 j8 M6 e
            if(L->length>L->listSize){
    + K" N% {; Z/ B5 \2 Z6 |            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    * E& q3 R# W! k            if(!L->elem){
    % u0 D6 X% Z$ J& t8 m0 N  T                cout<<"增加空间失败!"<<endl;
    1 y% K5 ^$ t9 y! z                DestoryList(L); 5 }+ v/ v$ Q4 T+ o/ F
                }
    2 }6 f3 R* v8 u1 C7 g1 v9 u        }6 d" @5 T! y; k
            *(L->elem+i+1) = *(L->elem+i);        
      l5 r4 @( u  z& a    }* [! `4 L- }9 b2 v2 o$ D
        *(L->elem+e_where+1)=e;
    $ p4 ^5 W$ h3 A  ^0 z, x, ~    cout<<"增加后的线性表如下:"<<endl;
    ; ^/ t, P# ~  h9 ]    ListShow(L);
    2 }9 _, ~5 v3 }9 Q6 U}. D" u7 a/ s2 t7 y3 u! M
    # m! @- |. S, k3 O, v
    删除元素
    ; s" x( W9 m* W* M; A
      t3 Y0 o+ x: p: w7 A! nvoid ListDelete(SqList *L, int e_where){    //删除某位置元素 2 x6 }7 b+ h! |4 e+ ~4 m
        L->length--;# l1 {% o8 r2 p6 Z2 B8 p
        for(int i=e_where;i<=L->length;i++){+ z5 ^8 N% S& L6 m6 H" _! B
            *(L->elem+i-1)=*(L->elem+i);0 x( @# A, g* r1 v5 }0 L2 X4 T+ ~
        }/ c) }5 I  B6 S) r
        cout<<"删除后的线性表如下:"<<endl; 4 i% w3 P) j% y1 R. D! z- G
        ListShow(L);
    , ?/ i2 V" U2 h4 w7 R2 a6 X}# w9 l9 b3 I1 C8 b% S0 o
    , X# N& G. _1 R3 _
    销毁列表
    - K* \9 x1 i# \, d' [/ ^: x% v/ o! F
    2 P. n% M9 s8 v2 i) fvoid DestoryList(SqList *L){$ Y& D4 }4 B& P8 X+ j9 H
        int i=0;+ a% z% _2 u- ~. B. Z& \
        for(i=0;i<L->listSize;i++){
    9 e8 Z3 ~: q( ]        free(L->elem);
    - Q1 |5 K$ b  o9 q3 E& p        L->elem++;
    4 l6 U" w; x& h& l/ @; P    }3 f4 X1 {9 L( g1 t' I
        exit(0);        
    7 W/ c% K% w3 ~- v- q1 g+ c; Q: M9 h}6 ^+ u5 U4 _8 B+ O- c, i- `  @7 k8 i, j
    3 y9 _4 b  j- O( r- Z9 e
    链式表示方法
    . c3 D$ m+ ?1 U( [7 Q+ A" o, n( m( S9 [: r; d# E: d% v2 d- H: n
    结构体定义$ E* k/ H7 ^, N. E

    + O( U* a" E0 n( J* e* ctypedef struct L_Node{
    % ?' O% `; u, V7 B0 l/ c; H8 s  a    ElemType data;
    ' ~% E  u  ~) ~. |' m5 a8 D$ X* }$ q    struct L_Node *next;" G$ }$ S& s/ S% K  ~
        //struct L_Node *last;    //增加可变成双向节点 ; n7 w8 j$ o! _1 T
    }LNode;/ o' h2 G* V* d# i1 A
    . y7 l5 _. p! L9 O
    初始化
    7 P2 c: H& L) E$ v- n$ f8 K  ]
    void LinearNode::InitLNode(){
    / d% ]4 n) b+ s, r3 h+ Y; V    HeadList = (LNode *)malloc(sizeof(LNode));
    # c* T& q4 ^/ [1 s3 E( W* }    if(!HeadList){8 }8 G0 }$ @: t: n. E1 A6 A
            cout << "初始化链表失败!" << endl;
    4 [2 a7 d, T9 _        exit(0); ( J6 q! l/ Z; g
        } / I& S' w5 F! k- K
        EndList=HeadList;
    # b9 R3 ]2 C4 K0 n5 l! }1 {, ~    HeadList->next = NULL;2 x0 Q; n$ n5 H# w3 T
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;- u$ ]# n- A0 r9 Z
        Length = 0;
    & V  V# M/ ]) J+ \. C8 d    e_where= 0;( Y; I7 Q, T  w
    }  n$ c% o0 U6 O8 i( \; V' N% u8 Y/ }, ]

    " R2 S0 `; y5 |! f* r6 L0 ?增加节点
    9 w( P6 T) q. |( E$ {8 W6 W" h, ]: t' \
    void LinearNode::AddNodeHead(ElemType num){    //头插法 ' @& x8 f, c: m. ~3 X8 ]! n
        node = (LNode *)malloc(sizeof(LNode));( j6 s5 M& Z' n4 b  B
        if(!node){; o. b, i% b9 m$ T' e" N- |2 Q
            cout << "新建节点失败!" << endl; & ]9 l5 F$ `' _2 H- m
            return;
    * Y; ^4 L% R+ h, ?$ m9 E$ ?    }
    # x& a% S0 L, c5 e+ H    node->data = num;
    + n0 c6 m  u1 g+ `- l; g    cout << node->data <<"   ";
    8 i% d0 w! x1 {; I- r    if(NULL==HeadList->next){& h2 l( O& L. S0 G2 d0 A" V. T% _
            node->next = NULL;4 F, \  F3 G; ]6 M8 `
            HeadList->next = node;. m7 _6 K, O) Q
            EndList=node;
      J1 D5 Z) B% y: ~    }- O1 T  e( _, U# u6 C9 t
        else{5 k% _) d7 X- c* Q+ y* h, z) C
            node->next = HeadList->next;
    5 c  u0 Y3 A8 |; _' H! O  V        HeadList->next=node;0 g  ]/ J+ w0 |- P% H* Z; ^
        }4 i: S0 }# O* U3 q
        Length++;
    4 W4 P6 T) d0 W# m9 Y! ^}& \9 g0 e  T% A
    4 ^5 g& H  B- L/ |
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    7 z# y( C0 k8 `    node = (LNode *)malloc(sizeof(LNode));" t5 |) {# a8 E+ y  L
        if(!node){0 c: j& Z2 _' N! t* g# o; k
            cout << "新建节点失败!" << endl; & m) _# g( n8 ^! k
            return; % H  z6 r, g) S8 [$ g: `) w- w
        } 6 z& s: C* D8 R" G4 W* g
        node->data = num;) T8 w" H) a( l) Q
        cout << node->data <<"   ";% ]  B, \! c6 [! K3 E+ t# [) Q$ V
        node->next = NULL;
    7 B, d8 k& K7 u% B. v' s* p+ _  e    EndList->next = node;4 ?8 ?0 }9 K& _9 J% q
        EndList = node;7 w* b2 M- X, ?) Z
        Length++;
    ' U2 C3 k& r) P6 K4 v' {, g}
    2 g# `6 i' I) p. E8 q
    1 {: H3 ]" k- A. g+ A# m删除节点( w/ t; x" L5 l4 ]
    + @1 |0 J7 A2 j5 a9 J) I
    void LinearNode:eleteNode(ElemType elem){" v8 S# I' E  E" }- ]& P
        if(NULL==(HeadList->next)){! w0 u8 E  `* m- C& l; g; D! J
            cout<< "无节点"<<endl;
    ! H# T* t: G7 @' T        return;
    ! m# O2 F6 l* D' `- f: t+ M    }: Z$ x' l. N7 F
        Node_cur = HeadList;
    & R- r  L4 G1 G! X+ `; l    while(NULL!=Node_cur->next){8 }8 e  R0 g) \5 I$ \
            Node_temp = Node_cur->next;
    - R* _& m) s* Y. Y        if(elem == Node_temp->data){
    " `. e7 f1 Y1 [1 K  b            Node_cur->next=Node_temp->next;# s* L5 [, U& Z' N( D/ s) e9 A& S
                free(Node_temp);
    / J0 m+ t" Y# p6 r# i& `! p+ ~) T) Q        }
    , _; g+ Y7 i1 b        if(NULL!=Node_cur->next)
    . r7 o0 R3 g8 P; c* E        Node_cur=Node_cur->next;$ \2 x; i" ]( e) ~
        }, Q/ C' i5 U# b" Y3 u4 A
        cout<< elem <<" 元素已删除!"<<endl; 2 s, I* N. d6 X  ]! N" U. C
    }
    ' m% s8 I' x7 d: r
    ( O5 y! f" n; b7 e* E. b显示链表
    + g9 e9 o, i# c0 @8 J" ?& a
    2 X% M9 n% n& z- Ivoid LinearNode::ShowLNode(){
    / d7 Q; o4 P& @' w8 U    if(NULL==(HeadList->next)){
    * c% I. P7 e$ }+ w        cout<< "无节点"<<endl;
    2 }( b0 w2 q: S. i$ @        return; * P- {5 Z! ^9 ^! S
        }4 q0 \& y  }3 u) G5 N
        Node_cur = HeadList->next; ' v: O. g( w7 t! _  I- o
        while(NULL!=(Node_cur->next)){5 s9 t: A/ u8 A' L/ ^8 \6 z
            cout<< Node_cur->data << "   ";
    ) x+ Y- j+ x7 Q4 W! }        Node_cur = Node_cur->next;6 {  f& T5 B" }+ a
        }' n* O, h  l5 c8 f* [  A8 `
        cout<< Node_cur->data << "   ";5 t! Q- b5 K/ r  y
        cout<<"链表中的数据已显示!!"<<endl;
    ; m" b" d3 u7 {+ m$ V8 Z) Y; E}
    ; ~3 s+ m% g7 Q: _" ~' m- w$ N! y, h9 O6 d# \' x& N
    销毁链表
    - M8 V# U1 s8 r* q" T* |) p
    / i* Z" _6 ^1 H/ C5 ]" |& ]void LinearNode:estoryLNode(){
    + F( P2 F! _! ]: V! p' F5 j+ I    Node_cur = HeadList->next; ; P6 B6 j, ]& a+ }
        while(NULL!=(Node_cur->next)){+ X/ J  Z8 P$ w
            Node_temp = Node_cur->next;8 [6 P; T3 a: g6 c2 u
            free(Node_cur);" t9 F9 S: p7 z) c1 L% ]
            Node_cur = Node_temp;3 L; I. G2 V& `+ C
        }" K* z9 @7 i' `" N
        free(Node_temp);
    6 n7 u. u# l" w, B9 H    cout << "数据节点已完全释放!"<<endl; / ^. A$ r# z( H( U; P
        free(HeadList);    // 释放头节点
    & p3 D& [. p+ V3 o; S    cout << "头节点已释放!"<<endl; 6 p% D, r" |: m
    ————————————————
    7 O! x& S6 _8 B2 e* D版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- e0 b9 s' l" ]$ C, ]; S6 V0 ]( ]
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286. W' Z2 D  {% P7 a2 C

    9 s" P; w! d+ V0 h6 L9 g8 C# _0 x" Y% b& _% W: h
    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, 2025-8-19 21:54 , Processed in 0.509922 second(s), 50 queries .

    回顶部