QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1539|回复: 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
    ; h. F. k+ d6 m2 @
    线性表顺序表示、链式表示实现方法及其异同点% _4 m' {3 H7 G, ]5 }! y
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。6 ~1 b, T  \6 G

    + Z( X0 m1 R$ l! W9 S本文采用C++实现两种表示方法。
    6 Z4 p3 `% i4 H. W4 A% Z+ _+ T3 x1 ~- `1 I* y  f
    目录4 v6 d8 n! D3 f% \; n# ~" N2 d

    8 f2 g  Y/ U4 K顺序表示和链式表示的区别:9 G. n! K, x5 P! R, c1 n
    1 K% |- k+ L7 u  x2 k0 ~$ g9 z* A
    创建方式:* B: C( b, M/ ~& ^/ s" M2 ?

    * B+ m2 F/ ?( ^/ ~- k! Q  B时间复杂度:/ m5 ^" U7 }/ l0 ~

    ; `$ P9 u8 J* ^, S9 J( M# D顺序表示和链式表示的相同点:
    : }9 m7 |& H  b6 o/ t' }' V
    # r- ?- K, N8 R5 z8 \; @# B删除内存空间:2 F! i. ]" m" [
    8 [# b6 D$ k, D& _% f' {6 A8 Y
    代码实现:
    2 G+ m* D7 g3 n; f3 M" t  v% z$ c% H9 {. J  X. q2 L
    顺序表示方法:
    8 V6 W0 J: W- \: U- ]% J/ n& @  c
    结构体定义+ V6 }# Z/ }1 J4 k4 E
    + |2 b8 [# m- U# V
    初始化
      Z: W1 q8 j8 o# Q  F9 s; c0 k0 x! F! Z8 ^
    增加元素
    : v+ q% P& n' e% v1 Y; y! n9 {
    7 L. a- x( |$ A删除元素1 v. u/ z. m6 y5 t  ^! A

    , p8 z5 ^1 C: i/ Q销毁列表
    5 s8 r5 P; ]& Y. w/ ^% k. a. B8 Z4 m4 @, ^
    链式表示方法. R9 {* ^' @! R) q
    5 `" D  y( _3 Y& Y' l* T, p
    结构体定义. M, I% s. v2 X/ J5 ?
    3 s1 g: _; k/ [# T/ f& }5 ~8 h  x
    初始化
    3 d8 X8 c" f+ w% Q1 B$ Z
    2 s5 T4 g6 K/ t; T增加节点$ e; H+ p  h. x" z  [. y

    6 g* T2 e# u% m, o- Z/ v6 q2 z7 D删除节点
    7 v0 Q9 h( y/ q$ A# K. `  P7 M$ J
    显示链表
    2 E7 p2 B* p  {- x. c1 W/ D
    , F# r, z; @5 V销毁链表
    0 z4 J) c8 i8 K9 i3 |( A* |/ ~- H/ p6 s' \
    顺序表示和链式表示的区别:
    3 ?5 j6 U% U% d) I2 m$ c: C2 g5 {8 a
    创建方式:
    3 E  C% Q# E$ ^
    ! f1 q2 _$ Z" d- H8 j顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    . N" y$ ~7 h- b4 V4 I3 ^. J1 u* v/ u3 R" t5 k) s. i
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    + m8 u7 \# v8 E: `% }3 ?1 k/ N/ s5 D: {6 G) \: g0 Z
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    # d  L, x& ~& {, E- D9 x& {3 r, A/ {+ w- C" g9 X4 V
    时间复杂度:
    & l! v$ G+ v( L3 c( E3 ?1 F8 d
    : h/ |- x) T; }$ E, l4 X) H增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作); f+ Z; Q( K5 F" q0 W) U" x$ F

    . _+ Y3 u; c4 W6 M; _, D2 ~7 ~增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)$ x4 ]. c- a% X4 `: K* H/ [2 p
    " V* P4 p" U- y9 c) E+ a- m8 K
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。, Y8 q7 N/ C9 N! P! }: G+ X1 ^

    : [  K4 t" q- W" M7 P2 i+ y& B修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);4 [7 q+ \" A4 F$ {4 o
    $ N/ A* n" a8 x9 @2 M
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    $ R, @) I, c: P2 H: f7 [$ \
    0 h* O; h" I; f: g( c$ w顺序表示和链式表示的相同点:; A! C- K( k, P- {5 Q0 H
    ' D" n% K# Q. G1 c
    删除内存空间:% i; N" U; Q0 M, ?* A

    $ m" ~! r/ G' @- }内存空间的删除都需要对每一个存储单元单独释放空间。" Y3 M. f! W, |, d
    4 b0 j9 t. D! E, U# ~# ?# k- s
    代码实现:
    % H* c9 ?' _4 l. N; S, a. {
    6 f+ N7 J$ j, j% w9 U1 c顺序表示方法:
    * w$ @3 g% Y! j& Z9 N, h' k( Q# `+ e* l3 x2 ?4 L
    结构体定义
    $ x8 |) F) `. H& M" @" X7 R  w6 p6 K% A8 H2 v- L+ E$ o
    typedef struct {
    9 T& Q) |0 @& @7 z( q    ElemType * elem;
    . h# m( l1 t" l0 ^5 W7 _    int     length;        // 线性表的现有长度 & p2 p; b8 F: M+ i4 ~+ U, C4 {
        int        listSize;    // 线性表的最大长度' e, V- Z, e6 f- O8 Q/ d0 s9 S: V: b
    }SqList;
    / V, b; {3 j# }) t( S) O& E: |/ M5 ~. C4 a, `) T2 g, X% p+ j
    初始化" _( a# I( u# |$ B
    ! [, E  S2 l4 ^) z# D; T
    void InitList(SqList *L){/ N6 M6 U5 m( L; U  L
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    $ t# ^% g% {' Y' |9 c    if(!L->elem) {" V1 e' r+ ^9 Y7 z% \# J
            cout<<"申请空间失败!\n";; ]4 b# c! v9 Q) B, q
            DestoryList(L);
    & x# d* y; X, N$ Q! D4 x    }( v1 {2 @! L( J% x. J/ x
        L->length = 0;! f3 A6 P+ M; B* f  x
        L->listSize = LIST_INIT_SIZE;
    ; w% m; s! E+ S- y    cout<<"线性表初始化完成!\n";
    $ D* K6 _7 s: G}
    6 Q/ O. v8 m3 S8 k# \6 M% S# f
    / W" }+ A5 \: H5 @2 E% W, s增加元素
    . }7 a% h' J- F( y) w7 E
    8 B) `2 O) @- |* r$ Dvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素: o9 Z) `0 b2 A7 p
        if(L->length>=L->listSize){
    - @' X" K& f2 o        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    + K' A% M9 ]! o1 }        if(!L->elem){$ Y# x/ a9 q0 G
                cout<<"增加空间失败!"<<endl;4 O2 |9 }2 D4 v+ z" W! p3 [
                DestoryList(L);
      B$ T& j9 U3 E+ u3 x$ c        }1 Q+ e3 ]) a! G( r
        }1 U! [& w- L8 m) Y
        * (L->elem+L->length) = e;
    1 t6 S+ l9 _3 }( n; c4 F. Y    L->length ++;    ) Z7 k9 b* x, e% r
    }9 \4 a0 [! ]+ o* X, y

    + y1 W' H$ V0 f/ xvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素- x" i# E8 s' B. ]: Y3 K# D
        int i;
    1 J$ a1 @; @$ w8 V% x8 p3 X9 D    L->length++;
    7 [- n# i7 c) j* d    for(i=L->length;i>=e_where;i--){
    5 _% F9 ], ?& H, \, C, b+ ~        if(L->length>L->listSize){  G) e0 q8 {% Y) o' h# A# f1 F7 Q
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    + I+ L9 J: E# P: G( h  W7 X            if(!L->elem){; ^  S7 [3 ~6 j
                    cout<<"增加空间失败!"<<endl;
    % `4 P% C6 v- ~0 ~: G                DestoryList(L); * I1 ~# a8 h9 O: Z
                }
    0 G; o2 Q+ V' t; L        }" c- q6 \" s% b; i
            *(L->elem+i+1) = *(L->elem+i);        . ?, y! d( \" J- ]6 t* t
        }
    8 F5 W; S$ p4 A+ [! |4 L7 A    *(L->elem+e_where)=e;
    9 m; F* ?; h/ ^6 C    cout<<"增加后的线性表如下:"<<endl; % X% v/ P6 O" j) I0 s
        ListShow(L);6 P- B0 \! }% L
    }
    - a; z7 \, f( v/ R9 B" q2 Y
    2 L+ E: k! q8 Y( ?void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素- _& M* Q/ s: Z! n/ `& C# `
        int i;
    # ~* @' u8 t# b+ L! m0 B! A2 u: ]7 ]    L->length++;# y/ Y9 v; P; |& D) X
        for(i=L->length;i>e_where;i--){& G# T9 ~6 N2 d+ ?( L2 g% B
            if(L->length>L->listSize){2 k* g9 d0 X8 X2 e9 U$ o" \/ G
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    " A8 }* J8 M& \# D+ W            if(!L->elem){
    $ W4 @+ H/ U% \% h4 V" h5 ^, z' c                cout<<"增加空间失败!"<<endl;
    ; ?4 W; G' s- H. _% P/ M7 E                DestoryList(L);
    5 X* v, g3 {5 l            }
    & d$ x" R4 F- Y6 \7 C& E        }) V+ f1 S. \7 J! i& j
            *(L->elem+i+1) = *(L->elem+i);        
    9 p7 V+ X! o  T- ^; }: h* y    }
    7 |# v7 e  m7 v) ~    *(L->elem+e_where+1)=e;
      Y5 o+ {( L- N2 W- ?    cout<<"增加后的线性表如下:"<<endl;
    % T, @( r5 Y- d8 ~1 `# v+ X    ListShow(L);
    & ^1 Y. ]% W' P6 R}
      Z1 b! V  E; m% c) C/ h; r% q( q, O
    删除元素
    & p7 o6 }1 J. ]. S. A$ \. o( |9 B" E
    void ListDelete(SqList *L, int e_where){    //删除某位置元素 + m! I: K; k$ r5 p. M0 G( p8 ~
        L->length--;
    5 V: J6 b- T7 M    for(int i=e_where;i<=L->length;i++){8 P, {3 y& F, @( T, ~: x" O: q; _
            *(L->elem+i-1)=*(L->elem+i);0 i0 a5 l9 X, i: u, e1 h2 d' \& Y
        }6 n. o- ~+ h& Q  x/ O) `
        cout<<"删除后的线性表如下:"<<endl;
    7 A# V0 m' @5 X* U: H' u/ `( Q% ?    ListShow(L);
    2 @! n9 t1 z- M}
    . a  \; l" g+ ]
    $ r4 I( m$ U) S8 E' r销毁列表. G) M5 \- ^% m6 O; K

    / c7 b/ s8 Y' O% pvoid DestoryList(SqList *L){3 v( ^0 r9 v$ `# F8 G
        int i=0;  ^) H: ^/ a; U& ]
        for(i=0;i<L->listSize;i++){# v+ l& c  m: W( |+ z9 z
            free(L->elem);" q( G5 @, k+ a$ g
            L->elem++;" d" [- H! s2 n  h
        }
    $ F  g. o  C" C3 G    exit(0);        
    ! s0 ~3 K. }) r# D5 n) d}
    + c4 p( b7 _/ N. F& {% G
    - E* r9 E' ]- k% [5 H链式表示方法  Y( }0 i2 [9 `
    ) `; ~% ], ]& n
    结构体定义" [1 F: Z5 [; B0 y7 W* }. C
    9 S* N( A- s' e
    typedef struct L_Node{1 m- i# V( M: T+ E$ h$ ~5 M( N, S
        ElemType data;
    . p& j0 s- w: R/ O6 \    struct L_Node *next;
    . B% L4 }% R/ [5 X    //struct L_Node *last;    //增加可变成双向节点
    3 O& h/ s4 c& [$ L! W. _5 X}LNode;
    4 P* r/ x' {, k1 |5 S; s) J& ^$ F  C1 p% |4 T0 S6 V; i! c3 ^+ \: [, {
    初始化7 {: H; U3 \0 \' h1 R
    % ]/ _: `3 }- X* I, V* z4 |4 A
    void LinearNode::InitLNode(){6 Q# }2 i+ g2 t. \
        HeadList = (LNode *)malloc(sizeof(LNode));
    ) p  h: h0 D6 `( F: s, t+ R$ u8 z    if(!HeadList){) k0 {  W: X  n" [/ [
            cout << "初始化链表失败!" << endl;
    $ s) d; ?8 A$ G        exit(0);
    " f; G) w8 o1 I* C% Q1 A1 H3 z    }
    0 A6 \5 b$ D* R4 s- j+ V  [0 G    EndList=HeadList;' }4 N8 \9 f4 [5 _1 r5 _) N
        HeadList->next = NULL;' E) O* M! P+ Q: C( t! S$ h
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    " c4 f2 Y, V: f+ p    Length = 0;/ w* w) A: p9 Q4 N% {6 {$ [+ W+ }$ F
        e_where= 0;4 v2 J5 y% C7 K$ \8 K; b- t& z. [0 R/ ]2 d
    }
    4 j8 ?* o6 M3 p; k+ b* y
    ; q" H+ i( {, [% A: N增加节点% m) i& R$ C- B6 E' ^

    , V& B3 B- a) N6 A3 t& K# }9 z/ Kvoid LinearNode::AddNodeHead(ElemType num){    //头插法 - |1 b, j9 g) b( S; Z3 @
        node = (LNode *)malloc(sizeof(LNode));. v# w# j: {- ]
        if(!node){
    0 b0 X% Y/ ^; Q/ w* e5 N' g7 [        cout << "新建节点失败!" << endl; ' c+ e2 @3 x* r" \$ ?5 d, O
            return;
    1 k2 u; k9 a( w    } ! W9 ~' e0 |1 O! h0 o) a' Y
        node->data = num;
    ) o7 F6 x; h  A: o& }( ]    cout << node->data <<"   ";
    / i  Y7 ~9 `: W% v+ o+ H    if(NULL==HeadList->next){
    8 B% ]1 v9 N$ _        node->next = NULL;! \4 G( z8 ]8 u( M
            HeadList->next = node;
    / ^( Z! `2 P! O8 @! g1 H( s- x        EndList=node;
    ' k" P3 i7 g7 ?% E; v    }- p( A7 J! o) Q$ b( M3 M& v
        else{
    7 P1 T$ k- t3 x( y+ T4 j' s/ S, S3 {, W        node->next = HeadList->next;
    $ r% I/ Y5 l, E        HeadList->next=node;+ {+ F$ F4 i! w+ ]4 L. U
        }
    ( X. V5 g5 E. E6 f1 D# U! N    Length++; # N; v# A3 i3 R9 m; r/ P5 A- n
    }$ \$ T* O0 F) `" |  u$ P
    1 d  O+ B3 [6 G6 T( t
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    2 g; }  r0 S7 P- n) \    node = (LNode *)malloc(sizeof(LNode));7 p: d* V: S1 p' Z
        if(!node){- c% {9 G" g4 f1 P( U* l
            cout << "新建节点失败!" << endl; / _4 T( W% R. j! z- E+ v# m
            return;
    5 r1 g- j* |. O    } 8 @; H6 e3 ~5 i
        node->data = num;
    ) g- c8 ]8 w! v/ s    cout << node->data <<"   ";9 ?+ r5 K+ `' _3 W$ ]% N2 W) i
        node->next = NULL;
      v/ }$ ?# M/ U& c- F$ o$ z0 }7 {    EndList->next = node;
    8 z& y; ?; N2 \6 E1 P& B# V4 P    EndList = node;
    / M4 }3 l/ t+ T# B; W" g( U    Length++;
    : I: U: k% L& {, K% c}
    8 c7 d. C7 ]; H1 @7 d- a6 p" L$ ^- p1 f( B7 n6 e; a5 E/ G
    删除节点
      A$ W3 y* W+ M( Q( Q
    & n5 O9 d9 G# b% ]% H/ V9 @+ tvoid LinearNode:eleteNode(ElemType elem){. }8 z, _1 F, c- x9 `) E% `
        if(NULL==(HeadList->next)){
    7 q3 _8 V, i5 ?! u        cout<< "无节点"<<endl;
    : C6 [6 d! g* `- n& ^        return; & J0 v, {# o# ?
        }  r. a5 A& K" x
        Node_cur = HeadList;
    5 G! a( A$ w3 R$ R    while(NULL!=Node_cur->next){
    + I8 R, M1 O# T+ S        Node_temp = Node_cur->next; & T, v4 V- Q& x
            if(elem == Node_temp->data){
    / k; T5 P3 T0 t" I/ W  R            Node_cur->next=Node_temp->next;: H1 h. U+ n2 o" m& q8 A9 {" }
                free(Node_temp);
    : q+ a! T* j: b& n. @9 X        }
    $ k# C5 s" {& p7 ~' T, J        if(NULL!=Node_cur->next)/ a3 o, n4 t+ o! h; ?  j
            Node_cur=Node_cur->next;
      ~$ r- P* `' p    }
    4 V9 [  p3 j) B    cout<< elem <<" 元素已删除!"<<endl; 4 m# Q0 z* {- U) Y+ O: F
    } 4 I, ~  h5 n# z$ o  Y

    $ t, H) }$ ?: b- [8 `9 b显示链表, k: _5 M; v, V& m
    7 N% F3 Z; I+ I; M  `8 ~! \
    void LinearNode::ShowLNode(){
      x+ l4 b' v$ s# g! A* s! b, h    if(NULL==(HeadList->next)){" F1 C" W( _; ]* U; W7 Z) |8 m
            cout<< "无节点"<<endl;+ q, @/ t9 _( B4 S
            return;
    ! m  f: c2 Q/ p; P) R    }
    ' G5 B, z; k9 D    Node_cur = HeadList->next;
    7 [2 e# D7 S' D    while(NULL!=(Node_cur->next)){
    ; h- x& L& C( U/ p- l        cout<< Node_cur->data << "   ";
    / y. Q! m0 @* b, |5 x. t        Node_cur = Node_cur->next;
    * P% F' t8 Z* @% v" R    }
    2 c7 [/ k, F/ a5 |& ^    cout<< Node_cur->data << "   ";
    6 g% I  J5 Q/ L: D5 \    cout<<"链表中的数据已显示!!"<<endl;
    9 \; s- d1 W7 L}* b4 u: n: i7 @2 O- s% {/ M; }/ G- s% m

    . m- F+ c" D; a9 v# {; ~' y销毁链表
    ) G$ Y8 d) u1 s
    4 s0 G) H8 H, H5 u+ Zvoid LinearNode:estoryLNode(){. T& ^7 Y+ i! C- S: T
        Node_cur = HeadList->next;
    2 o& T: p5 O. h    while(NULL!=(Node_cur->next)){
    ' E1 K0 T0 ~' O& S9 k" o$ z6 d+ k        Node_temp = Node_cur->next;
    ' U% f- h/ B; M% {0 ?        free(Node_cur);) r& |9 q3 |2 Z; a2 B( ~. k
            Node_cur = Node_temp;
    % A% d; m( U7 z    }
    ; E, @1 H! Q! a. H    free(Node_temp);
    4 P: M/ _3 r! S& d    cout << "数据节点已完全释放!"<<endl;
    2 q+ ~! ^/ Y" m6 q: M2 u    free(HeadList);    // 释放头节点 7 X5 Y+ v. G- g3 S* R+ m
        cout << "头节点已释放!"<<endl; # p1 b  H# r" b) X4 [" z; t2 U
    ————————————————
    ) l" k2 C( z+ s7 z$ x6 ?: Q6 S5 k版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) E- [/ i1 z0 s2 Y$ L
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286. \! @3 K, \$ A, r* I

    % N: O, I2 U' i  w$ J2 o7 s+ b) F7 T" [5 W
    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-22 12:28 , Processed in 0.447111 second(s), 52 queries .

    回顶部