QQ登录

只需要一步,快速开始

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

    3 T$ _, t5 x# X# q( a线性表顺序表示、链式表示实现方法及其异同点
    + {9 h" g% d6 D. W" D' p线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    + j4 ^5 F& [- {& V  g" d0 o
    2 i, ~! b7 A" V. h/ W本文采用C++实现两种表示方法。1 ^8 ?* R6 T( x5 I& O+ o3 M1 w* E" e8 j

    ) [+ x3 V) i  R- z目录) o3 Y$ `9 a) I& m
    " p" Q* }. |# c- Q6 t
    顺序表示和链式表示的区别:
    ) n9 X8 V3 m% |) V. A" g
    ! n, R+ W* Q* o+ ^8 D  b; a. T创建方式:
    , l' O& c9 o: d5 U) J2 @2 D  p! k% d6 L
    时间复杂度:
    . ?/ _4 Q8 W" z/ V
    " v( ]& M3 v& R  a) t) w* O顺序表示和链式表示的相同点:
    : B7 m. p" Y" A; |* T. x6 U- b3 K8 F0 {: g  w4 s# K4 O
    删除内存空间:
    3 C9 v% _0 B9 x( j! V, [4 v
    . j1 N' {) y; S4 P( P0 u代码实现:
    : [9 E( _* g6 H( D+ K$ r( |! ~$ Z6 _" M
    顺序表示方法:3 A% D% z8 M8 S+ p( m, @( a7 @

    " X9 Q! O: v6 O0 J8 K+ B结构体定义4 u; h! _0 ]- S
    ; Z9 i- I( m6 K' k; y# ?" V
    初始化
    2 M( c) ]" \8 o: @- a0 o: U  u3 R. a* h* g8 P$ u
    增加元素
    " c9 b  V& A  R; {4 H' l) W1 s. u  F' [1 l9 q5 t1 z
    删除元素+ L* s. a2 K. R; [: s2 p- A) K

    ! J0 B$ c  s: ?* e! a+ l销毁列表2 o- |0 M, t, {0 [+ A1 e& y5 A
      n5 [% Y8 U+ |5 B+ X3 b
    链式表示方法- f2 ~: }( T, P, Y6 o+ B

    1 B/ p& {7 r' Q, @: N结构体定义
    3 g: `( j* r- t9 {% k' ]! u5 |# }, \9 V/ e
    初始化& g* @# ^2 B, c! U3 ^3 a

    ' V  Y4 E8 K8 h( Z' g" |6 P增加节点" J. E! u. {5 z% ?* M9 j# R4 r
    5 C# w- V  e5 E) X" M5 {1 i" b
    删除节点# ]) P& V0 g. M
    / f! |4 s& F" b  K$ [
    显示链表4 z4 w) L  M3 z4 S8 x; l

    ' A1 T5 N8 w$ G销毁链表
    ! r; |0 Y% K7 S7 o  C! D' F
    ! {  |8 F* W. b1 W  r顺序表示和链式表示的区别:
    $ v7 O6 Q) ?' a
    ; v' n" r/ }7 C* k7 Y4 g  r创建方式:; M) @/ H: B$ [. V

    3 @6 H& J- X+ u) Y" r' \顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。0 o1 d' j1 Y, p% f

    $ Q. z% e0 D9 }+ w3 {(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)" D3 `# F4 O2 h( u# J8 Q
    1 ~/ w$ \; m) M' I1 x: R/ ?
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    ' K+ m/ L- s- _& _# Y8 f1 ?: V& _- y
    1 l( y; [: R% q2 t+ I时间复杂度:
    - r! {& L* e' z2 ?
    6 A1 a1 |2 x) J2 A2 r4 @4 |增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    1 D" G1 J, M/ H0 k! ~# G
    + @  I: k. _2 a8 ?, I2 b增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    ) y  z1 p+ v" q
    9 U; Z0 [9 ]2 f6 b' I3 o; s1 UPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    + Q; R% E- K3 s  x% C7 J  M  y1 N1 Z; x, u
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    " I" f! f/ z( F2 w7 |% v) [9 c9 U& q2 w+ y; a
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);5 o7 N% j* Y# C7 E; S

    3 K# V; d# A" D8 H% A顺序表示和链式表示的相同点:
    : O7 w2 i; \( [) N, L& f
    + a' I# i5 q9 f4 `删除内存空间:
    ; L9 b% ~0 S  H; q
    * ^  C. G) }2 }3 y' b3 ?/ Y内存空间的删除都需要对每一个存储单元单独释放空间。
    % x# V, F; ]% W) `, X
    - _& S. f; P- {' w: S8 d; C3 y代码实现:6 b3 a& |1 j' c. w. E

    ! S3 K6 z+ X  d; V5 m顺序表示方法:
    7 ^/ {1 V8 E9 }7 a& R
    ; Y, K1 C/ u# r2 O结构体定义
    2 H/ g4 f* u/ X8 i' q) {9 e, v* p% j7 H8 x1 O% F
    typedef struct {
    6 o- f2 D. }4 F9 U7 A/ c    ElemType * elem;
    3 h# k5 U+ U) p4 m1 y5 F- _. \5 l2 d    int     length;        // 线性表的现有长度 % O8 g" o; R# }) J( d) D* v4 C
        int        listSize;    // 线性表的最大长度- i; \6 _: K" H$ p" p7 n& L
    }SqList;+ A' |* Z9 Q, ^  l" i! f) a% \, m3 o
    / u$ I" d# a; u
    初始化
    ( v/ S; y3 r1 L' }1 |* V6 Q+ `) H3 O, s# M
    void InitList(SqList *L){9 v: H4 h# D( p" h* p9 D
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;; X: b$ R; j" |$ d- t( G' l$ a
        if(!L->elem) {
    7 }! V, z& o8 n* Z" ^0 e        cout<<"申请空间失败!\n";
    0 T/ Y( I. b; o        DestoryList(L);. l5 d& E; G/ {4 w6 X
        }1 b- J! R" m# ]2 w5 |+ |
        L->length = 0;3 y! H; a/ M* W* ^: ?/ e! _3 c
        L->listSize = LIST_INIT_SIZE;3 b. V( n/ H: C% z, H+ f
        cout<<"线性表初始化完成!\n";
    1 E1 @4 ?& ~# z}' B6 t. M+ a# [; z# x/ g) p( m
      i) A/ A8 S. [% `; B$ r
    增加元素" A9 X# k  j( i: W5 @

    1 x0 s+ j  K: A; h& r% w5 Lvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    * {$ ~; A% I0 k" M( n    if(L->length>=L->listSize){
    , J* R6 m) M( q0 M( w' G        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    1 R. Y+ M9 p2 q# `; O0 z        if(!L->elem){( R; l" R" w# t8 e3 K# u
                cout<<"增加空间失败!"<<endl;
    ( k3 k) V3 y4 ^" a5 J            DestoryList(L);
    4 k" h; O1 n+ h2 P* o; L, F' [( i1 W" r        }
    - F: o/ Q( v1 ~: L. h) R3 r    }
    ( D" v: y9 {- d* X( J  Y+ ^    * (L->elem+L->length) = e;
    ( _; w% e* j/ @7 W- `    L->length ++;   
    - Y9 t' B3 Y7 x3 X" r0 {}
    1 D8 M- N8 s5 c5 H5 \$ v  z* T8 J1 N7 u( C' r: U% D$ v
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    : P) e! Z7 b+ Z+ g1 b1 e% ~) m) N    int i;1 l' P& y# d: s% O- M$ B
        L->length++;
    % B+ {, M0 ]. E& q+ ~    for(i=L->length;i>=e_where;i--){
    - ^: s2 z6 W  S1 P, l* f        if(L->length>L->listSize){
    ) f3 c1 P$ j) H            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    # X3 o3 _. l1 X            if(!L->elem){
    9 I. p' _  z! ~* y9 w- M5 [                cout<<"增加空间失败!"<<endl;
    * u: h% k% i: X                DestoryList(L);
    4 g* e) c9 `6 n            }
      j+ m. B  c, D' H  i9 j& z        }
    2 o; N* f: l# }, h7 h0 j# ?7 o% Y        *(L->elem+i+1) = *(L->elem+i);        / |0 Z# v% y1 P+ L& V# K0 E( n
        }& E' E9 Y1 g- Q- E( ~5 i" x7 C
        *(L->elem+e_where)=e;
    ' D- N& s% z2 C6 |    cout<<"增加后的线性表如下:"<<endl; . W) \2 A5 J( t' L, ]2 S
        ListShow(L);/ x3 Q8 T3 D% H# @
    }
    3 C4 n+ [' U# {$ ^. D
    - ]- U( d! ]& [# K$ Uvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素  v1 K# [! w+ l6 V; n# S
        int i;
    8 M# m* V, r9 ^    L->length++;, t! s0 S# P! a' \+ _& E* N
        for(i=L->length;i>e_where;i--){. H* V9 B0 t2 i2 v& W
            if(L->length>L->listSize){
    ) d' \( A, B3 Z) I, Z7 {  A            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));; D$ R7 D  |3 _! ]1 c# L
                if(!L->elem){
    / |/ _; f, S& ^) Q0 j# O% m. ~                cout<<"增加空间失败!"<<endl;. s5 f; |; Q7 [' z
                    DestoryList(L); & v, m2 f9 A( h# Q
                }
    * N# S. u, H2 w        }# W2 |( z+ D' r1 h! a
            *(L->elem+i+1) = *(L->elem+i);        
    8 h" f" b/ g) {8 m# U$ h- g8 ?    }- v" t& E1 b  L3 Y
        *(L->elem+e_where+1)=e;% V& ~: @% n7 q+ s, R
        cout<<"增加后的线性表如下:"<<endl;
      [$ P7 c7 s) ?# N: O& `    ListShow(L);
    1 S2 A: K' Z$ J+ |. \( T& B. q}1 {# T$ k& p% {
    : P! h, w5 H& H7 V( o) s
    删除元素2 N( y9 a3 }0 z# Y7 T% U/ G
    $ z2 F% Y, ~* v
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    4 w9 _. E) i! F3 u8 b    L->length--;
    ( T/ D7 G) K, l7 n! X! R) C    for(int i=e_where;i<=L->length;i++){: G0 }- ?. D4 Z2 E3 p/ L, `6 ?2 c
            *(L->elem+i-1)=*(L->elem+i);6 S( ~7 O7 w/ e9 R
        }
    : x! m2 E( d$ b8 I    cout<<"删除后的线性表如下:"<<endl; % v$ R% H) \; ^0 K+ W% w8 I; F
        ListShow(L);7 E& U9 n% Q5 h$ x
    }
    6 ?5 A  S$ |; s- R5 X  \1 G; Y
    , n' k( F1 P0 j) B" s" `5 L销毁列表
    2 }7 \* ~3 p8 |7 Q9 v4 k1 ?5 x4 z1 E. w7 J% ~9 f0 Q  W/ F, f( @
    void DestoryList(SqList *L){; U' J: O" @# n
        int i=0;
    ' b! k3 t8 f- f1 L, f3 }. n* O    for(i=0;i<L->listSize;i++){
    : D& a& d+ J$ c        free(L->elem);
    9 K0 @6 y' h0 g7 z1 r- E* F" {        L->elem++;
    2 d9 F- ~2 _; w* t4 z    }
    & k/ t+ O- F% O- S( N    exit(0);        + d+ X; {# G$ \3 h3 Y- P
    }3 H! L' Q! s% j0 w1 u  p# |

    % |. M8 o  b. Z9 X8 v7 H8 J链式表示方法; j& ]& P/ ~% @  K1 ]
    # e3 S& P5 w1 p
    结构体定义
    ( _6 Y: C% a- X/ k' ?$ Z
    ; S$ H; Q) N6 Y( W. w1 Vtypedef struct L_Node{
    : @8 `- s( B6 |1 }- \6 T. R- b    ElemType data;6 v1 L1 S7 v9 E9 S% C6 c. L
        struct L_Node *next;
    " u* P4 E2 c( @# [  q    //struct L_Node *last;    //增加可变成双向节点
    # s) B$ g) q% Y4 F2 s}LNode;
    ( ~; q9 X3 Y5 E$ h, [3 P/ W* M- @3 N3 G2 Z) g
    初始化
    & k% Z% N& x2 j4 y# n  {  @# s  b- j( r3 `6 t, q/ B
    void LinearNode::InitLNode(){4 {# ~* P* n( c8 ~7 T
        HeadList = (LNode *)malloc(sizeof(LNode));
    9 r, J; @9 _1 ^1 e8 K2 K" u0 Z# |    if(!HeadList){+ M- z, p- M) i
            cout << "初始化链表失败!" << endl; 0 p% b# G  @1 b' n6 X& ^) X
            exit(0); $ L& D$ O$ C' c
        }
    1 X1 O+ _8 w/ p* l    EndList=HeadList;, S! Y) l) R% C+ w3 u
        HeadList->next = NULL;
    ! _; @9 T: _7 J# {$ h0 Q) o2 v7 [    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;# @) \0 {4 ^5 n  d1 v0 ~
        Length = 0;7 K6 W$ I2 P9 z
        e_where= 0;
    ( H7 Z7 G- F! y9 Z}
    ; X/ S! \# i: Q4 o/ s
    4 }, y  Z( Y% ]# ?1 j增加节点
    - _. S8 c9 {; J; W% c" J0 j/ S2 Q( I: G4 _! `# n$ ]5 C. z. B: U
    void LinearNode::AddNodeHead(ElemType num){    //头插法 " F* o4 ]0 Q6 M; Q8 x) ?- Z& x
        node = (LNode *)malloc(sizeof(LNode));
    . D, Z3 z1 W$ Y" r, R8 Z& X    if(!node){$ V! I9 v, L& r3 S6 T
            cout << "新建节点失败!" << endl; : Z# ^) @( }* j3 r8 ?' U+ s
            return; . x$ k, J+ R5 U
        }
    4 o1 I. V3 m; q) s/ u: ~    node->data = num;5 P2 q+ I1 l8 j7 S6 O
        cout << node->data <<"   ";5 \1 [( w9 l% D7 m; f+ Z, m% W6 V
        if(NULL==HeadList->next){, e6 u1 Q0 B$ y7 P- N- M
            node->next = NULL;! l: M7 A, i7 r2 l
            HeadList->next = node;) }' A1 i" k1 V1 I( P( P1 W
            EndList=node;
    / I8 h) W- j5 f' B+ x9 @    }
    + q! b  N5 ^3 }$ _+ I8 }    else{+ p% N. v, H: l7 j
            node->next = HeadList->next;. p) r& s8 E+ e: v# |5 N; \, T/ G0 \
            HeadList->next=node;
    & b( X$ {# `: c4 q/ N  E6 |, }* m% [; w    }
    1 M# C+ R3 E2 \9 D/ @    Length++;
    * j9 m; S) {+ C5 r& c5 J}8 T& |$ u0 L( F* h  S9 T

    & |3 W- I% Z  w! `8 N+ m; |- H, z) Yvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    # ?7 w3 P% K3 I# H3 p# i    node = (LNode *)malloc(sizeof(LNode));$ _  D4 V* y9 q9 T
        if(!node){- u9 w3 v6 E8 q1 K
            cout << "新建节点失败!" << endl; " M& l. t2 J  i# b6 p0 L- }, d* W
            return; 5 |9 z9 j. h3 L4 d1 y! Q
        } & `0 m8 E/ O" d' |
        node->data = num;
    . ^* T- L" _' ^. H; A    cout << node->data <<"   ";) Y. A1 ~6 H0 O0 D! A4 P
        node->next = NULL;
    ( d' d' k/ X; V, S8 F9 O/ V    EndList->next = node;
    5 x8 u) g! B& e- @% w2 {    EndList = node;
    + `' E, @2 s& ^2 S8 K4 }    Length++;
    5 G- g- u- p8 B. I}
    6 V) T5 |+ d: B& T6 m. ^0 d  w/ q" d/ d' ~5 _7 [1 d! x
    删除节点! y  ]9 ]' E& b3 a/ ~+ c/ P) M9 I6 P

    5 X8 c0 S: m' \4 hvoid LinearNode:eleteNode(ElemType elem){
    & S7 t9 B8 A; a- k/ C  R: s% p    if(NULL==(HeadList->next)){; `- e) |4 J) i
            cout<< "无节点"<<endl;5 S$ K1 J; B. q( Z: a
            return; ) f) k# c' R0 d6 J
        }
    * b" {4 K6 G+ s8 z% u8 ]' x    Node_cur = HeadList;
      m7 S3 `% k* N# a  D    while(NULL!=Node_cur->next){
    8 q& a5 i8 z- y) n' ^0 N: _        Node_temp = Node_cur->next; ( z( {/ Q! I' Z9 |# ~5 C
            if(elem == Node_temp->data){" E! ]2 Z' A5 w1 [5 B
                Node_cur->next=Node_temp->next;
    4 H) @! t) v( z- {            free(Node_temp);$ U( k: _8 ~0 \8 Y# I
            }$ v3 Q" U$ r. D3 ^9 V& [6 n
            if(NULL!=Node_cur->next)
    5 t; L) E8 x& n0 Y2 r$ P! i; ]8 M4 R  R( X, p        Node_cur=Node_cur->next;
    2 W9 s! W6 V( h    }4 h% @, I+ C" d0 E! h
        cout<< elem <<" 元素已删除!"<<endl;
    4 Y4 l7 z5 E0 d6 K% B1 s! k}
    5 X/ R* C: y! a* s9 a
    8 {$ Q) j. `% j. }3 z/ r显示链表5 `9 Z' L4 \: o  k

    # Y+ l8 C& L1 r1 g' |void LinearNode::ShowLNode(){
    6 U0 I+ s/ H6 V2 ^% J" H9 ?* @9 e. Z    if(NULL==(HeadList->next)){/ g+ E5 B8 M. e
            cout<< "无节点"<<endl;; I& o" }* O7 h. h% z
            return; ! C- j* @  J6 E% h3 T
        }8 J/ C, I" I0 C* Q7 r
        Node_cur = HeadList->next;
    . a) o; V7 q2 w! p. j8 O$ l; t2 g9 Q; L    while(NULL!=(Node_cur->next)){" E8 N' U1 @- A; e' O
            cout<< Node_cur->data << "   ";
    4 V% a, c1 O8 Q  e$ w        Node_cur = Node_cur->next;
    0 z9 l. W/ u# @3 L) A    }
    . |6 |5 A& X3 z* B    cout<< Node_cur->data << "   ";
      n9 I0 a! _# {6 m' F( E+ Q" t    cout<<"链表中的数据已显示!!"<<endl;
    / r, @: }- ^0 e6 R3 U9 j}) [& `$ G  m4 B/ I' s3 Z

    ( F+ U0 X% U/ s) q" s; p! m销毁链表
    * }9 ^  ?7 L9 c1 \$ p8 I* _* j9 ]+ J0 d
    void LinearNode:estoryLNode(){
    ) z: w0 ~; ^+ M7 e4 o0 C, V! r    Node_cur = HeadList->next;
    ; E3 S* b2 ]7 p& O* I    while(NULL!=(Node_cur->next)){0 q% ]- y1 ]  q4 O+ p4 U: _( N
            Node_temp = Node_cur->next;
    9 O. D0 T1 v4 E        free(Node_cur);
    7 s4 o4 Q7 u& V+ c/ R" ^0 O        Node_cur = Node_temp;
    & D% G1 k; T( Y& L+ I    }
    * X2 v: X2 i1 n/ O+ ?2 w* _    free(Node_temp);+ _+ u1 M1 p  J- w9 X) E
        cout << "数据节点已完全释放!"<<endl; - [; m# f: X/ [( L8 p" n
        free(HeadList);    // 释放头节点
      k; i0 K9 L4 V4 q* u    cout << "头节点已释放!"<<endl; 6 [" H7 k8 ]% P% p8 q- ?
    ————————————————7 o5 N/ N# P5 Y, F" ]
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ f6 ~$ C6 X+ B# s原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    0 W1 ?; Z1 N! p- O2 @5 @, J7 Q/ i* g* p( s1 h- r

    " A! T+ @$ N9 `; 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-6-11 13:39 , Processed in 0.411465 second(s), 51 queries .

    回顶部