QQ登录

只需要一步,快速开始

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

    : A  N' F* o! L! m8 x线性表顺序表示、链式表示实现方法及其异同点
    , Y" ?! b& [; l/ S5 {$ ]# S线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。! H4 }5 Q5 H% N" u  P+ [+ @  w% k

    " K* n+ w- v" U4 l: l) x本文采用C++实现两种表示方法。! p1 M. d: V& j) d: F( J$ c: ^# u
    + j- j5 U& a1 [4 C0 C
    目录
    1 a, G7 }0 G3 O, D( `
    9 {/ k1 y4 \- `顺序表示和链式表示的区别:) X, t( Z9 I" s6 d& S  U

    $ g: K# m# W6 b创建方式:! z) z& ^, x+ z/ M0 x7 x% R" Z# d/ c5 s
    ; H; h- z7 f, [% u' A8 d. U! C8 F2 z
    时间复杂度:3 o* G& ~; X; \- H3 L: _7 `  E& d
    $ d/ n0 Y/ P0 \/ \
    顺序表示和链式表示的相同点:
      K9 `3 s* D8 c4 ~" d7 G: J. r' k
    删除内存空间:
    : e/ }5 A) R2 ~* `3 T, x; _5 Y, o/ H0 C# O; l0 M+ q
    代码实现:
    + q8 J! {% h3 U- W* m& R3 h
    6 V& p5 k* s4 y+ z6 ?$ Z* G顺序表示方法:7 \  B6 p2 e+ q$ b' P& }. L

    ; u: w* j- Z! P结构体定义5 w) G* j- t& t* @: ?4 `

    * A; \+ L1 o/ b5 a" a初始化- L1 [0 H, X8 y. d* Y0 {# R

    ) m! ~3 ?0 U2 ]6 d* _增加元素) `. }4 l( j* W
    2 Q9 @  u( L8 a
    删除元素
    9 |4 w/ z7 O% @$ x  f2 d
    : \  t5 M& b6 @! ]# }7 h8 w( f销毁列表+ q: `1 f6 [! Y9 h5 T# s3 Y7 L

    " K( v" n* \5 F: x" C) P8 Y链式表示方法
    ' d1 ^7 r3 Y, r3 r& @
    $ ^, t( {+ |" Z& @结构体定义
    * _4 _  |$ C3 O. S* y: f' i4 \
    3 y& ^/ f/ E+ D; J4 l+ s" M初始化2 e* f0 E" j6 e

    3 [8 U8 K) v8 O* k  K0 r2 P. O增加节点4 d; k- `6 u+ k9 D' O3 W1 d' p9 o( I

    & p* n% l* o% }删除节点
    + T: e& T) \) w% c; s. x, h* ?4 ^3 u0 F/ q4 O) W  m
    显示链表
    6 ~& X2 |0 ~0 z; e8 L4 }8 b0 q
    + G  U- ?) a" @* s- Z销毁链表
    8 l2 F) |. o/ s6 N$ }, \3 Q! q8 ~0 r
    顺序表示和链式表示的区别:% r+ l5 d* @* @* R5 \: g

    $ M8 a6 b9 D" y7 `( ]创建方式:  x7 u( A) [, J) i
    . q( e, m" _4 Q  n  ~
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。+ R0 G+ K7 f  k- \
    - N6 u, p4 b: T+ `, @/ N& J+ H& ?
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552): A) T0 n& H* i( t  T

    / I3 Q9 ~0 o* t* Q/ p6 ~+ r8 B0 Q链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。" r; {8 y1 a2 B# M& z. m8 `

    / j" V: J. a/ Y$ X0 X4 Y7 [时间复杂度:
    ' G5 j, p0 t$ n/ o5 x9 q# ^/ d$ Q2 k$ t
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)% e% B" S2 Q( H) V

    3 t! c6 _# o' o1 b( g. a增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)* T) o) {; f; D7 Y" M2 c6 M

    / M8 c/ L# Z" S8 Q) C! aPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    ; ]' z/ M5 O& P( B
    7 e0 O2 F+ B" V. Z' d0 A& L1 U修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    % A9 J/ o  P9 }; g
    2 @6 d: d+ i) Q+ V查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    $ E) e/ O( Z8 V' Z4 C8 e; E; n' P3 i! D: s, K3 J
    顺序表示和链式表示的相同点:
    " g  y( G/ t' w3 I& P$ |$ {# j5 q
    0 ^, h1 v8 _, H删除内存空间:
    & g6 Y/ a" M# k5 \6 ?4 x# [% U- _( u3 N. m1 G- w( T$ n3 T" ^' [9 K
    内存空间的删除都需要对每一个存储单元单独释放空间。1 M4 A; t' v( b3 S8 S

    / V2 L+ R0 k6 k8 ~2 l8 F+ K' B代码实现:
    9 A5 C9 v. ?8 X7 {1 p" P+ g3 K
    8 ~; M2 @" w" D8 C; J顺序表示方法:  r3 Y. a5 z" B) G7 B+ ^  f
    8 t- c: d( y% J' u
    结构体定义
    3 i, ]# v9 M; x
    # {4 m) `. u5 y" J; jtypedef struct {
    1 o+ t" [9 {4 j' h, N1 n    ElemType * elem;' ?* t6 k  P( v/ w3 V- v
        int     length;        // 线性表的现有长度
    % o0 d- s: ^7 Z' `  n8 e    int        listSize;    // 线性表的最大长度
    % \+ J- z( J& Q}SqList;, ~0 Z6 M0 `: @
    - O0 s4 B, c/ T* L
    初始化
    / F( @  i, B9 q7 E& }' T/ U* h- e( U7 X
    void InitList(SqList *L){- a, e- S; j) D
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    * Y4 S- X( z1 ?, @7 J8 j0 y$ c4 u- c    if(!L->elem) {5 C+ Y& Z% ^2 G) T7 _3 T8 v5 F
            cout<<"申请空间失败!\n";
    , Q+ |) |6 {1 E3 J3 E- I" Q6 Y        DestoryList(L);" O% R; w, N7 M' f
        }
    ! g* S- X, ?* ]) ~2 h    L->length = 0;- R/ b- L8 z; a$ K) J
        L->listSize = LIST_INIT_SIZE;
    , w0 m4 X% a! w. {# ]    cout<<"线性表初始化完成!\n";, D5 N: l# _6 t& n; j6 D* N
    }# G1 k. ]+ a& A0 Q( M
    - ^" T: a' x* X* E
    增加元素* L* W  [( b$ j2 M

    $ A* J3 Q. ^6 M& ?void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素# l# m4 Z; u# H6 a7 l
        if(L->length>=L->listSize){- x9 i2 z$ Y" ?6 K# V3 n& \4 c
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    4 s$ u4 J1 {4 f1 @6 V# B" q        if(!L->elem){
    3 C0 N% r! X" R1 {$ c, d            cout<<"增加空间失败!"<<endl;
    5 C$ Q) u. R) x. h            DestoryList(L);
      Y. M+ B1 x& l( {0 @, I* g. S        }$ K% c3 Z2 u& {8 z8 }5 m
        }
    ! I' _, f4 B  g    * (L->elem+L->length) = e;
    2 ~. U; w. p. j9 M    L->length ++;    , i7 G  ]0 W; Y  P0 f$ p7 h
    }
    3 D7 Q# a$ f1 A5 b7 o. R, @
    9 b2 c# Q. Y9 F2 j% Ovoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    / z: P, H8 ^1 R! ?    int i;
    * c7 _/ A! p5 B- o& j7 C* E; B    L->length++;
    3 g6 L: n6 z  R" L& j  o    for(i=L->length;i>=e_where;i--){
    # u7 R: g/ p+ `  y$ n% n        if(L->length>L->listSize){
    # R) i$ K! G% X/ P            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    3 \% N, }; Q9 I! I            if(!L->elem){
    ) v' p. n& z" v0 y                cout<<"增加空间失败!"<<endl;
    9 [1 x% R6 X- E1 X. ]% R6 L5 l                DestoryList(L);
    $ Z' v3 V2 X% D' w            }
    4 v2 p4 u7 n6 G% h5 n  P+ y+ M        }
      u# {$ }0 T! p; t        *(L->elem+i+1) = *(L->elem+i);        0 O' J# {& J% ^; Y2 m! J5 L
        }
    ; [" n2 _' E* o, t! |+ d    *(L->elem+e_where)=e;" Z( c' L& V- v1 @4 U
        cout<<"增加后的线性表如下:"<<endl;
    + O& ]9 O& u/ J* _' [: @* P    ListShow(L);/ [, R2 C0 X) N. R( }/ J
    } + V5 V+ x+ S5 j  z% C- d# n7 \
    7 Z! t2 N2 L4 }  Q& D/ g# U% ~( x+ k7 I/ B
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    $ G$ ~$ o* n* @) }7 @0 \5 q    int i;
    4 B  Z) T( i% E$ a# h    L->length++;
    , w/ |0 f1 F; U' ^    for(i=L->length;i>e_where;i--){; J$ n$ W! Q5 j7 v2 R
            if(L->length>L->listSize){/ j2 ?9 P) [$ {4 x
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    $ C3 n9 Z: k# w            if(!L->elem){
    . R8 s! O( Y2 L, y) R, `" g                cout<<"增加空间失败!"<<endl;
    2 s- W' _) H7 n                DestoryList(L); ( ]& a) t/ T+ }6 b* w) y
                }
    5 U; C* E' }( ^# D5 E, S3 x" d        }
    . `/ d" K1 [4 @( R' n+ i, p        *(L->elem+i+1) = *(L->elem+i);        4 ]6 j3 Q0 `; J4 Q% S( [
        }
    4 C& R# ]" `; K    *(L->elem+e_where+1)=e;2 l6 z8 Z6 N4 [
        cout<<"增加后的线性表如下:"<<endl;
    ' y1 Q* W; E* t) g3 `: ^    ListShow(L);
    0 J5 I% M2 @) L( h# y}; N6 r5 {; W. {6 W2 b
      b5 j: ]2 b; Z; t( n, P+ z8 ?
    删除元素% Y  J6 E5 i" J% a& C

    7 `" Y8 G# a  Z+ hvoid ListDelete(SqList *L, int e_where){    //删除某位置元素
      o1 `" Y8 [: m# L    L->length--;
    4 n$ \. n2 j, y) s/ ^) e    for(int i=e_where;i<=L->length;i++){
    ) i4 I/ D6 c! o5 |5 F        *(L->elem+i-1)=*(L->elem+i);6 x& G1 z1 o$ z4 W3 p& G8 ?! K# a
        }* m; p9 V' G1 ^7 T& G
        cout<<"删除后的线性表如下:"<<endl;
    ) D" _6 N- X' v( N; n. X9 ?    ListShow(L);' y5 `7 F2 A+ S+ z1 x0 k4 ^7 Y% e! H
    }
    . \/ e7 a! V' O$ j0 {% [" R6 J% ?+ @3 U. c5 v! J2 j
    销毁列表
    ( E5 r" C9 T6 G8 T4 Q, ]' ^% L3 q6 T
    void DestoryList(SqList *L){4 r& m2 a" }# [, i% L
        int i=0;
    / q/ ?5 P; j# k" Q! ]  P7 A    for(i=0;i<L->listSize;i++){
    3 o# s( m# W. A* t2 p        free(L->elem);
    7 i3 @: V' `! S, q+ `- m4 y        L->elem++;
    + N& b* U: d( w4 `! O    }
    ( ~: d8 W% k+ x3 b6 b    exit(0);        " ?, g! l8 e- J9 u
    }
    * Z# f" A. n' `% E6 v. A. i  Y
    # f, N! E5 |9 D+ L4 \- P链式表示方法) U( z- O8 h; b( f
    + q4 }) [$ [+ e/ E" z
    结构体定义
    2 u  D% ^- n$ o" X7 ~9 t3 B* E5 Q, S/ g% M8 n
    typedef struct L_Node{3 q( \) R3 H; Q, t  O; m# I
        ElemType data;( L0 [. T5 a6 F2 E4 |- a
        struct L_Node *next;
    5 {- O  K- W6 e    //struct L_Node *last;    //增加可变成双向节点
    , W) f! v2 ]* M/ T}LNode;9 V( U. n4 J3 K3 d0 i
    5 q" x( O* |6 q" Y8 G3 s$ P
    初始化- Y4 {  y6 o7 q: x
    8 D6 s/ f7 b0 p3 m" ~2 d
    void LinearNode::InitLNode(){4 Y1 r4 n! W. E( g
        HeadList = (LNode *)malloc(sizeof(LNode));
    ( C  O9 S7 \0 k    if(!HeadList){. p3 K: f; R5 l: h
            cout << "初始化链表失败!" << endl; 0 `1 M$ k7 e9 e- }9 D
            exit(0); % k  C4 x% s- N9 S6 p' B5 F2 R( ]
        } 2 F% r' r1 b; k' {  z
        EndList=HeadList;
    * p! _2 D* ?0 M( k. l- e    HeadList->next = NULL;6 r9 M5 x, J$ c' F9 F6 \' I% K& ~$ h
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;* H/ \4 c: r- n3 V9 k2 z
        Length = 0;
    4 o( [1 y9 w- `4 I4 l    e_where= 0;
    $ O# ?, }  z( m2 f" A6 j# ~}$ r& u6 y* y& O+ _3 a7 v: a

    . ]. r! @4 j) M. I. _- @5 F7 o增加节点$ X4 s6 p8 |3 k! P% X
    & P7 X% X' a1 |% m* Q9 i" w
    void LinearNode::AddNodeHead(ElemType num){    //头插法 2 v' Y6 F: a1 I2 ~
        node = (LNode *)malloc(sizeof(LNode));
    8 z6 D/ S; h# |" u' U2 q  _    if(!node){
    + Z; V! F$ [8 w  H1 c% |        cout << "新建节点失败!" << endl; 6 z  e4 F7 q- ~+ o& {- f" {" g3 c2 V
            return;
    0 z4 S) [4 Z6 T/ z$ T    }
      b; S: p. I6 k1 U    node->data = num;
    & Q/ v# A9 d$ u) m5 }  M8 Z( a    cout << node->data <<"   ";% y+ l. U3 K7 p0 n, z# O
        if(NULL==HeadList->next){# d4 p' n' `4 z
            node->next = NULL;
    ) ]# G3 Z8 Q, L; @) o! m        HeadList->next = node;5 m# D- w2 ~( q* b* C  P4 U% c
            EndList=node;/ i8 R1 U8 R' b
        }* C: X( b; }$ W6 r& P% R4 P8 G: y1 p* n$ l* K
        else{4 J# ?6 ~6 Z/ S
            node->next = HeadList->next;
    + b: N/ h2 v$ t7 Y. c        HeadList->next=node;  V! l5 M6 O7 j  R
        }8 [% l$ e; p; f
        Length++;
    ; I7 L# P0 S( S* G}
    3 f+ U6 b! }  ~7 R0 y% M3 g+ u" R) U) J/ Z
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法 ' o! F$ p; S" h+ U1 `7 e/ {6 T
        node = (LNode *)malloc(sizeof(LNode));
    5 m( }: n3 x. J# |) h  T    if(!node){
    9 f+ B/ B( J; B6 r        cout << "新建节点失败!" << endl; 0 T; i, @2 B& b' ]2 z' m! w* V
            return; # n, u) j8 j8 S* w
        } 6 ]# c6 x1 w2 X6 F( S) O) g# |
        node->data = num;, B6 M! P1 d9 C0 o  d# \- p
        cout << node->data <<"   ";5 s( }/ s! Z4 x* `; z1 S/ ?6 o+ Z
        node->next = NULL;
    2 c* @% W# d) B) t    EndList->next = node;
    ) r; W% w' p- K9 G1 I3 Z8 v    EndList = node;' P: n- ]& q0 D1 u
        Length++; - P: O. A* r, s) u4 w' a4 n$ v
    }
    ; M( e  o" ?$ {0 N
    3 q- e( Q' U- S删除节点: |  K% q% _2 l3 Z% Y
    # \. x& z7 j# U' Q; O9 W
    void LinearNode:eleteNode(ElemType elem){4 S  ]0 I8 n( q! B8 |  O& n3 |3 B
        if(NULL==(HeadList->next)){$ g. Z% a) Q# R" P; |
            cout<< "无节点"<<endl;
    0 s% d8 Z; ^3 w" m! ?; k& E        return;
    # W+ ~7 c( E6 e* ^- a: ?3 d7 _% u3 }    }
    ) a8 j& ]1 j* F. N3 V& q) {! `    Node_cur = HeadList;
    4 z4 P9 `8 q" ~3 i3 u    while(NULL!=Node_cur->next){1 \, V/ J$ ~+ D: X6 V" w0 |
            Node_temp = Node_cur->next; 4 q: N" W+ I, l/ O! v
            if(elem == Node_temp->data){
    . S5 o! o- D- p& S. g            Node_cur->next=Node_temp->next;
    * G+ t1 C4 Y) p! H            free(Node_temp);. R& L5 z* ^4 q+ D/ h$ ?: d0 p
            }
    9 b" U/ I1 w. J2 }: W        if(NULL!=Node_cur->next)6 i- f4 @% C) |
            Node_cur=Node_cur->next;6 F" x1 x: A* X/ X
        }( W+ I! v+ f, w1 u% p) W) Z8 r, O0 b5 G
        cout<< elem <<" 元素已删除!"<<endl;
    7 h# }* `- t) N" @0 }: t: }} ; m' z, o' M# e1 B8 z

    5 O- y# O6 M7 {  N9 }4 G. Y% t显示链表1 `8 S: c: t% a, C6 h6 v, v
    # t5 j* W& G8 r
    void LinearNode::ShowLNode(){4 @7 D2 I2 ]+ d7 {+ F
        if(NULL==(HeadList->next)){; y( \/ }& \; B/ u
            cout<< "无节点"<<endl;
    , s7 f, x+ B0 C        return;
    6 u8 g$ S4 l# n( B8 H. {( E    }
    % K$ G! `+ I& n7 Z( M; d    Node_cur = HeadList->next; : v! N1 [( Z4 f+ z
        while(NULL!=(Node_cur->next)){" A$ r0 a( D2 t9 K* O$ _' z8 p5 N
            cout<< Node_cur->data << "   ";
    & N2 g; E: j, e4 G1 n% F( O3 S0 r        Node_cur = Node_cur->next;8 ?6 c! W4 M& o
        }
    * |$ |( w/ e1 ~. w7 [' ~* [% e# w    cout<< Node_cur->data << "   ";9 g% [% b/ m6 v/ Q! n. A& z6 V- z
        cout<<"链表中的数据已显示!!"<<endl;7 s" d1 n& Q  F
    }
    ! y! F3 e4 m( E! V, v. x6 y3 }2 s3 z$ j
    销毁链表' R% [! M7 i- |2 N% A- Z( n$ Y
    # n6 f2 ~' }2 T4 A" G
    void LinearNode:estoryLNode(){4 B  S  S! B8 k  y
        Node_cur = HeadList->next; " v/ |1 |* Q) |) Y! ~. `
        while(NULL!=(Node_cur->next)){# Z' W; Y2 e7 u" M9 n
            Node_temp = Node_cur->next;4 t4 O0 o- L" V  \5 R& O
            free(Node_cur);
    . h6 r$ _- H. l. I        Node_cur = Node_temp;: `& u" f, T4 F% s4 X
        }
    : }- `  ~1 `& a5 [/ n8 x5 v5 c    free(Node_temp);
    / E( T" c+ N& [- n    cout << "数据节点已完全释放!"<<endl;
    & ?, ?# r& U, v. p    free(HeadList);    // 释放头节点
    - z8 F" e. Z& ]6 B    cout << "头节点已释放!"<<endl;
    1 V8 O5 I% U, O( c* Z————————————————
    8 d* @7 j% k. t  h. ~$ F' r版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 l* Y& T! O& \
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286- x+ t$ ]; \7 p5 ]8 w( W. j# g+ P& p
    9 p. T) E8 Y& b* G/ x$ C( G$ k% z/ X

    ) T. U6 y1 J5 m! ]' {
    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-7-30 21:11 , Processed in 1.498776 second(s), 51 queries .

    回顶部