QQ登录

只需要一步,快速开始

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

    + k" _" D5 l' w2 Z6 V" m线性表顺序表示、链式表示实现方法及其异同点% p$ v( A# B" O6 a$ A0 V9 u
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。4 b# H4 [. N4 p/ m# Z

    5 R5 i' _% W9 D本文采用C++实现两种表示方法。
    1 n2 k. E3 ^( z! @
    4 M0 D6 O% J+ ?" |! M目录
    1 y0 x& G+ ^) G6 e$ e6 E# F- V( F- Z0 t1 D- p
    顺序表示和链式表示的区别:2 C  P& |) ]) G7 w

    ( b2 {" K  u$ ^  ]2 l* F创建方式:
    7 e. L1 T( e; T/ K4 ^* o1 [$ u$ W
    8 c5 W( Q5 b1 B# `/ M时间复杂度:
    - j- L. i  {& V: H
    # `; q/ v$ a; C顺序表示和链式表示的相同点:
    / Q3 G) A) C5 ^& ^; P. w. m3 T! ]8 W
    删除内存空间:  p+ K# Q% `: m/ `- s3 B! p- h

    % F# I7 x" o9 f5 I代码实现:
    5 p; @) S) j$ F9 d7 ]' o1 ]2 e, J. l) h! D3 O: }
    顺序表示方法:- y' `* n* W% i0 T+ b8 R3 V

    % L$ S+ R$ o$ Y: F' {结构体定义5 g7 b$ u( r* F4 f2 w
    8 U! g) J7 w3 M1 }: q0 ~; p
    初始化
    $ w% f9 K: B6 K+ I+ |% i; T! v& a6 x& B" c
    增加元素1 }& x, Q- ]- A! w5 i7 P, D
    6 [4 x3 R6 z3 l% `1 J& ?# Q
    删除元素" {' W- q2 J' A* j6 |) q" V
    % G6 M9 T( A/ I0 V& C
    销毁列表
    # ^  N/ N+ X' o
    $ X% _3 c% W3 B3 e1 D8 G1 c链式表示方法
    1 @2 E$ x+ F9 m6 p
    * ^& Z& r$ E0 I) {) O2 c4 [结构体定义6 J& ]2 D1 L; u# ^7 L0 j# A

    4 o. \0 t  }+ H% S初始化
    - x" I2 U3 U" m: V7 o! V$ e, l6 o# R
    增加节点
    ! T6 t& d; l. X6 s6 a$ |
    ) |( ?/ G, j% u% N- V, G' |删除节点; H# j$ Z: ]' Y

    - d: C  `+ M; E; b5 F+ \0 \* T5 Q* i. m) a显示链表
    * Z4 F3 }" V0 m' l( l1 h$ U  }) C: E% W7 n! }
    销毁链表" k( I5 J* Q# k& q0 y' X* b$ b" I
    7 s- N! N# S7 Y. |7 U
    顺序表示和链式表示的区别:: S. R- W8 k% `. G3 @

    - b$ X# A' ]: |4 A6 `4 U创建方式:! M) Q: Y7 K# y* B5 W+ S6 i( G

    " N% q% D9 @$ |% \- w顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    1 q- w+ J8 U9 E# ]# @* s$ ^
    1 n: k# L0 y7 h3 @% q( i  P. j( [(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    / c" J& {, Q0 q/ G  {
    * P5 F( I7 ]' z  Q5 Q链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。8 U8 a9 K5 X( b, z

    7 l, {! R: m9 Y9 f时间复杂度:
    : N' {' [) J& k
    0 k) j2 [( {- R5 c* R) y0 \4 N6 S增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    1 |) _; I+ S$ E$ Z6 b6 ?, C& c! u2 ]. N
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)' N* ]  w' W6 p% W1 U
      X+ B- N# e% G) \
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    / h4 H7 ~; _/ I' r$ Y4 y7 m  p
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);9 a/ T# h( b$ c
    ) m1 o+ b5 g9 F, d3 E
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);  T- w3 x8 I% y2 B, O

    # g" u- W0 @+ s& g5 G# j; a顺序表示和链式表示的相同点:8 G% M! ~: [3 I. b$ G0 A
    ' D8 S7 Z  b( f/ f5 K
    删除内存空间:
      L" I0 u/ g3 o  A* s
    & j8 z8 [+ E4 F1 {" ^* |# s; y1 q- s0 L内存空间的删除都需要对每一个存储单元单独释放空间。4 |0 i9 h+ q& R! b
    ( ~8 l) o: Z% R- `" M9 j( s: C
    代码实现:. L3 P+ e, k1 W: D7 |+ e  t+ ?5 g
    - a( p" M( B, W7 W
    顺序表示方法:
    ( o1 G+ e3 r. R/ b8 L) {7 W) B# B) D% j; V6 l
    结构体定义4 ?9 V. y! N3 E

    , Q4 _5 p+ V5 \. @8 \, |typedef struct {8 b. [3 @* A  a
        ElemType * elem;$ e1 R9 M1 v; j  v  n
        int     length;        // 线性表的现有长度 3 U4 {3 \" Z: B3 i  q# ]4 q8 _
        int        listSize;    // 线性表的最大长度- Y: p* |! s% d4 G+ A
    }SqList;5 t* [  I7 x* |* C  `

    - g6 p4 |) d1 [初始化
    0 o! S7 f; p+ I* A- p* a! S4 n- D
    . r8 A) l! f% N) s* Zvoid InitList(SqList *L){  N' ?9 m2 P6 m( x- q  \
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;) t8 Q, i% E2 S% W! A% [
        if(!L->elem) {
    % \4 r' {5 C+ ~4 {4 v( d        cout<<"申请空间失败!\n";7 D5 h# ^" P. T3 {; X/ x
            DestoryList(L);) I2 ]% p% s- A/ i5 l/ k7 }9 w! z
        }0 f$ M" y- P: Q
        L->length = 0;8 V+ J+ X  J/ @
        L->listSize = LIST_INIT_SIZE;
    3 R7 D+ m$ P8 U" Z    cout<<"线性表初始化完成!\n";
    ; M* K1 v) C" U" m}, B/ C! |* x) |# T
    : k) }$ d' A" e9 W
    增加元素; E# r+ Q% a3 g& r

    ; R1 c& E4 ]  }/ m( s5 C5 E% pvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    ) H+ o' m- Q% M: K, o- Y& R7 m) |0 S    if(L->length>=L->listSize){
    2 m; K& T) ?: ~' P: f4 E+ b        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    * v! x' g% [8 H        if(!L->elem){7 U5 a9 `1 e. X' @; ?) a( u  q
                cout<<"增加空间失败!"<<endl;. U9 r# C+ P- a. @
                DestoryList(L);
    5 {  h/ [9 A# ]* y& Y0 A        }
    - a- q; h- s0 q8 ^. ?" p/ w8 D    }
    1 p4 A4 E# @7 e! c. I    * (L->elem+L->length) = e;" }* z/ @( i1 Q  L! ?
        L->length ++;    # A9 \  B- q& J4 k7 ~: y. g
    }
    9 z5 a7 E* d8 L, X9 [6 H; f* H7 t% ?. N. F' [; c' _
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    0 f: N' @% Q  f2 x, [) x2 L' B    int i;
    ' m" Q! \0 Z5 x+ ~. h    L->length++;9 I6 d8 [! I  j: @# q# S/ v9 r
        for(i=L->length;i>=e_where;i--){5 K+ C0 U6 k  a* ?' |
            if(L->length>L->listSize){$ B* h% @) `5 t
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));( q) l$ U2 L4 H3 o
                if(!L->elem){$ I! H! ?  ~1 }6 \3 s% n, s
                    cout<<"增加空间失败!"<<endl;3 P) Q4 j& M5 G
                    DestoryList(L); ( ^$ k$ w. p$ p; S4 m
                }
    : V" z6 d, I  A% d# B: ^4 G! J        }
    " M) l; x$ s$ |% Q. U7 M: i        *(L->elem+i+1) = *(L->elem+i);        & M' ]2 _: t& d! \- }4 ]
        }: {/ s, C, `! k4 G
        *(L->elem+e_where)=e;
    6 F% \+ Y+ L- @; J    cout<<"增加后的线性表如下:"<<endl;
    1 C( q  k# w; T+ v% _# |    ListShow(L);; V0 V  p0 j! n2 [8 K, u3 C" c
    }
    0 c8 ^; \9 x$ k# D+ S2 @, S0 B5 u
    5 N$ a, G- n3 y% K1 n9 V* cvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    1 O: }6 x4 m( f& S+ u+ y7 d    int i;
    ! c# b* ~1 O5 t* p, m5 t( B" }2 T* X    L->length++;
    , M4 m' v, h$ l2 z5 q4 ?    for(i=L->length;i>e_where;i--){
    " [4 @" x+ ^; \, l        if(L->length>L->listSize){
    * y- n8 P. K7 U6 U            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    , B% }4 C( J4 n            if(!L->elem){& _  ~4 ^7 A) |6 `
                    cout<<"增加空间失败!"<<endl;1 {, _) U0 Y" P8 Z# `9 @
                    DestoryList(L); # L! t+ t# S( h. V8 V) S. {
                }3 Q9 K, m3 X  I, C( l- ]1 Q: g
            }3 ^9 c) [& }( F, I; B( s  I5 o
            *(L->elem+i+1) = *(L->elem+i);        
    ) Y2 ^: \% S5 [4 j6 _    }+ A( d8 A  y/ z4 C1 R0 e$ z
        *(L->elem+e_where+1)=e;
    8 a+ G( }/ d4 @1 j6 y( D+ L, Z( V( ~3 w    cout<<"增加后的线性表如下:"<<endl; 9 i- q4 a+ V- J
        ListShow(L);8 x' z; v$ Y1 Y! v: o- a* Y
    }
    9 Y+ v" u7 e2 O* X3 `- k2 F$ a( c1 \0 F6 ]8 i% `+ ^4 P" k9 z8 G: D( N
    删除元素" v8 ^5 ]/ G0 g$ }# L; ]) \7 J
    4 o+ }  y& b% n- y$ ~1 L+ j1 r/ c
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    * [; I3 Q6 @! d' C$ C* e5 v    L->length--;0 H. f6 Q) V$ E0 S
        for(int i=e_where;i<=L->length;i++){
    5 A8 N  }( m1 W" @2 w" }        *(L->elem+i-1)=*(L->elem+i);" {% y: G. G& w
        }
    0 ?# V: L5 {! p% p8 q( A# _/ D+ I    cout<<"删除后的线性表如下:"<<endl; ( J) K5 G8 u. r' {
        ListShow(L);
    ( O' R0 t3 _( ^; m}; B1 o. p0 e0 g) I3 \7 o

    2 v8 ?- _- E% A销毁列表: l5 q+ m2 m5 ]3 K
      r4 I$ F& o1 v* H+ f
    void DestoryList(SqList *L){
    ) |! }- k! L2 u  n% j: [# @& A    int i=0;7 T3 ~# q% z/ D& G; r1 s4 V& R
        for(i=0;i<L->listSize;i++){+ p. M- i2 Q  f3 d) }* b
            free(L->elem);8 |7 y+ R3 l' O. i7 \, G' O( j
            L->elem++;' G9 ~* `) O3 I
        }3 r. W0 m; i. D! B" r  P+ H6 g
        exit(0);        
    8 ^% b; z" m) ~4 j9 k4 @}
    % L  g0 F! Z0 I- W" S/ c% {/ @. P) c$ L9 ~' b
    链式表示方法
    8 O1 M# L) L6 o
    9 o# ^" t- J. G1 e结构体定义
    ' M$ e! t7 L$ Q& Y$ t* s; o" n- J) L3 y
    typedef struct L_Node{; |6 L) \) w: ~* C8 {$ T% F0 z$ s
        ElemType data;" Y& i& l, c( r/ _4 M2 W  Q' N
        struct L_Node *next;  M- T& y' L& @4 B7 _+ v+ M
        //struct L_Node *last;    //增加可变成双向节点 * U1 x" u2 E* b( T
    }LNode;
    & n) F+ M& v1 w" ]9 y  W
      \: W% D3 [9 U8 d% k! F) J+ v初始化. p7 c. b: }- X2 o' }" L% f0 j
    ' p2 q# }) C3 r0 u! \  U$ m
    void LinearNode::InitLNode(){
    5 x+ z7 b1 y0 w$ U' m6 S5 E    HeadList = (LNode *)malloc(sizeof(LNode));
    - }9 m1 `- f; n/ p; ?* I. n    if(!HeadList){0 R2 C2 ~6 N  x
            cout << "初始化链表失败!" << endl;
    7 p2 g! ], p3 K7 i2 J        exit(0);
    $ t2 t  t3 X" E    } + Q( |. v4 P- h
        EndList=HeadList;2 G- b) u. U  o0 |- y$ k
        HeadList->next = NULL;
    3 }- g1 I7 j; X, G! b    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;3 f; H. o' r$ w9 W5 k( [* G# O' K3 g/ r
        Length = 0;
    : u, q' b2 O) _2 G    e_where= 0;
    3 X2 P1 V8 F& _/ E' Y( n; W0 a}
    ( S0 v( a$ D. a7 w6 P; N! B% I5 E6 Z! s, W  N" s
    增加节点
    ' h  z; S# ~7 c# q% }. \0 R. J
    : d( o8 B' ?1 n  Q" w; \void LinearNode::AddNodeHead(ElemType num){    //头插法 * @8 {* ]% e: p; x+ b! j& X
        node = (LNode *)malloc(sizeof(LNode));0 s- E' L# x$ q. E3 Z
        if(!node){0 q9 q& ~5 W! G
            cout << "新建节点失败!" << endl;
    ; p6 p  V; s& S        return; ) W: J. k0 U9 w0 W7 I+ ]1 h/ Q
        }
    ( |2 c6 S! K/ I* s- e+ ~    node->data = num;
    ) l6 t* m( i2 d! B    cout << node->data <<"   ";
    0 i/ }' O  T- \9 j: p1 c( l    if(NULL==HeadList->next){' [9 i1 f! ]/ x- W
            node->next = NULL;
    % e4 x' T1 A1 l0 R  E        HeadList->next = node;
    $ y% [6 D+ f* ?$ E* Q        EndList=node;
    ! J* [- [7 F! |) x* |, ~    }
    $ N8 K7 ^* y5 @6 P! V& i6 V    else{
    1 x9 T* y' l# m7 l: {' c1 d        node->next = HeadList->next;: F( X2 F$ X3 a
            HeadList->next=node;7 j* f' a2 ]/ u. }+ Y
        }
    * w2 h$ I: W8 o7 L- _    Length++; * Z# o0 ^& q: K0 O  Z
    }
    : V. F7 T/ V7 r" P+ c( e* u) Z4 \8 ~$ K
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法 0 [% p7 P. N" U" H9 b( z
        node = (LNode *)malloc(sizeof(LNode));
    - s5 N' b" ~# ~6 y$ `/ ]    if(!node){" ?) f7 Z( Q; m6 _; L9 [
            cout << "新建节点失败!" << endl; % O+ X* {7 I0 ~8 j' H
            return;
    * s: ~  l5 Z' N7 K    } + X! K% A+ ~" [; f
        node->data = num;' P0 x  ~% d5 R2 X
        cout << node->data <<"   ";# z. B% f' C7 G8 X
        node->next = NULL;2 q  v0 Q9 o' p' O! r
        EndList->next = node;
    : e. u8 y1 r( W6 _0 n4 z    EndList = node;
    , p$ A5 s) A* W9 I# v/ L. u( m0 P    Length++; ' M6 q2 U; E! F: I: N
    }
    + b* w+ {2 k( W& w7 A8 L% V/ d. f. \+ U* U
    删除节点+ r3 q$ q! I( i

    ' V# b+ b) ?3 |: O  u4 `4 zvoid LinearNode:eleteNode(ElemType elem){( A- V7 C$ [) R
        if(NULL==(HeadList->next)){2 H$ W- Q' ?* S  @& Q: X  K
            cout<< "无节点"<<endl;
    6 _" E" i. O0 b* g8 C3 n        return;
    3 a# R% e$ U5 r, q+ ?/ v) A6 B    }; d! E4 T5 D% p- D7 E/ {  A
        Node_cur = HeadList;
    : x; l; R; U4 ], O" L4 c3 ^    while(NULL!=Node_cur->next){4 t1 C5 p$ t5 j) K) A
            Node_temp = Node_cur->next;
    & C5 p/ K* o; a! x        if(elem == Node_temp->data){
    . j- g1 T+ g( b, i$ d3 z9 C            Node_cur->next=Node_temp->next;: Z1 d0 _: s1 V1 e8 e/ e
                free(Node_temp);% ^) S8 t& ]  T& v* M
            }( d3 H2 N& C+ J! {; B- i( B; _
            if(NULL!=Node_cur->next)
    7 ~* v% Y1 M6 _8 S3 q. @; f; T        Node_cur=Node_cur->next;( k  U. B& A( t# o
        }
    ; B0 `5 Y4 |9 Z" q# ^, }    cout<< elem <<" 元素已删除!"<<endl; $ g0 H: }  F: q" r* o) k
    }
    6 G. z1 h; P# {: ^* q2 S- m% X" J/ F# K* g! E
    显示链表
    * L- `* Z8 w+ i% v( c/ J9 R
    0 _5 D! b1 G$ |! J$ lvoid LinearNode::ShowLNode(){
    9 |# a& H' w* i6 {, c    if(NULL==(HeadList->next)){- n5 i8 i" q3 k3 b/ Y
            cout<< "无节点"<<endl;9 z+ ^, [6 `+ H5 a9 F! \9 w) R
            return; . i( ^- ~3 r8 |8 S) w3 _
        }, k/ ^# r3 y( f8 V
        Node_cur = HeadList->next;
    ; T5 \4 D8 s1 e& |' k0 o) o    while(NULL!=(Node_cur->next)){
    9 @7 D6 y' g- x8 g' o" w        cout<< Node_cur->data << "   ";
    - ~% \# D$ t  @        Node_cur = Node_cur->next;- K6 V8 @/ h+ C  ^7 G
        }0 Z/ D) A6 I$ q- ^2 u) ~) o
        cout<< Node_cur->data << "   ";
    - t# p7 O9 l5 O) z. p2 x% c& \$ D/ a    cout<<"链表中的数据已显示!!"<<endl;
    & U0 C- m3 _( |- T}
    5 n- t1 R6 d, v9 H* P0 B" r( ^/ s% Q' z
    销毁链表
    ! U6 M3 `0 {" Q: U, T9 i' ]6 `0 ^6 E* L5 V: V
    void LinearNode:estoryLNode(){
    . [6 W& \# Q' d8 v. _% Z- u    Node_cur = HeadList->next; - h! S- F+ _( f- ]4 ^( }% X
        while(NULL!=(Node_cur->next)){
    ) Z, ^' N3 ~: Y' O        Node_temp = Node_cur->next;/ E% `1 T  r4 H
            free(Node_cur);
    % `3 S! I  @. }. ^) w        Node_cur = Node_temp;- W4 b" C& }/ d% u  {5 ~
        }
    8 ^/ ~8 `7 E4 c7 h+ P, O( r% _1 ?    free(Node_temp);0 |; g' J& ?, k5 c% D4 @
        cout << "数据节点已完全释放!"<<endl;
    : \8 \/ n3 ^& A9 A8 o3 b. y% z    free(HeadList);    // 释放头节点
    ; i' E% {  S# T, {, t4 c2 O. b2 y    cout << "头节点已释放!"<<endl;
    & [' O# X6 B$ Y) W5 G: J————————————————
    3 P" \, _. p/ g$ \- {版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 H* ]9 n# o3 D8 [* T1 W原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
      L" u2 q2 f% `! v: c
    5 c/ m& @: U" B$ r  ^3 J
    0 o- o# F9 \; J' e1 b- v/ g6 z
    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 11:21 , Processed in 0.412732 second(s), 51 queries .

    回顶部