QQ登录

只需要一步,快速开始

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

    * X, y4 o6 J+ ~5 D! @( f线性表顺序表示、链式表示实现方法及其异同点7 d- W: K- d8 H
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。/ T6 y) ]% M8 E4 n
    4 H8 s% {+ h4 s# g) |
    本文采用C++实现两种表示方法。$ w0 t! @. ^$ J: }5 J
    # D6 V9 n2 k4 l: w/ t
    目录6 w0 E3 W5 J7 _: M2 A, f! Y5 K& M

    6 H$ c0 M; o; }3 j" S/ ?, ?) b  P7 Q" @顺序表示和链式表示的区别:) B8 x7 z) B# x% K& Q# s
    2 w; S7 K8 z( a9 C6 Y( i
    创建方式:$ ]/ i) \2 Z  X. @9 L
    6 ?9 p# L' w$ k+ }  R/ M; r
    时间复杂度:4 X8 u9 t. }, Q, T; q
    / e/ T& w1 M, L+ W: l: a/ R
    顺序表示和链式表示的相同点:
    * R; G3 Y5 Y) ^& J  @6 M' L4 M
    " W  B* M! Y; ^) {: _; |& T( [, n删除内存空间:
    5 b/ h$ z" [4 i& J0 k) p, q& |, I4 B( P* H- Z7 b
    代码实现:
    / b4 I- |( r# V4 c# x
    * |( g) x/ h" {$ U- @$ B( [顺序表示方法:
    , Q# a- ~, z# G2 ]# J  z+ d& y( ?
    结构体定义+ i0 T5 m( J2 [! S

    - \, U, k# j2 P- n* ~: n2 Y9 H5 _6 D初始化& C/ w- A" o/ _1 R% b6 I
    / E2 s- p" J; e
    增加元素
    # Z8 f0 ], B+ U% O3 ]8 A+ f7 \$ G
    删除元素
    6 M) `1 E' W; h4 c' W
    0 {% X$ e3 \; a! s  Z8 U) _4 x销毁列表
    . J8 g; m9 K( @& v0 [; H$ c; l& B. i- m7 Q* r: N
    链式表示方法
    " v! ^% N( F" @+ V+ ^( ^7 v8 G4 \- }4 w4 T
    结构体定义
    6 R1 y# g, |6 q5 l: A! R% m8 j; {5 m( p5 n7 V, X# x# Y, b
    初始化2 X7 \. j; c' |6 Y: `
    % Z: e" |$ O$ m$ [- f7 Y7 B. O
    增加节点/ z3 V( a0 J( c& c3 c' h& K

    ( Q; ]1 n8 ?& ]. A  P+ R删除节点
    + [5 ]# e1 G: c4 t& M" T% u  z; r0 d; S" B3 `4 m& a
    显示链表- u9 K* Z7 o1 {
    " O0 m9 w' B# K$ X' Y( g5 |
    销毁链表
    5 h& K+ S3 r; ?" H9 j5 C" o$ G; ^  Q7 K' n! f2 D8 C
    顺序表示和链式表示的区别:7 `  ?# V- _8 j

    - |: A8 Q2 s) e- P! H1 w, [5 M创建方式:
    , r  H4 t4 [$ }8 \& L
    9 j, }: x6 Q, W% V  P3 j7 I- [顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    4 b. z8 f; s& `1 m- R, L2 c! I# _/ E8 Z$ u5 d
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)* v5 y1 W0 _- ?4 Y
    ' l5 L& n, ?+ E
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    4 i! h3 S8 J$ B% r  p5 O$ e' j- [, D# D, a3 s7 x
    时间复杂度:
    " y  P5 H4 b# Y; {; v
    ( ^8 S0 F5 k! b' L0 V; d增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)" o7 I2 x( V# C

    1 }2 Z6 l! o5 F增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    6 \8 Y# m! q4 q# l/ e; t& M1 L7 ~+ Z& r
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    . X: Y7 P( q0 F7 K3 Q
    7 G0 O. |+ v" p2 j1 C, ^# a$ q% K修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    + _8 P' F, ]6 ~
    - y) T( i! \8 M) Y. L查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);, R% b# M3 B. @" {. X% `4 y

    ) W6 m/ @3 ]8 C" C- m顺序表示和链式表示的相同点:
    8 |- l) V& Q% \  G
    : ]3 L. Z! w9 F% G删除内存空间:
    % C5 y* g  r, @& q* g1 K0 L" X6 X
    $ S# N1 S! ?+ A0 l+ L* E内存空间的删除都需要对每一个存储单元单独释放空间。
    & c$ D, l# r3 b& m7 C) T! k+ s/ U/ C4 |" K
    代码实现:
    4 o4 P$ k/ u) h2 u* P! `. Z, `- N' K% C6 \3 y0 ?
    顺序表示方法:( u; H- h6 ?$ j# a

      m; h; u3 V8 x2 v8 h2 e结构体定义3 {1 F# `1 s" |
    " K9 \. q! ~5 h% m2 v
    typedef struct {9 u3 u9 I$ T: S
        ElemType * elem;
    5 H) i' V: {7 g    int     length;        // 线性表的现有长度 * x; V" V, ^* M  w0 Y0 `
        int        listSize;    // 线性表的最大长度
    1 G8 R; t( k  G, {2 J: [6 p}SqList;
    ! s$ s& e; P5 ~8 w' _' k5 j% `: z$ f7 ~( t: X9 }
    初始化; _% Z( a+ _- Q( W( u3 y
    8 j, ^) C, y. `& O& W9 ^4 F, y" c
    void InitList(SqList *L){, `  `, i' K% a: Z: _5 `& ?/ x
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    6 ~0 z( c8 k" {    if(!L->elem) {
    * Y0 |* v8 d% y  V/ I$ C        cout<<"申请空间失败!\n";
      }) {$ U& V% S7 L/ X& ~        DestoryList(L);
    / m- \' X+ M, n. n7 |4 L    }
    ; ^3 y* @$ b6 H* H# Q6 P8 h; C% C    L->length = 0;/ X1 R: h' Z) _* F2 b5 m& _& f! S
        L->listSize = LIST_INIT_SIZE;
    / C1 u- \" i9 t    cout<<"线性表初始化完成!\n";
    9 y: q" w9 L0 T* ~$ F9 v}
    ( i' P, H/ e0 _* S+ B4 ~) n0 ~2 P- P  R% l" ~7 p( S2 c# y, P$ [
    增加元素
    $ J- Q$ ]/ }/ |: p* _1 C0 p6 d( G6 Z/ l5 f  \2 L6 A( a
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素+ I, @, f2 j6 M, t# `' T! T3 f
        if(L->length>=L->listSize){$ m, O( w6 O! S- P2 B! _: S
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    ' {: b* F5 y- o( b/ r! [# Q+ ?        if(!L->elem){: M8 j1 d) e4 V6 \6 |0 D% R: L; q/ P" |
                cout<<"增加空间失败!"<<endl;9 l+ y# }, K/ X4 |2 L
                DestoryList(L);; M- ^3 M4 P( d4 D
            }# j# c- x$ p, P& U! Y4 q2 u8 y
        }
      ^$ O+ _& t0 F( M" m* G& v3 H    * (L->elem+L->length) = e;
    5 Q4 i+ O/ M0 w# v  j3 ]    L->length ++;   
    8 Q. e" J! u' e( J}' c$ t& Z  G. N6 `0 q4 S  ?
    ) J) ~& _8 |" H. Q
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
      I  M( {' p/ ^2 r$ ]: l    int i;9 N. x- v- F: L  r
        L->length++;
    ) z7 ?# j1 r9 o. i) N. q    for(i=L->length;i>=e_where;i--){
    8 k% o$ Q3 e$ ?! P& W        if(L->length>L->listSize){6 Z: O6 k% Z0 I# F5 D
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    + E# a2 M% Q4 k$ Z7 h* {" X            if(!L->elem){
    , S3 x) [7 X3 l, d. u                cout<<"增加空间失败!"<<endl;
    6 L0 Z- C3 r2 E+ I5 x4 T- m                DestoryList(L);
      n% b% c$ G9 c, Q, m            }+ h$ \" R6 c/ A
            }
    5 {3 b- x: R+ S- l        *(L->elem+i+1) = *(L->elem+i);        
    ( c4 C. d- R) \$ l$ f$ ?    }
    2 a2 a; {" i6 H1 Q- o( h    *(L->elem+e_where)=e;8 z& x! e, W4 X: K
        cout<<"增加后的线性表如下:"<<endl; ' o3 a0 c* {! g' X% T, R
        ListShow(L);4 l8 X2 p. R' C- H* j
    } & [7 m/ m$ D' B: J. v

    ( G% B; Y- d8 n* g: v) pvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素2 J$ ^& Q8 b4 b. Y' m% Q, I
        int i;7 ]0 p# D. \1 t, k1 `
        L->length++;
    # b2 f" ]2 w; g9 C4 I+ n: x    for(i=L->length;i>e_where;i--){$ H* b3 V+ Y$ [3 T# @
            if(L->length>L->listSize){* c/ T$ ?) N1 W, |4 v" k
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    * j4 l! x- j( r- A! g            if(!L->elem){: q5 F3 Z5 C5 Y: \
                    cout<<"增加空间失败!"<<endl;+ ^8 |8 x% k4 l) L$ h' i; \% D
                    DestoryList(L);
    2 b8 r! b1 X1 n: w, L$ P/ r            }
    + s1 f% H% G* z; @+ K- Q        }% b& O; x; ?# g8 a
            *(L->elem+i+1) = *(L->elem+i);        7 ~: I9 D5 N0 P9 k+ \5 @4 g
        }0 z7 g* c; d, o, z% I/ N
        *(L->elem+e_where+1)=e;
    7 P' P3 J/ i8 G  T4 m    cout<<"增加后的线性表如下:"<<endl; . k' o: E' x5 R  y. c' c" M
        ListShow(L);5 A' W- i( o+ E: O9 x3 ]7 e- G
    }: T: M/ o% j2 k6 |; X. c! @7 B

    - N% v* i3 ~1 \$ p5 W8 _删除元素
    4 @: y6 b  m! l4 L9 G7 }
    - M$ W% ^; D+ Z0 o$ Z" ?void ListDelete(SqList *L, int e_where){    //删除某位置元素
      d2 N1 p+ H" X/ z7 f    L->length--;
    + K, h3 R" ^" K1 n8 Y/ b    for(int i=e_where;i<=L->length;i++){
    ! B2 r# j1 F  l& q        *(L->elem+i-1)=*(L->elem+i);* K0 b4 O( f0 g4 A
        }1 s5 [( c1 `. F" h
        cout<<"删除后的线性表如下:"<<endl;
    4 O( y: y' T! H/ |2 C4 o2 V  j8 J    ListShow(L);
    ; D* i/ _; ?* `7 y% u. w}
    5 P- U# v3 K/ u
    # t. Y! {% ]1 C销毁列表
    : E( `& r+ }+ d+ r2 P3 g# ?5 m( T' N+ ~- |
    void DestoryList(SqList *L){
    ) D, [; Q: N. ~2 U    int i=0;
    2 f  X- m5 l9 O; ]8 P; z    for(i=0;i<L->listSize;i++){8 B; u/ O- r* {* o7 h# @; E" m
            free(L->elem);1 m) b* q' S3 A# N% z) L7 D% O
            L->elem++;/ S) b  b0 |4 p) Q- v( a
        }
    % z7 k6 S- e1 i' m. l    exit(0);        
    % _% r/ I. E6 g}" }1 y& V, g4 ?# x
    / `: D" Q* n1 O' S: B3 ~
    链式表示方法0 u8 O% j( @" J5 x* A

    . J9 \" ^' V' S) ~  f# n9 }% N结构体定义
    1 [4 q3 i! ?5 T7 [- h' W
    + I* b2 M8 w" }5 Y/ o5 s8 htypedef struct L_Node{5 p* A7 ?( S/ g) \2 f
        ElemType data;
    . `: n4 [+ u( |; i/ I    struct L_Node *next;
    ; O' A; o+ a* c" `    //struct L_Node *last;    //增加可变成双向节点 1 G( l" ^: @, v+ C
    }LNode;+ P0 B- ?$ \) s
    + W  Q5 Y) G; l6 _- E$ @
    初始化5 R3 K7 M* ~  o  D
    ; B' J5 d. z' g$ t; g
    void LinearNode::InitLNode(){
    ) p$ k+ }0 n- ~, e' U    HeadList = (LNode *)malloc(sizeof(LNode));; V2 h6 f. q( {0 v# `3 H+ A/ g
        if(!HeadList){& z) J+ k+ F2 `( W0 w9 Z9 r' \
            cout << "初始化链表失败!" << endl;
    , M3 `8 f! _  Q6 w# V' N        exit(0);
    6 C) O4 X+ J* \3 Y( C    } # k2 N2 v4 F, f& n1 I" O- M* ~
        EndList=HeadList;
    % F6 P7 r0 ]9 i. B9 P! z) e    HeadList->next = NULL;7 m/ @/ F: r/ B: T9 ]* b6 d
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    4 S/ O) W  x# F7 B& V    Length = 0;
    $ {0 @8 f( b$ O. D3 E$ D    e_where= 0;% J" ~& K1 g1 x0 z! ^0 [
    }
    ( H% V& j) d; J
    & i- n, v2 \; b3 y9 V增加节点; o/ V8 K) O6 x  i( W6 W5 T/ [

    + f  l& V3 T4 t( Cvoid LinearNode::AddNodeHead(ElemType num){    //头插法   U0 I' M, n9 \+ }6 U+ j" p: q, W
        node = (LNode *)malloc(sizeof(LNode));* G% I) K$ V, E4 y) ?0 n  C
        if(!node){1 ]' z$ m; G& `5 v3 Q7 e- T
            cout << "新建节点失败!" << endl; & [  @4 A( ^' Z, E, K
            return; % X& J7 W* @7 \* G2 i- c) W% z' }' K
        } 3 g8 ?0 v/ a( \% u8 f" i( l: v! z: |
        node->data = num;
    . N- A, J; p0 \! D    cout << node->data <<"   ";
    : z( A  D0 W( r    if(NULL==HeadList->next){4 `0 Y: k6 L# S7 u
            node->next = NULL;
    " z9 j. W* N" D/ Z1 t        HeadList->next = node;
    ; f* k7 k6 t6 j" k        EndList=node;
    , m0 C# W( x) I; z2 S. |2 I    }
    - Y% {; P) T0 z3 S# F    else{5 B. h6 e0 @: M, f; V& f5 S# m( I0 T8 ~
            node->next = HeadList->next;
    4 w9 g6 U% q) U. b) i  j. o        HeadList->next=node;6 D+ C2 Q- F% _* h2 R
        }
    ! u% j. i. C! T, b! K0 }2 F2 c& U    Length++; 6 A0 q0 o& d- ?8 R) a8 |8 M
    }
    % }6 v1 a/ P3 R" @/ a/ D( t
    9 I5 T' ~3 A$ k: V) \  xvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    $ g/ I- N2 U4 |9 S( L3 X3 }3 m: Q3 ^    node = (LNode *)malloc(sizeof(LNode));
    * {3 X5 C0 M1 K# d' ~( M    if(!node){' E3 [# A" v+ p6 z+ R! A
            cout << "新建节点失败!" << endl;
    $ L) b- g) B: b9 @        return;
    & o9 D# S5 q" I+ k9 a0 V) ?0 z    } - B) c8 X" ^5 f
        node->data = num;
    5 B8 w% L3 f; h5 d: q% q    cout << node->data <<"   ";
    . P4 R1 \7 E% i4 A2 G    node->next = NULL;/ {+ f1 R5 x- G$ Q& J
        EndList->next = node;
    9 G1 L8 A% z1 R" F0 n3 @    EndList = node;
    , z6 o+ ^. A- ^1 q& o    Length++; # G4 L' M/ |; p: L
    }
    + b: ~0 {3 i% ~6 |! }0 m  S2 H  Q! y3 x& Y' j" I
    删除节点
    ' h( [4 l7 T* g% [, Y% ?2 }
    3 e. ]( A6 F( f: Dvoid LinearNode:eleteNode(ElemType elem){
    * h) Z% N$ O% M% N# d    if(NULL==(HeadList->next)){4 {' N5 |6 n& R6 _5 `" V* y
            cout<< "无节点"<<endl;! ]1 B' y) q  G  S+ z
            return; 1 ?/ q. j7 T* ^6 a7 z7 a' y
        }. `) Q% e( \( f, @8 l$ m4 V2 k  c3 K
        Node_cur = HeadList;* q) b& f+ r7 R3 F( F9 E7 u
        while(NULL!=Node_cur->next){
    8 ~& [7 B8 I. {( H  n) n  _, U: y        Node_temp = Node_cur->next;
    7 g5 k2 r: j7 h$ I* h        if(elem == Node_temp->data){
    9 n" T& |. G, [            Node_cur->next=Node_temp->next;/ u/ }5 p, \' |) r- s1 q$ _0 W
                free(Node_temp);
    1 p) q$ p- M; p4 a        }6 v/ t0 E- ]+ \6 B- ~8 A
            if(NULL!=Node_cur->next)6 a' b: m/ T; B9 f
            Node_cur=Node_cur->next;& V+ i% @0 v7 q4 v, \4 x
        }; l2 f! Y! W& I/ N- {
        cout<< elem <<" 元素已删除!"<<endl;
    , \% |6 x5 @- \& E) I5 f} * t7 i% r' r/ c$ r) i& E, q$ t& E0 g

    " n# A7 P  W- x- I' V9 {$ h4 v! P显示链表) f) |# A& }8 p+ J
    + U: [  D% y" T8 D# l4 f) S. w
    void LinearNode::ShowLNode(){, T% y6 d( j5 E# P* h/ d% @; t/ x, F
        if(NULL==(HeadList->next)){; i; g3 {% ?- ~
            cout<< "无节点"<<endl;
    + |: D$ n! l# N$ Q9 K3 r3 T" q        return;
    $ J/ s, I* ?; L" e% ~4 ^; O    }8 Q" e2 Q5 o+ t1 n6 c
        Node_cur = HeadList->next;
    9 E. ^7 t3 ]+ r' m3 Q/ h8 ?3 Q    while(NULL!=(Node_cur->next)){
    8 h9 _: `' i$ L0 S* p; x2 `        cout<< Node_cur->data << "   ";! X+ _. ^! g+ n
            Node_cur = Node_cur->next;
    ) p0 v9 x1 J" v2 L! Y    }
    # j/ a; ^3 u9 p9 J- f' Z6 w    cout<< Node_cur->data << "   ";
    $ W) F9 ]- C, T    cout<<"链表中的数据已显示!!"<<endl;
    9 o/ Y- r- f; M% u( C0 A! A}! C6 Q- b& A0 }$ {9 I: E- @
    7 h/ Z8 g! |+ p0 H6 X) A0 b
    销毁链表
    , K. `9 [( p! M# p  R# _% t/ U8 J( ^0 E9 T& l2 L# q1 F2 D
    void LinearNode:estoryLNode(){' L8 Q# J- Y& d1 E' W. t
        Node_cur = HeadList->next; 3 l% n1 \7 a8 V3 C
        while(NULL!=(Node_cur->next)){* Y7 v! Z6 |# C" B  b+ N
            Node_temp = Node_cur->next;
    & r4 y7 z& v/ F; [2 k. e        free(Node_cur);+ B( e5 y- c2 I4 b% v" q' m
            Node_cur = Node_temp;. M0 F' [! _( d5 w+ l. {
        }
    0 Y* @/ L2 q# a; x    free(Node_temp);
      T) W5 N* D5 A    cout << "数据节点已完全释放!"<<endl;
    + {6 L. Z+ L  K  I    free(HeadList);    // 释放头节点
    9 A  ]! H2 X0 z; V    cout << "头节点已释放!"<<endl; 6 S( `4 u0 x" r8 R; H! q1 Z! `' U" m
    ————————————————
    ( {, x/ H9 W; X2 ?& `7 N版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    # G6 I2 e$ t6 E原文链接:https://blog.csdn.net/Baimax1/article/details/1060362865 n( S  E2 ]8 ?3 Y( X6 G6 d/ P
    1 V0 B5 V  L% \8 E0 j
    2 t# }3 d7 s+ r8 w& [' c9 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-9-9 16:45 , Processed in 0.475489 second(s), 51 queries .

    回顶部