QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1529|回复: 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
    2 j  Q% G& t0 J& e+ S$ ^- h  x
    线性表顺序表示、链式表示实现方法及其异同点4 J! x9 A0 g  C, D! M+ [( I+ j( p
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。% O. e; B2 W& |+ p: R( g

    ) q. D! v0 I% H$ M0 R* |本文采用C++实现两种表示方法。0 o& \; g# o/ S9 }
    % U6 z/ I6 n9 B  s& p6 p) c
    目录
      U$ K0 U- w: F  F
    / Y; S& p, ~5 G2 s顺序表示和链式表示的区别:1 Z8 \, U$ `5 n9 H1 \7 ]8 W
    + R. q  V) F2 p# `; T/ j. O
    创建方式:
    1 j* h! c! ~% X" t
    " e; g! T  J5 A7 ^* G9 R时间复杂度:) E2 A/ u, K! T) _5 w* v

    + f) C8 c) O2 {8 [6 {顺序表示和链式表示的相同点:
    ! B$ v3 P, V4 d+ z* f
    $ {0 s5 y& d5 S删除内存空间:
    4 l1 G1 P( u9 h% q! B) Y$ ^: U; f0 U) ?! V1 j, p! l6 e
    代码实现:
    % z& C7 P0 C0 z1 k/ M
    % ?; Z4 l. m: `顺序表示方法:
    $ w* n8 g/ ?( u/ j- q* ?7 e9 T, Q! N# l6 I1 W
    结构体定义& \: `) c, j; ]
    9 h, c2 y6 e$ D
    初始化- P; k2 ^3 L- Z

    + E8 C) @  q/ x增加元素1 |7 i; p& k  P6 t9 O

    ! r4 \" z4 o6 @- l$ q删除元素
    ( ^. [6 K* L2 u, O& c( Q  j7 H( g8 l9 I+ U% y2 t5 o
    销毁列表
    . P) r8 y, W8 E( m/ ]$ b" H2 U2 Z/ ~- j5 K
    # G" J* H# i  e链式表示方法
    ( O* U+ X7 Z0 v, D; U2 N# |/ V( ?# i
    ! K0 }! x8 R6 n( B- t4 \% v3 f结构体定义$ n( {: _" H) O, C5 B" Z
    , W6 ?  o/ g( O
    初始化
    1 i" p  Q5 w" G- S9 w/ Z' E- h9 @& x( y3 b
    增加节点
    7 `  @. C# P$ q6 m( n* x- p* G: T+ T6 H
    删除节点2 G3 ]8 L" O! }# M/ B

    4 R: q: }" \/ U3 D8 @显示链表0 `0 l1 L$ o3 c  p

    % o. I# r/ U! g2 T# P7 @销毁链表
    ; G9 Y' [# ~8 b/ }! ?( ?
    " T" W' g. T3 M5 U顺序表示和链式表示的区别:
    3 @! B3 w" ?  i+ s
    $ j# C  e. W. G/ U) @创建方式:
    + f3 j& \" j5 P9 }" S5 @$ b. I" n. D6 ?  M& D$ n  w9 R+ m
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。: G" X( b9 ]  D+ @9 Y  t* c/ l- x
    0 @9 t, A& {  W3 B
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)* j, R/ P5 ~0 U9 M/ M, n

    . b: F; q7 p5 X0 w链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。8 l: i1 R! ~6 S% ^

    * n  Q" j( w" ]时间复杂度:  }! S# k/ n3 W$ {9 l

    / `. _' t. E6 _% V. i0 S增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)" G& P4 G1 ]/ S! z) W

    / k8 Q/ Y9 s7 m. ~! }" C' f" A, e) j增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    2 _2 _# P& o1 _
    # t( m9 W2 h* w7 APS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。1 K8 N% l5 _( m8 _

    & @/ v( V! P) P4 R1 \3 D' [2 n修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    % `$ w( ]1 ~0 G) Q* |4 M, P& [/ d6 }9 A
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    7 _, e. ^6 I! K1 c4 p
    ! e  R' o1 U6 G" m顺序表示和链式表示的相同点:, j2 }, u- x6 U8 K9 }
    ! W1 t4 c" }8 `' f8 D
    删除内存空间:! S  u# v) Y% G! e+ D0 k- X' e

      }% J' h6 m  J内存空间的删除都需要对每一个存储单元单独释放空间。( Z1 ~4 h$ J& Q3 p4 p
    * w! n; X5 t1 d0 |4 n& v$ @! v
    代码实现:
    7 b$ A& I% O% z* w5 M% \2 ?: a: j. A# c' @
    顺序表示方法:  N0 b* z3 W3 _7 I% H
    / G* l, y* x% Z* i% F+ N
    结构体定义; F6 w1 Q% H7 _& L; z
    & Y  D4 K$ a. S3 [4 T  i1 P  o
    typedef struct {5 z3 c& b# O0 O7 i  w" [
        ElemType * elem;
    - z: `4 `& V: E1 }6 H/ j    int     length;        // 线性表的现有长度
      i6 X% t3 \8 n    int        listSize;    // 线性表的最大长度
    3 X: V4 m' r7 k) N7 p" \/ T; Y; q}SqList;' n' k* }5 U+ A/ A1 ~

    4 ~5 j* C+ v8 E+ {+ R4 s  S1 E初始化! f8 A1 z8 D% B4 b
    7 v6 X6 H1 H: |& @/ |) Y
    void InitList(SqList *L){6 b( c* e' |* [9 u; p
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;0 M1 g; a: k; \* Y, ^
        if(!L->elem) {- E" r3 d: l1 E; B/ i
            cout<<"申请空间失败!\n";
    3 d1 m: i/ M/ n- [        DestoryList(L);
    # |3 ~# `6 d+ X& ~: ^    }
    9 J2 {* o/ u. A    L->length = 0;7 ]6 c3 _' N& ^1 j1 ]
        L->listSize = LIST_INIT_SIZE;
    * `% X4 |- G. F- G2 p. p    cout<<"线性表初始化完成!\n";# [3 E2 h& X6 r) J& D: Q  @3 k+ [
    }
    " d# x) Y# x0 C/ b& j' e! m% M. o
    1 C/ I4 l: O0 l- d增加元素; w  q! p* G* z4 j) C
    $ {* f& C0 y4 q) E
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素4 b  p4 B: u, A; u' @/ d4 ]! S
        if(L->length>=L->listSize){
    - z6 B6 V3 E- b        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));% G5 d4 {( H/ b1 d& s/ F) r( H5 a) `
            if(!L->elem){
    $ f& G- h2 x5 y            cout<<"增加空间失败!"<<endl;
    : `( ^# `( A2 b- T2 M            DestoryList(L);+ @5 T2 g+ R. G
            }- J6 N# q: s4 M; P
        }
    7 t! u& b2 E+ `$ W    * (L->elem+L->length) = e;8 O9 I' ?! r+ P. z( C3 Q* U- i3 K
        L->length ++;   
    ; Y# c3 J4 q) Z0 B% G}
    $ F3 x8 d. v& R  O! M6 q4 [4 b+ N+ R$ x/ D4 Z0 R  Y( s2 M
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    ! L, k  _  w+ B- H& U    int i;+ @3 v3 k5 M* Z9 i
        L->length++;( t# r6 g! m/ L" N4 B
        for(i=L->length;i>=e_where;i--){
    * P, y' M$ H6 Y        if(L->length>L->listSize){  M$ m" v* b4 e  k
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));" Y) E& W1 \  W( [
                if(!L->elem){# c% E& U2 A6 c/ I
                    cout<<"增加空间失败!"<<endl;
    3 w/ T' O2 L" T0 K2 S1 T4 I( z                DestoryList(L);
    3 j+ v: D0 @' E* [            }
    % d8 M; Q4 j( E/ b# \' Z. i        }9 D" `* x9 @& M! @: o% e
            *(L->elem+i+1) = *(L->elem+i);        
    , x; y: z7 q/ D$ m! R# e6 M6 X$ l    }
    2 e$ }* o+ f8 x- |    *(L->elem+e_where)=e;
    / Y  I4 G' F1 X" |. ~- k* q    cout<<"增加后的线性表如下:"<<endl;
    % d$ n3 P' P% U4 b* }9 O6 O    ListShow(L);
    5 J5 W) \% z8 s/ ^4 \8 s! W} ( g, P, W: F! l$ j

    . x: @, K; x4 k6 H6 Z6 N) p' uvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    # J  T6 i/ I3 L" h    int i;
    ( K! |5 W/ W, _$ Y% G    L->length++;/ M6 E( C! [/ Y8 ?# [
        for(i=L->length;i>e_where;i--){' W; @/ B& H7 i- N) C9 [
            if(L->length>L->listSize){2 v& m) O4 j  w) s9 z8 I
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));7 K$ x' n* A" n% i+ I- L3 l
                if(!L->elem){! V* g' K& ]; O0 Q4 d3 @
                    cout<<"增加空间失败!"<<endl;% k1 C5 D% V) x- r7 i
                    DestoryList(L);
    1 H* {8 v; o0 o( s. e            }
    " Q. e* P) z7 j. m6 d$ P  o        }
    3 A( j6 H$ e* Q' C        *(L->elem+i+1) = *(L->elem+i);        # u# C3 N, K# R
        }
    4 ~% C- l% Z* x1 o9 j    *(L->elem+e_where+1)=e;$ ?, ~. U/ L# Y- I! @' Z
        cout<<"增加后的线性表如下:"<<endl;
    - l/ s+ ?# N8 L+ _. G    ListShow(L);0 ~3 ]2 S6 m! ~; l: {; G! F
    }9 t/ x* _' [- s# ]% h6 s
    # n3 d0 k# z" N7 ]0 W) q9 Y7 p
    删除元素3 [: V1 W% X" H! |2 I: Z. G
    ! d  f0 }8 Q* ~8 H4 `
    void ListDelete(SqList *L, int e_where){    //删除某位置元素 1 v7 [( r6 E3 X; i# T: t& B
        L->length--;7 x2 o) g9 x0 s- p
        for(int i=e_where;i<=L->length;i++){
    + f' M: P5 N$ l+ y% I4 Z1 }* |' a" a' F        *(L->elem+i-1)=*(L->elem+i);
    1 ~- {# E2 ?0 g    }( P  A2 G" V- N
        cout<<"删除后的线性表如下:"<<endl; 8 f% e; c7 Z2 x0 a4 O) B
        ListShow(L);( K4 a! M0 }3 V9 m) K
    }: X( K0 R0 U- ?5 A2 C
    & l, g6 r1 a5 D( \$ ?( ]8 ~
    销毁列表
    & c! Z& `; ]+ C( S- P% n- }
    9 o8 v. V, ]5 S) _* m- K  Vvoid DestoryList(SqList *L){8 m: X# ]$ _+ }" ?2 h
        int i=0;
    ) N  q: @! u0 ]- Q. P- R    for(i=0;i<L->listSize;i++){# f2 m+ a, E, I# ^$ u: x4 k
            free(L->elem);) I, ~0 H. \7 m4 ~
            L->elem++;. w0 `7 C* F! A4 U6 j; d* Z0 M
        }
    , e' @2 u/ I8 w% T7 }+ C9 `    exit(0);        
    ! Y& F8 |7 u, M( O' d2 b4 U3 A}- D- a% s, H, ^% Q4 n, C% Y! s1 T
    1 Y0 @9 E# X" y; l  Y2 Y. O
    链式表示方法
    # K7 n; Z4 t# U  V
    ! Y1 {1 \5 q& d' [3 ?0 Q5 U结构体定义/ Q: r& `) R7 z1 D# Y4 a8 A0 {- t

    9 X# D/ W* W) ^typedef struct L_Node{
    , n. \' O9 [& k6 [5 R    ElemType data;1 ]3 a# y  o8 Z/ b
        struct L_Node *next;
    ; D6 H: Q' d2 x+ Q3 D: J    //struct L_Node *last;    //增加可变成双向节点
    ; K$ W# A7 K- [/ ]( v0 W}LNode;$ N! Y0 S9 d4 c+ ?7 r8 }9 i" }
    3 f5 ?% N1 O/ P5 g4 ?) y) M2 f
    初始化2 X, l& m' \+ k

    ; k1 ]: Z0 s! m9 a7 r! Jvoid LinearNode::InitLNode(){
    ' p: K% M& K! e5 N3 J' f+ A" w    HeadList = (LNode *)malloc(sizeof(LNode));1 w! w" y9 u2 b9 |2 M, I( r- i6 d
        if(!HeadList){1 V/ }! Y) E7 z: E* M( ?
            cout << "初始化链表失败!" << endl;
    ; j" H6 G6 a! a/ k5 A        exit(0);
      {9 D: |" k! [$ A( v- S    } " e+ B+ S$ I% G$ v
        EndList=HeadList;
    ; x+ o! e8 Q" V! ^. q$ Q    HeadList->next = NULL;
    . @# E9 g- K8 ]9 ~: H    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    : S$ |+ F; I9 X    Length = 0;
    # A4 q' U4 ~9 R! K  o4 O  o    e_where= 0;& f# ~8 X0 R1 c* s' n* c
    }6 w5 i$ a* r( h9 J$ W# x5 L, y

    & T8 L6 {2 }4 M$ t0 e  z增加节点
    & r/ I) z1 v0 G& _, j
    ' [/ t" V4 @5 evoid LinearNode::AddNodeHead(ElemType num){    //头插法 8 M8 y. y% F7 k( n# ?. e
        node = (LNode *)malloc(sizeof(LNode));. R) E1 P5 h) m" s, Q
        if(!node){( a; X5 W6 n2 v6 C& @
            cout << "新建节点失败!" << endl; # I2 [6 [4 e( ?
            return;
      r# u$ R  s, `2 H    }
    1 m: l* F7 @7 r3 X    node->data = num;
    , @, u8 `$ V+ l) z. i1 S4 c    cout << node->data <<"   ";+ a/ |+ G9 B& ]& e
        if(NULL==HeadList->next){
    8 c- U/ e2 |1 U0 X        node->next = NULL;
    - [: A! ^& y. J+ S! \  I        HeadList->next = node;
    7 w  n7 M! s) f$ X8 d        EndList=node;
    ) [" Z. u7 ?$ Q3 p! e; J! e    }
    4 P- o: d4 \% E  L" W    else{
    $ Q: @% K; u6 g- |9 L9 ]        node->next = HeadList->next;
    ( [0 |5 u8 s( P* O) H: @0 C/ r        HeadList->next=node;0 I5 @0 `! l2 [6 O; l& e
        }
    8 a! P8 x6 F: C( O; ]4 P    Length++;
    # ^0 A% [! C" m8 f( o9 Q! \}
    # ?- l5 q" D4 [
    $ D& g/ |( R1 f+ ?+ [) T4 y' i- D8 t* \void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    6 r% c% n1 y6 b  K    node = (LNode *)malloc(sizeof(LNode));" N# v2 L7 U  ^) ^( o6 V: p
        if(!node){
    & {+ x* U  }9 Y6 v# H3 x. s        cout << "新建节点失败!" << endl; 3 F0 c3 {* X+ L1 s
            return; ; Z1 R+ G3 |2 }/ g
        }
    . ^$ Y( ~  Y9 [' `    node->data = num;7 z; d, ^; o0 I5 Z; D: n
        cout << node->data <<"   ";6 l  y5 Q5 b/ x& I
        node->next = NULL;
    - `, |" V4 @/ u% z    EndList->next = node;
    ; Z5 Y$ |. D6 [. K. N4 Z! q    EndList = node;
    / j: ?& V, J. q1 Q7 N8 k6 J) X  W    Length++; + Q' f7 b/ _- J. }+ T
    }% P" d6 l5 o& _* a
    / f7 E0 Y. t; I" Y
    删除节点
    4 i0 X% [$ R  E. q6 m  O
    2 c% G1 a* q' {! j2 W2 i3 P1 U( @- N4 nvoid LinearNode:eleteNode(ElemType elem){4 L8 ]& {4 p7 B6 R
        if(NULL==(HeadList->next)){/ N) K* f! D8 I5 p4 O
            cout<< "无节点"<<endl;) h6 |/ C' d; G
            return;
    " E9 _- V# u8 W5 [    }
    - x, y' F$ E  N+ Q) Y& J3 D    Node_cur = HeadList;
    # c% y# h. \. M0 s8 @' C& r  k    while(NULL!=Node_cur->next){
    * \7 T* u8 C( l) N+ g2 z        Node_temp = Node_cur->next;
    ( M6 P! z8 l# Y1 D' u  |" I        if(elem == Node_temp->data){
    ( `4 E; |3 a+ R+ V' \            Node_cur->next=Node_temp->next;6 M) [, S* B6 r  L! v4 t9 ^0 v' p
                free(Node_temp);
    ! G4 |! D- ?( c' w, |! B  i, V        }* k  E) |# x- k" e
            if(NULL!=Node_cur->next)$ [! }. T9 _. ?
            Node_cur=Node_cur->next;
    . O8 M: l) Y9 s, N( N& r  z) W" P: Z5 G    }
      n5 p4 I' m2 G# ?& d8 D' l    cout<< elem <<" 元素已删除!"<<endl; 6 A1 l  ]7 S+ G% o& T. t0 V+ i
    } 1 G  N, d: l( a8 h
    3 L: j% g1 a- M" o0 Z
    显示链表4 Q# n: R# ?1 q: P; O) ^

    / ^& p9 s8 F+ D5 f" b2 g% cvoid LinearNode::ShowLNode(){
    8 T( I; `( H" a* u8 I    if(NULL==(HeadList->next)){3 ^, O9 o/ i/ z6 w! A- t
            cout<< "无节点"<<endl;$ L* S6 @3 j) b- a& a
            return; ; G' H( W0 b% d1 K
        }% G( z# `- b# Z' {- @% G
        Node_cur = HeadList->next; 8 M% q* |4 P5 H/ `- X3 C6 T
        while(NULL!=(Node_cur->next)){
    4 p" K9 ]7 q( A+ Q$ L3 O9 A        cout<< Node_cur->data << "   ";8 w" I3 P; b. c' j6 i" S' l
            Node_cur = Node_cur->next;. `. y  K! A) I' E$ I
        }
    / u/ z$ f; X0 N    cout<< Node_cur->data << "   ";
    8 O: }3 ^- _; n8 e' o    cout<<"链表中的数据已显示!!"<<endl;+ v; z1 B7 z& g$ T+ C+ G
    }! t3 L/ \* g# G0 x" e( U- F% T7 \
    8 J; H; K7 s  I) T8 q  Y9 n7 D
    销毁链表
    / f2 V6 X% H: s: R% h3 T- D- T0 x9 U. J5 [) B% p+ A$ ~
    void LinearNode:estoryLNode(){
    * ]% U# c  D/ i& l4 Z3 R. P; H    Node_cur = HeadList->next;
    # {& K4 e( N8 T# S    while(NULL!=(Node_cur->next)){7 f% x9 F' F2 e9 D9 C' `1 t% J
            Node_temp = Node_cur->next;- y7 f/ e2 k4 `
            free(Node_cur);+ \" }5 D$ q6 ^2 Q9 i
            Node_cur = Node_temp;
    5 @& h/ o- Z; c4 A    }
    . g( z8 y  l# i1 _    free(Node_temp);5 g$ C8 v+ A# z! Y
        cout << "数据节点已完全释放!"<<endl; 7 u$ d5 |% [7 \7 p. C
        free(HeadList);    // 释放头节点 ; G" Y# G6 [5 A6 Y) f6 x5 I
        cout << "头节点已释放!"<<endl;
    " P6 m9 m# X6 V* D- }& {* H————————————————
      ?/ V" E; |7 }' k5 v版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! j1 e- V$ _- ]& y2 \
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    2 ~0 d! n# U8 I( `4 T! ]3 r' `6 k: M6 L, L. }
    ( T7 H. ~  w' i* T
    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-20 17:28 , Processed in 0.531002 second(s), 51 queries .

    回顶部