QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1416|回复: 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
    5 ]  n+ F9 L. h# ^- e
    线性表顺序表示、链式表示实现方法及其异同点# }9 H0 `/ |+ l! O! b
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    ; r$ K; Y/ B. G! N  P6 _- ^: C9 C9 ~
    本文采用C++实现两种表示方法。
    & Z3 w& W# F6 z) U- K% a: M) n3 t; v: w+ C2 z& P" s" ^% w, O
    目录& Z7 f- P- Z& n
    % r2 p( Z' Q: B$ B6 o7 f
    顺序表示和链式表示的区别:
    " w, z) j" N4 V1 @( u; R
    ! L! a9 [9 ~4 a6 Z- t# X& a9 {创建方式:
    - u. e& T8 S" v5 D  F2 ]- `& _5 ^; e& q
    时间复杂度:& t9 R9 T7 p$ X
    * M9 ~4 j' g; f3 n8 @: U& y
    顺序表示和链式表示的相同点:
    + L% Y- N3 E4 o1 m' C" N: p6 F/ z1 V" j% O) B
    删除内存空间:9 {. G' G" V0 b/ \) p5 ?' o
    / i2 o( h0 _2 T  y$ Q
    代码实现:' [3 |# V& j9 x) J9 W

    4 R/ X! D9 m) b9 {3 {顺序表示方法:
    . y& E) x+ q' \$ w, M, h, ^2 v5 H( c
    结构体定义
    0 d  p. S# @8 s" v1 ~% w& B7 o
    ! |2 c2 |6 m5 W% u0 [* s; z# `7 h7 N初始化3 {5 S+ @/ f# _( g% S

    9 e* z6 |# h, }" ?# v增加元素
    8 F% ^1 r7 i1 T* J% X" Q8 H. |" G6 j# h2 r# a, K
    删除元素
    * R5 M9 C; s5 k5 o/ ?5 _/ D+ n% |" X' S
    销毁列表
    0 v7 n0 n  g6 j: L2 s) T) y4 E% a8 K# d5 ~; d* J
    链式表示方法7 A! G, p; b3 Q. T& L6 S' y
    8 e2 u5 {: x7 r( D, m1 H
    结构体定义; c# @3 j6 U- z( E( h
    2 T. |; O! b, |9 z
    初始化8 G' `' }: n4 Q3 a

    # Z5 [6 P+ e5 H% g) q9 a; T增加节点
    4 P, O9 b: w1 `/ Z: z" C! ^, M# |
    % m" H% i7 I; q# Z. ?( G! v删除节点0 H, m# |* B7 W# Q9 \( [1 _
    ( @) Y$ R) ?# W; Q1 ?* y" R
    显示链表' E& ]8 ^* K: }- W' b9 g& b9 }

    - y/ B$ I: k( t6 {( V销毁链表
    ( x) U  C- ]! M; n) x, j6 D  |  I# G) `- j# f, F' F
    顺序表示和链式表示的区别:
    1 r2 i8 I+ Z' U1 U, d1 `2 b! ?# H* s7 U9 [/ h. O
    创建方式:1 T- q- r7 f4 C% E- ]6 p- @
    " m- p( m; p+ P- [' W
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。/ `+ Y* d1 ~5 I$ [2 ?/ ^, ^/ I

    6 K$ S, A0 O$ r(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    - v) n  B3 e2 L: t# K: u9 f4 y( |* q2 y! h$ E
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。& q, m% K6 K4 m2 t$ v

    * q% }9 }; L& b& z& L时间复杂度:- }0 k9 y) _- {! \% B, }7 L
    * T) d8 E/ M* c9 Z5 ?0 }  X
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    % j+ b* Z( ~( F3 C9 c+ H
    * Q' S/ F# ]/ h增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)3 Z, \* Y% _+ y  \$ J3 k

    : m0 q: g% o4 b# TPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。% R1 z9 f9 O. q" l; L3 K

    . D5 k$ ^6 B1 o修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);# l9 q4 }# Y; l1 q& w7 c

    $ o; Z3 b2 N  ~& c$ v查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);6 d, T7 z# [9 b- t9 [
    $ W+ d/ e# U2 U3 |) h# l3 ]) F/ J
    顺序表示和链式表示的相同点:* K, J7 w! Z7 b0 [& K! v! K
    $ `. f" s$ l4 K% a; ?) J/ i" G
    删除内存空间:
    ( M/ t& {' y; Z' ]+ p
    7 X. ~( j$ |; {内存空间的删除都需要对每一个存储单元单独释放空间。
    ( k8 I3 W: ?$ H& U
    . |$ }# t. f3 T代码实现:1 o5 s( O& S- k' T3 }& Q# i
    . z8 E% j* W* q' l) w
    顺序表示方法:
    ; ]( v7 [& n8 A
    & U$ J. _# u0 }# ]结构体定义
    / ]8 d& x/ Y! D8 u0 P7 {% p4 R7 P, W9 l- ]9 y& l7 K% |6 ~# k
    typedef struct {1 y8 c) S* V0 g
        ElemType * elem;! j, K7 m: F! s! g
        int     length;        // 线性表的现有长度 2 R  S+ v, P8 O5 c3 s
        int        listSize;    // 线性表的最大长度" q- p+ N$ L% ?  u2 c7 J
    }SqList;0 u9 k9 u# `, v8 z
    ! b9 _1 z9 u; Q& X
    初始化
    ) d& ^% F  |4 a2 Q1 e: ?/ o
    9 o4 J8 Y7 ]! f' ^( m$ m, A) e+ Ivoid InitList(SqList *L){
    $ d- Q3 O& g8 s    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    - ]/ b& |1 P8 z2 j1 g& J9 A! g    if(!L->elem) {
    " J2 t. F# a0 N) P6 z        cout<<"申请空间失败!\n";
    / q8 w7 V  s1 ~4 N        DestoryList(L);6 z: h) W1 r5 f9 ~; P9 Q/ C
        }
    " Z  h+ \* ?, A# i: t( j    L->length = 0;
    " D* W1 O( N7 S) O7 J8 u* l/ A    L->listSize = LIST_INIT_SIZE;
    , H7 U. c0 ^: ?* _5 o    cout<<"线性表初始化完成!\n";
    9 E; I1 ^; |" P+ i  Z/ n) m}
    " Q0 W6 a# Q1 X6 {
    ; z0 |7 f7 K* J3 P( X5 [& h增加元素
    2 ]+ X% q$ j; g9 b/ e2 s8 X8 s4 y5 A* |: w- z
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    4 Q4 z+ R! l4 S' O    if(L->length>=L->listSize){6 {3 o1 M/ e1 T
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));; [" z9 o0 X; a% @! C2 c
            if(!L->elem){7 L+ I6 W( l. V& @
                cout<<"增加空间失败!"<<endl;
    8 u' v+ Y* _: L5 H8 j            DestoryList(L);( E. ^- Z1 _7 D8 ~/ ?
            }
    ; e  ^. a- u0 S9 R! ?. E    }" }6 b8 E" w9 I5 b' T0 @
        * (L->elem+L->length) = e;
    2 d+ \9 ]- v8 p1 `/ w    L->length ++;    # Y3 h( S3 z3 I5 T, `3 w
    }
    7 d# @* e$ T2 n. F, H5 N! M8 b1 J4 E
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    2 B5 _- Y2 h' Q9 J    int i;, f$ U& ]0 {/ n$ v0 j4 G
        L->length++;
    4 y' m( ^9 ?% C* n    for(i=L->length;i>=e_where;i--){
    $ y+ e& f2 z0 D$ y        if(L->length>L->listSize){( S7 U) L& ]1 E7 b
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));3 |) t5 G6 B2 `4 B5 r8 U
                if(!L->elem){7 l& f4 w+ B: \6 d
                    cout<<"增加空间失败!"<<endl;
    # U: Z" Y! ~+ l! i                DestoryList(L); / C  K' b2 ~* f7 }+ d
                }
      H) W' ?$ a$ K2 |$ W) p        }
    2 H% k0 L# x; X( |        *(L->elem+i+1) = *(L->elem+i);        - J. S' T) ^. V  ~2 L; s
        }
    ' U" g: J/ `. r+ n8 K    *(L->elem+e_where)=e;1 t% K1 x: }' _2 O! f. O+ N% E' y
        cout<<"增加后的线性表如下:"<<endl;
    # V! V; c* i; |5 Q4 x. \) v    ListShow(L);
    1 S! I* W( @8 ~3 C} - v: i+ i8 y1 I7 F& k+ p* b0 k
    + H' l5 a. j8 t4 Y3 R
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素9 b$ }2 m8 o# w* [4 p% S6 t
        int i;) ~7 k8 J- v. \- v5 _4 }# A! t; x
        L->length++;2 i  s; ~  c8 ~
        for(i=L->length;i>e_where;i--){
    8 T0 K" v9 i. x6 N( l" V4 D        if(L->length>L->listSize){
    4 P9 y2 w/ j! A' i$ z, Z$ a9 w            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));/ Q% M6 I& ?: e
                if(!L->elem){% A8 l. W. |! a) g" [) C
                    cout<<"增加空间失败!"<<endl;
    ; z; ^- I/ W; I1 X8 t* ]) Q9 @9 b                DestoryList(L); % R( k& i; ]+ ~- G. x. ]; U7 n
                }
    7 y1 I$ n1 X6 r; y, N        }
    8 B+ q) f! o: Y# D" L* q. a# V        *(L->elem+i+1) = *(L->elem+i);        
    1 `5 {* u3 [6 F. Q8 B# t! S; Q- C    }( I; D* @# G9 @* X# E
        *(L->elem+e_where+1)=e;6 J- V- P  U& u3 C! D% G8 d! u
        cout<<"增加后的线性表如下:"<<endl; $ D9 h% y$ g- e) t9 ?9 h
        ListShow(L);% E, K1 ~/ D9 [7 A: n& s
    }
    * H3 Q* Y' {% L6 v4 r
    6 G& M) I- Q" y* m8 }删除元素# l4 w8 B8 T2 Q0 F. s! F2 P% a
    0 u, Y: S. b: D6 o3 c) A8 {& U
    void ListDelete(SqList *L, int e_where){    //删除某位置元素 , _5 G$ J; J! L/ W* E
        L->length--;. ?$ ^+ ?- Y% z7 x) {: d4 ?
        for(int i=e_where;i<=L->length;i++){/ B* h0 R5 q5 g/ \( |$ m
            *(L->elem+i-1)=*(L->elem+i);
    2 V6 D5 }; B" F+ @8 A    }
      I- z9 ]7 I2 A. F    cout<<"删除后的线性表如下:"<<endl;
    + s  \  ^' m7 P4 z; Q7 _    ListShow(L);
    1 N# m4 w& k& m# X6 U. u* ]: L+ T9 W& I}0 p  I$ t0 {: K# V
    5 ]0 R. `$ |9 }/ P
    销毁列表& \! p3 c+ S9 w( \
    & H/ N* ~5 A6 Q: s, y, E  U
    void DestoryList(SqList *L){
    8 `7 y8 \- i6 U" B3 n2 |    int i=0;
    # Z4 L" ^8 g+ H4 H0 \    for(i=0;i<L->listSize;i++){
    3 W& _0 R& K2 w6 t        free(L->elem);
    6 y+ o9 S- t$ z$ t        L->elem++;+ v3 `& b7 I8 T' B' Y) q9 \( R9 z
        }* [" m" @" f2 \6 S8 A
        exit(0);        3 U- @* ~% M( R- O
    }
    7 a8 x8 s) c" P8 L/ N5 X) i) e1 ^: ?7 `- S9 r' B
    链式表示方法4 d$ ?: B8 ]% F) E  n
    3 e; F7 M; H! P- P6 k
    结构体定义4 n' V7 N2 J( p, O7 E/ o& l
    6 B5 T/ c( T" U( J
    typedef struct L_Node{! P8 v9 m+ Z; j, K1 d5 @7 N
        ElemType data;
    5 N9 u$ p+ k% D/ X8 V    struct L_Node *next;
    # d. L$ e: a, A& x, a    //struct L_Node *last;    //增加可变成双向节点
    . B2 Q, w) p& `' y- U  b}LNode;& @5 l. n7 M1 T! U  S9 B- K0 B) B

    7 p9 t9 _6 _7 g0 ~  F5 l4 I/ H( C初始化
    & b: @% ?2 Z1 R+ [& x" `
    & s9 ~. i) j$ S" Z# y" A7 j# Qvoid LinearNode::InitLNode(){, S: h6 _8 |7 x7 z
        HeadList = (LNode *)malloc(sizeof(LNode));$ t' q: J" j- X; t( j4 j
        if(!HeadList){& }1 ]. L! ]* l6 V
            cout << "初始化链表失败!" << endl;
    5 g3 C0 \9 I2 L  P9 Y        exit(0); 9 v- l0 }! ^4 W) i
        } : V4 b, N, `( P9 y  o. [) {
        EndList=HeadList;
    * ]0 c& J* n! I    HeadList->next = NULL;" I& u8 o! i" w, I' V
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    0 ~8 I6 W5 c+ h, p    Length = 0;
      o- H, f8 n( j& |    e_where= 0;
    9 h4 A4 l$ v; r1 u}8 m7 m+ c- X' c& }" k
    5 j, Q; X5 ?6 L" u
    增加节点
    ; ]1 o3 a2 S9 \, z
    5 h4 u- p; |8 u* `' N6 Jvoid LinearNode::AddNodeHead(ElemType num){    //头插法 0 O6 y* w7 Z1 n
        node = (LNode *)malloc(sizeof(LNode));" J$ Z( Z# L# f' \$ V
        if(!node){
    1 L. l8 N% s1 V        cout << "新建节点失败!" << endl; ( M, b% L3 T4 ?' T( C
            return; ; K5 R9 E7 N! g7 L0 v
        } 9 D7 x" ~8 N: q) ~3 \/ j
        node->data = num;
    . J7 \, ~9 s: q    cout << node->data <<"   ";3 K" g, x5 Y5 y3 f& I
        if(NULL==HeadList->next){, d9 d4 l+ G: h9 A' @/ z% B; f4 h
            node->next = NULL;
    5 M; d8 c! E7 f; x3 f        HeadList->next = node;6 i' l- l' o# X! Z1 s% Y
            EndList=node;
    - e# f6 u+ \8 y+ K; E! k    }
    ; L4 w: A, v& z* _1 e) ^) x. E, t    else{' ?( |0 a) H* G! Q0 F, Y
            node->next = HeadList->next;
    4 ^5 S9 ~/ x% S6 {! c/ c        HeadList->next=node;0 w& h/ J/ L* I$ c
        }/ S7 ^5 m" P* N
        Length++; : s+ N. s) I& }9 q9 o
    }
    4 \% q- `! j* f
    6 k5 S0 d9 L4 f( {9 e0 dvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    # x7 H2 P- t% y7 [" h    node = (LNode *)malloc(sizeof(LNode));4 f' B! @% x4 e# f
        if(!node){( x1 x8 q( ~' ?, Y
            cout << "新建节点失败!" << endl; 5 V7 D1 J6 Z) H! u$ h8 b5 v* m
            return;   t  ^/ \% _4 d% z+ O. i; ^
        } ! D+ _* }) A! T+ a: ]1 n
        node->data = num;
    ) b; j6 \; T- H. p5 ]0 {0 e( W/ }7 X    cout << node->data <<"   ";
    % N# X- H. D+ |2 t0 U1 y2 l3 L    node->next = NULL;* y6 k$ M. n, m7 k0 m
        EndList->next = node;7 P( ?' I! b% f- @
        EndList = node;
    2 b- t. W5 V: ^3 l. Q7 s# U4 K- t    Length++; & i' s/ t$ E: t2 y# U. J. {. ^
    }, I  i- B% w) r; Z* ]4 l. v
    9 r2 F  b' O+ I4 G/ N2 R% [+ o
    删除节点: c. T6 M' N- h

    $ T' e5 D0 Y& h3 c( }! wvoid LinearNode:eleteNode(ElemType elem){3 n- v$ r, Z; [% l4 Q
        if(NULL==(HeadList->next)){% Y, T, E' A/ N2 r8 t* J; Y& Y
            cout<< "无节点"<<endl;
    7 f3 U! J7 f2 N/ b2 L! T- K        return; 2 y6 S6 q, A  Z$ T' M7 |2 r
        }* ^+ }& n+ S) Z& c1 |6 I- U
        Node_cur = HeadList;
    . Z; S+ l1 Y5 L) y/ D8 e' m    while(NULL!=Node_cur->next){
    ! m) R+ ^) O3 ~1 U1 o        Node_temp = Node_cur->next;
    1 l& d# s& _; ?9 h, c0 v# {        if(elem == Node_temp->data){; ^- w* J2 d$ I8 z  R: d3 N
                Node_cur->next=Node_temp->next;. M; O. Z2 l; J
                free(Node_temp);
      l) v* C7 `' O) Z% \        }
    - h0 [- ~4 ?( F1 F5 N        if(NULL!=Node_cur->next)
    + A1 U1 s- `( S: x# l5 u7 I* }        Node_cur=Node_cur->next;& Z$ _( U' ~0 y7 `4 X0 T. B
        }
    4 d- x- [4 b8 H' j    cout<< elem <<" 元素已删除!"<<endl; 0 U3 y( r5 P) N. a- k0 @' N. B+ O
    }
    . N: \; r3 p4 p$ n9 C( m) X# {+ l( Z9 f
    显示链表3 T9 Z" }2 R* h7 c$ c9 A
    # y2 t: W+ Q; `5 ?& v
    void LinearNode::ShowLNode(){( p4 b0 G. R7 Q/ W1 p0 ], B7 y4 \
        if(NULL==(HeadList->next)){! b+ |4 Q8 a- F) c, b- F9 M
            cout<< "无节点"<<endl;2 H! K2 w+ H$ s, L* R" H, f
            return;
    ) X* W  x7 R- L  O; y  k. T    }
    % ]  V7 P1 Y" d    Node_cur = HeadList->next;
    3 _4 p5 L; K0 d    while(NULL!=(Node_cur->next)){4 G/ Q, j6 a  Z8 U
            cout<< Node_cur->data << "   ";
    2 a  p7 k7 q% R: W# V& }. @. O: e        Node_cur = Node_cur->next;
    0 I% H. c8 {3 v. D' C    }
    3 o1 @1 C% Y8 {    cout<< Node_cur->data << "   ";
    " D( f, f5 |$ Z# @( D4 r0 r4 n    cout<<"链表中的数据已显示!!"<<endl;
      G/ w% N' R8 c- Z% {}
    ) V  \- f7 m. z& ~( A1 ^% |/ w5 o
    销毁链表
    - C4 `, O$ u' |, h6 y; \. T- R, d# f$ x' ]
    void LinearNode:estoryLNode(){- |. c4 A  |6 l( w8 U! F/ G
        Node_cur = HeadList->next; ; _1 D; G% K- g. |6 K1 ^8 [6 f
        while(NULL!=(Node_cur->next)){; E3 I" D" A) @3 B. z
            Node_temp = Node_cur->next;$ {0 m( W1 R# ?% P/ H
            free(Node_cur);
    0 H4 g2 y- D/ O  z* H6 k$ m        Node_cur = Node_temp;
    ' d. I0 X; j( ?9 q$ x* C/ x    }% w+ \# e4 H# m
        free(Node_temp);6 d# k( f; v4 _+ [& F
        cout << "数据节点已完全释放!"<<endl;
    " T4 Z7 b$ F; O; J% D  w  @: \$ _    free(HeadList);    // 释放头节点
    $ e: |) c/ ?6 P0 g/ ^  K    cout << "头节点已释放!"<<endl;
    & s  Q& b- Q4 S9 M% X/ a————————————————& J/ B: C% x+ N' m8 Z
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 n9 J9 M7 H7 R( O' [. v/ Z% t2 b
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    $ G7 \3 @: |; u! {
    5 i# h9 T" r# J/ H2 w4 P& K. X- r! X% a; X$ h
    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, 2025-8-21 17:59 , Processed in 1.435449 second(s), 50 queries .

    回顶部