QQ登录

只需要一步,快速开始

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

    - Z- \3 j. S  Z) d线性表顺序表示、链式表示实现方法及其异同点1 k. ]! I+ [' V8 a: X5 w8 \# X
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    ; O' x% T3 r4 s* |& t2 [
    . }# I3 z5 l; {( P本文采用C++实现两种表示方法。" m9 Q' z6 P8 E  d5 D+ h  y; W  @
    * L. b4 q2 m; M6 q, T3 ~- Y
    目录- g! |4 ?% R0 B) Q1 W/ w8 K6 K( E

    + I2 k" k  X/ i! j3 D; J顺序表示和链式表示的区别:
    $ j+ d' Z! q2 I9 X* J5 g6 ^  {' L" l) g
    创建方式:
    ' q9 I  V& Y$ O  z( |
    : _# o# k+ ]* r  M, u% U5 }时间复杂度:
    - C' G9 c  L, ]( `7 k7 O2 F2 Q3 ]: D$ m
    ! L; K7 k5 {6 ^顺序表示和链式表示的相同点:5 P+ ~2 `1 l* {. q4 t. L) Z
    ! P5 a' I3 {2 {* b0 A" k; I2 @
    删除内存空间:) V9 s! Q, t' s
    0 f+ y' }' V4 f, G
    代码实现:0 I: U* m# B! d3 f. {7 J) z7 V2 Z

    6 G  y. G+ U5 J5 N; `顺序表示方法:& o- }; w4 E1 ?4 e* q8 W1 D

    $ j$ E+ k5 f  j: R5 f结构体定义, ?- [) ?$ Q4 ]( u7 D, t$ k/ J

    + j# d# p, D% Z6 p' N# d初始化
    + S$ _" B4 S8 s! A
    * H8 r# d1 x5 W( s# }* k6 r增加元素' i; `2 b/ j, F" F3 `0 I
    1 F! c4 u4 {4 h6 J2 V; M* q
    删除元素
    . W0 s( G# A. t( n/ t
    . V) d. \0 K( l5 m  U. J5 V- R6 ~销毁列表
    ; B7 K) o! c8 j/ k  O5 |) J8 O$ C! H  w- f$ t( r( W- p
    链式表示方法
    . r5 _1 n- l8 D6 g$ f0 \8 F$ Z4 I4 w2 a4 U' A7 L: H/ z; ?
    结构体定义  u* N- W# m$ U, `

    ) K4 t1 h2 P7 N- h初始化
    2 Q' a" g+ @' _: P3 b0 @: k0 U1 p& v1 D% [( a& e
    增加节点4 u# y* L' x% U8 M4 ~

    5 E  w/ O9 _: x. w" T2 Z删除节点
    $ c& o* p* j5 g" a6 e% |- o9 T7 j. J! g
    显示链表
    3 l; m2 n# a9 @* U
    + G5 E  {* V6 \, t销毁链表  F3 z- \7 i" s/ G

    ! [9 b* s: i0 q4 Z- m顺序表示和链式表示的区别:
    7 ?! b0 E; y0 M; {3 W' \* V
    ! G6 K6 ~7 I% V创建方式:
    : M  y7 c: c* M9 {" m! }5 o+ b+ b1 C5 o# j, f) z* k" o
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    9 N9 @6 a* ?2 A# z5 X  |7 q* S8 O: r' T6 x, v  U4 K: W5 m3 Z
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)) T; j3 b: l3 i7 }4 t) F9 d& c

    # D. Q1 _5 H6 C* P' ]& `4 R7 b链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。; C3 B( W: T9 M, W/ m7 L" k
    " m+ P) j" B% ]- V# K+ |) v. ^' T
    时间复杂度:9 ^5 K% h) J! V$ s% R7 I
    6 Y7 `" H) x4 w( x
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)( r# f* |3 }. c% p. A8 w  b

    " y8 ~, m8 V8 t: P% \8 J3 `, L1 R增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作): I; y8 A4 v3 @

    " n5 B- K5 ?8 x0 w  D: J# |PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。7 z( ~# y% B4 q; I( @/ i" Y
    , {5 D7 I6 T/ O3 J4 e, G
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    ' M; f* A' k& S* V$ O# M' ~5 x; ^  ]5 _) y% i) H2 ]1 y6 M& z
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    7 C! [; n& N2 X, n2 U3 A! s+ k* m) I' B, W$ ]2 O
    顺序表示和链式表示的相同点:0 E9 I/ Z- u2 Z* q! `5 d
    $ L  Q& R3 I* P
    删除内存空间:7 U  v* a- ?5 s1 z$ X( \% H# ]0 q( Z
    ) x: m* o; P7 A2 S
    内存空间的删除都需要对每一个存储单元单独释放空间。
    + u( D4 E4 p" Z# l- p& |
    6 Q8 U# v  g6 }3 C6 _, |& e代码实现:5 {# M+ a) J) m) c+ |) @, X
    2 ]. a' I. X6 v
    顺序表示方法:0 H# T; q  B* u  X; s6 D

    ! E8 U; {. ?2 o( F) z/ N* P5 O结构体定义( N/ o* u! X- k+ Q

    # J( m6 `: Y' {! m1 ptypedef struct {0 {' H0 B7 U7 L- @* S0 H; s
        ElemType * elem;
    % \  H: D1 O1 b8 v# N    int     length;        // 线性表的现有长度 1 @! _0 c$ |; j; l' o
        int        listSize;    // 线性表的最大长度& V) p* L: u# z( S: w$ @6 p2 ?% G
    }SqList;6 z9 g8 }# u5 m

    6 n6 e* m5 [, [% j6 L初始化
    . E% R; x0 p5 W! r  B$ f% H7 `" r3 {1 I, o
    void InitList(SqList *L){' C: a* E; U8 @, N( H
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    " p0 n$ _9 t6 f, p8 `    if(!L->elem) {
    1 ?/ O7 b' w9 V& D* g8 a9 d        cout<<"申请空间失败!\n";
    ) H' A* b1 i6 w- ~% _. G& ?. @# q        DestoryList(L);1 q6 U$ V) x+ D% C# m( z* f
        }
    6 O2 v9 V8 q* z5 Z( U( L    L->length = 0;
    & a6 s1 B" ?4 j; q7 q    L->listSize = LIST_INIT_SIZE;: G: {( N1 r2 v
        cout<<"线性表初始化完成!\n";) b  f6 C1 k% d( \! l
    }1 M) G  ~# G+ {( G; h* G, d; f
    3 ?# @0 ~- w4 a* e, I
    增加元素# K8 ^; Y/ b" ~' ]$ q  C6 R

    . ^8 l* @9 q3 T- U2 I2 gvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
      a" Z# T. _  O5 G5 w    if(L->length>=L->listSize){  a$ k" @0 [! [( x! V1 {! x
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));% g( {  ^7 b5 B, j; ]. }
            if(!L->elem){
    + I! u: W/ j3 g# [" t' M            cout<<"增加空间失败!"<<endl;
    - N8 S$ F3 V2 X            DestoryList(L);, m- t' h3 N* B: d
            }
    . x2 d8 D# }* C" n) S# u' P9 k, o2 c  O    }
    / E: _# i  R1 [$ E- N0 ~- J    * (L->elem+L->length) = e;
    . L! [# P5 z/ a: v$ f$ I    L->length ++;   
    ; H. o( s1 O1 B2 J- A}+ V6 h+ ?3 X& l' K% u
    1 Q$ h8 o1 Q/ S  Q4 P. l
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    ) o) x7 }" A7 a5 o( O5 e6 W$ p    int i;" y" ~' ]" N* i8 J/ Z; ^
        L->length++;3 j0 U9 e9 `: W  ]4 w" [6 K
        for(i=L->length;i>=e_where;i--){
    2 v' T; y6 d* `2 X1 B& c0 ^        if(L->length>L->listSize){' L7 i" T3 Y. C3 J* K* _$ a& V
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    * R: W* q- l$ b/ i6 ?            if(!L->elem){
    # Q& |' x! ]; ~) r4 p                cout<<"增加空间失败!"<<endl;
    / w. g# ]- p+ U, u% u$ K6 D& e% E                DestoryList(L); * e( P2 g$ q. a' V( {3 k% X% F
                }
    9 n% O5 {  _: D. J! y4 J+ H2 f        }9 L1 O. \) Q5 E* h5 F) ?; W. h
            *(L->elem+i+1) = *(L->elem+i);        ) s9 k; o- ^: c: C; Q2 g
        }. b- r. l3 O2 x8 c/ T$ R
        *(L->elem+e_where)=e;0 c& I4 m+ B  N4 I. I5 M# x
        cout<<"增加后的线性表如下:"<<endl; 7 c3 O& b+ a6 Y6 @# B% H$ w
        ListShow(L);
    . c7 F1 \; `  v1 f4 r$ r5 o2 B* {} % ~7 x0 V+ s# r7 u3 D( G
    6 _6 b+ b2 h; u
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    * t3 i, `* G! r1 h- p    int i;
    + ]* y  A$ d" z% B8 g4 h9 h2 r    L->length++;) H) w, _6 l! s0 @' Y, i4 E4 p8 o
        for(i=L->length;i>e_where;i--){
    7 }  F4 ]* V2 T        if(L->length>L->listSize){% p  M. V0 f) P5 d8 B2 u
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    5 d3 D$ q: b4 h* N2 G; R+ T% [            if(!L->elem){* x3 _: a+ H: e/ ?
                    cout<<"增加空间失败!"<<endl;& w! S: |- O) M4 @/ _" T
                    DestoryList(L);
    8 T  ?4 m$ B. b8 B  P            }
    9 n4 g1 g1 \$ V        }
    9 p6 G$ @7 Q  Q" b. t1 b/ I1 A        *(L->elem+i+1) = *(L->elem+i);        . \7 U  t, ~2 H, b8 K
        }5 \. T! j2 j6 I1 b# H' _
        *(L->elem+e_where+1)=e;
    ! K/ H( @1 l$ Q- [* y    cout<<"增加后的线性表如下:"<<endl; ! v$ S: g, ]% c) d# s+ m
        ListShow(L);
    * j& I' @; d) b2 W; y0 E$ ]9 }}* i  |6 p1 _3 s
    # Z3 a/ q& a& ^* D2 q
    删除元素
    8 X! c+ G1 S0 i; l0 e* L5 U
    ( R# Q& D# o$ Lvoid ListDelete(SqList *L, int e_where){    //删除某位置元素
    " m" w; }4 K: ~% @% i9 i8 p( M    L->length--;
    0 y9 ], Z$ j+ e, g* M: e    for(int i=e_where;i<=L->length;i++){
    6 |8 G% z9 M+ l/ P        *(L->elem+i-1)=*(L->elem+i);# y2 y) v$ w8 J; p
        }
    9 [* F) R6 a& g$ [    cout<<"删除后的线性表如下:"<<endl; 6 V  J+ g8 b( H# m# \! k, I4 ?- U
        ListShow(L);  \# ~" b" I( X' W
    }
    5 j8 l, `+ R% Q1 y) r4 w' r2 [* r  I0 b4 b
    销毁列表
    : Y* o7 U: k6 @2 L8 N3 U9 V/ n
      z6 E+ m& s5 P3 i; ]void DestoryList(SqList *L){
    7 ?$ O: u4 v5 v; Q7 j    int i=0;
      q- M- I/ m% V# u0 d    for(i=0;i<L->listSize;i++){
    7 ]; z, B1 A, `1 t( g        free(L->elem);0 P6 ]" n8 s' A% E( K" |, \3 p5 T% f8 x
            L->elem++;
    ! _% S2 v2 ?* ?, K    }: ~# q/ w* R+ ^6 j4 f/ @. C! [: ?
        exit(0);        
    2 P9 V& _, k5 T* x" P}
    2 H; a3 r. `2 h) e7 ^" i) O9 f' B) i- ]) g
    链式表示方法
    ; N+ L, u% ~0 e4 s
    & V$ D: g2 \- `: ^结构体定义
    1 }3 G7 y3 G4 i' R/ H! z' R# J2 ?! u; v8 G' H
    typedef struct L_Node{* S! i6 v# }/ ^  {
        ElemType data;
    . o% Q' g. z1 k    struct L_Node *next;
    7 n) N* B. g4 Z( J5 U$ H' n7 B    //struct L_Node *last;    //增加可变成双向节点
    + A5 P8 H2 d3 V}LNode;8 }' z5 d. D3 v5 @
    7 S, }6 g; G/ ~! P/ x, ^
    初始化
    2 k' [6 T' E. \3 d9 V) {5 L# O  z0 {" d% P
    void LinearNode::InitLNode(){
    4 Y0 k! I# Z* [/ [) ?# ]8 ]5 I    HeadList = (LNode *)malloc(sizeof(LNode));
    . R! x, `1 o9 I' j' p) l    if(!HeadList){5 ?# X+ f5 [8 }& Y
            cout << "初始化链表失败!" << endl; $ A. L- f& V' P. s
            exit(0); ( l" O, i1 x. Z4 B6 H+ `
        } $ i% ~& f( Q5 R6 B5 f6 f& M
        EndList=HeadList;' l5 Y( j3 l$ U8 |+ h0 Z2 s/ L
        HeadList->next = NULL;
    9 q+ d4 p. a, g( X: D    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    " ^8 `* W5 Y/ x    Length = 0;" s+ E9 a+ m& p6 G# t' _
        e_where= 0;$ N9 K! w; f7 `4 p6 B
    }! @$ g- V+ C+ g' `0 y0 K$ d
    ' y' m+ p5 t! ^* P5 M  G6 o
    增加节点: v7 y/ j" f; K+ R1 D

    7 t8 U$ O0 H: T: i3 [' q- k; Pvoid LinearNode::AddNodeHead(ElemType num){    //头插法 # {& L# W! `+ Q- Q; v
        node = (LNode *)malloc(sizeof(LNode));/ s7 B3 q, d( O- s, s+ x8 C  Y- G8 E
        if(!node){
    & {3 _8 O( [3 k' h! G        cout << "新建节点失败!" << endl; & y- W2 Z* s" Y) q: U
            return; ' R8 c) y' B" V, s0 ?
        } ) N  G' m9 Y; X) Z$ e2 V
        node->data = num;
    # W# L+ ?+ s1 e: S" _    cout << node->data <<"   ";
    ; U9 L* }7 k) p( G1 R: Q8 Z6 h3 J    if(NULL==HeadList->next){4 S- }% J  w, @2 l
            node->next = NULL;
    5 {, P' V3 w* o- ]; g0 \! n        HeadList->next = node;1 A  n* S7 q9 r! C8 W
            EndList=node;
    5 z+ A+ w" q" W* Z* B    }# [8 M/ \1 Q+ Q* c+ K
        else{
    ) h' @3 q" v8 y        node->next = HeadList->next;
    6 p! P7 U$ l  z        HeadList->next=node;
    , b+ f, T$ }/ k0 w    }
    9 ?% \% x" c4 u9 k$ o: F    Length++;
    2 ~! V- `; ^9 d3 W3 y1 `}8 y& y# `" d3 t4 e! p! Y
    , g* Z  ?' Z2 K8 ]( ]
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    - d5 w+ K; q  ~4 ]: a7 K& T+ m    node = (LNode *)malloc(sizeof(LNode));2 A. E$ Z# c  a2 _7 q! o
        if(!node){
    0 [; z  c+ U3 a' t0 ]        cout << "新建节点失败!" << endl;
    4 n* p3 F1 e- `* L$ a( |        return; " P4 L' Q# q7 x1 o7 \
        } & G3 m$ C4 J" Y8 l3 a, H: v$ @
        node->data = num;# L! H# x* |  e! M* w. d
        cout << node->data <<"   ";; Q( u  k0 V- ^9 d  h0 R
        node->next = NULL;
    % O) H9 r" Q- G, A- T# k    EndList->next = node;
    - {7 Q- J5 _- s5 U    EndList = node;8 D1 g6 W  y) g7 A
        Length++; ' K( v" ~1 u  ^6 h
    }
    ) L% `: u# E8 Z+ V# V' j, Y$ J8 z  a( f' d9 ~. U
    删除节点& m. s: l* d2 J8 C" \) E

    * }- f! r1 l9 u$ Y) b: Hvoid LinearNode:eleteNode(ElemType elem){6 M4 ^0 t3 j+ S8 O- g) x
        if(NULL==(HeadList->next)){
    7 U5 E, P5 {+ {0 n5 L: k  c/ R        cout<< "无节点"<<endl;
    " ~' w$ S$ E& B. A+ F/ }( H5 h3 B# U) U        return;
      ^+ s) p' V$ H! ^3 o- q    }
    8 J/ V3 k: `. U/ B; i' Q    Node_cur = HeadList;
    - m2 Z9 m7 Q+ ~    while(NULL!=Node_cur->next){* }6 g, G3 n) F
            Node_temp = Node_cur->next;
    5 N2 E8 g$ |/ F5 v        if(elem == Node_temp->data){
    / g* L* m, e. R4 n; L            Node_cur->next=Node_temp->next;
    $ @# V! U$ |) X) k) y6 b! v* T7 K5 Y# k            free(Node_temp);
    3 y) I7 i: k1 f# M) q9 r4 Z        }, `4 z1 H9 M9 F1 w* l8 U: ^
            if(NULL!=Node_cur->next)
    ) r' c; s/ z2 [3 k' k        Node_cur=Node_cur->next;
    $ w4 T% ~# X0 ^- K! n+ l    }
    % T6 n4 f9 N7 t5 e1 a* J    cout<< elem <<" 元素已删除!"<<endl; # I$ A3 ?9 X( n4 @
    } ; \$ P, B" v/ N1 g
    5 m3 I% d+ I% B; A5 K* L4 v- g0 o
    显示链表
    & k& u9 D" t4 f9 X. y- N) [: u% }, U5 I
    void LinearNode::ShowLNode(){
    7 z* x/ W  G# D1 C4 V    if(NULL==(HeadList->next)){8 B: U6 c) D+ W. v$ v& K  H
            cout<< "无节点"<<endl;
    , E& r% {/ q' x% }        return;
      c4 l6 {; Z1 Z) F$ K" S    }4 f+ D& d0 M; z
        Node_cur = HeadList->next; % M/ p4 |* T. S/ s1 }6 k; I( m
        while(NULL!=(Node_cur->next)){
    9 w' J+ |  \/ m& G5 n        cout<< Node_cur->data << "   ";
    9 P1 ^/ e; L0 O* `7 c' ^        Node_cur = Node_cur->next;
    3 @' a$ t' |* l7 C+ ~' S! B    }
    0 T: G+ c$ ]% _" h% y  v    cout<< Node_cur->data << "   ";
    * K% y) B3 E: o+ @! H    cout<<"链表中的数据已显示!!"<<endl;
    , Z* J/ t, g$ a$ Q4 t}8 }; s4 V  [* P: D: Z
    2 z) y* R  W. `/ @8 s" x2 P$ R
    销毁链表% f. F4 l0 V5 c6 f2 g+ R
    ( c$ @# i5 h- c3 D# R6 Y7 Z
    void LinearNode:estoryLNode(){
    3 C% R0 P2 q2 k! Z& G1 Q    Node_cur = HeadList->next;
    1 o( r% k( F! A& e2 C" x6 V    while(NULL!=(Node_cur->next)){  o0 _0 a3 K: e5 D9 O7 u+ P2 u2 i
            Node_temp = Node_cur->next;9 w8 J) n9 Y! }+ g3 [
            free(Node_cur);7 b0 a2 p. P  G! f  o% i" F7 `6 h% ?
            Node_cur = Node_temp;
      F1 T) q( K# Q; a# X1 }    }& L. ^5 h5 w, P* c; E
        free(Node_temp);
    6 a% [3 J) K: N; T6 S4 k    cout << "数据节点已完全释放!"<<endl;
    ' X# N0 u/ D8 \% H  L* H    free(HeadList);    // 释放头节点
    + k% j' M, O4 y) G    cout << "头节点已释放!"<<endl; 1 o/ s# e+ y7 F
    ————————————————0 l! G: \* M& A5 p5 P* K
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; X: o0 |0 {' ?. J6 W# N原文链接:https://blog.csdn.net/Baimax1/article/details/106036286. K. `  _; A. Y$ u
    % u# b) y( |* t8 T$ q

    ( U' ]/ p( l5 f% o* {3 u. u0 M) V) m" u
    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-8-1 14:36 , Processed in 0.457202 second(s), 50 queries .

    回顶部