QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1535|回复: 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
    4 q& O, r; h0 g. o+ U" \. `0 S
    线性表顺序表示、链式表示实现方法及其异同点7 o& x8 f2 `9 [% I
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    9 w  D- Y2 X: h9 Z, v# |
    7 z$ l/ k$ V$ a) j! v本文采用C++实现两种表示方法。" E) A: b2 ^6 S7 O" b
    3 ?1 [, i6 s& W* U  u
    目录
    4 z/ D3 ]4 k7 b% B- |9 d2 P* V& U5 E) T
    顺序表示和链式表示的区别:
    & e% R( D, G: }
    3 E( {/ \! J. j+ Z创建方式:. ^% c( m7 ^8 L  s" `% |
    ! Q# a& s* K+ M. F$ q6 o
    时间复杂度:( J. G" Y3 z4 ^. K6 M! v
    3 \2 C- ^6 w  e
    顺序表示和链式表示的相同点:
    7 b% @) x4 |6 X2 |/ X6 Y( A7 |4 W: G( N  d) |8 p
    删除内存空间:1 x1 E9 ~- i, f; K

    1 z# g4 K1 T% O代码实现:
    ) J- e; V1 C7 u* U1 h+ m0 {& b2 v5 c2 t
    , ^( i3 S3 t" h. ]顺序表示方法:
    ! v* T+ v2 P- F
    ' y  M& w6 l# u结构体定义
    ) q* y& v+ l7 _% @  b5 H
    , E) M; G# \5 i& m7 i5 S/ W初始化7 S3 M: [0 D" W6 Z* Y- C
    + G4 Y! I0 H2 H4 u) f2 p
    增加元素
    7 B* s; H6 m. I. Q
    ( I. e9 e% `- l, c+ }# C$ f6 G删除元素
    2 o% A9 f+ c  a- y$ E
    6 L. ?7 W3 |& P7 ]( G& ~) i销毁列表
      {& \9 V9 i  N
    . S% N3 W, h8 m) _链式表示方法
      L6 Z& i. B; \# }( g8 H
    1 p0 A& M) X# v& }/ `3 l! p3 T结构体定义' }: X* K" X/ Q5 d
    6 h+ C, t4 ^: a- R5 k  r3 {
    初始化# k$ O9 d& _! {

    / e7 J, E  X/ x7 k: g3 Z7 a/ M增加节点
    * B4 z, l* h5 L, o7 ?# i
    ; w  o2 k% }2 T9 A+ i删除节点
    ' Q/ _( v  d; w: h  a8 z
    4 ^" Y7 V: b6 c$ R" C显示链表
    " d% G8 @& _# y+ P/ }
    ! T7 N; I* v9 `* [销毁链表
    ! g9 O* v0 c# g% s; Q9 r- s
    : H: \$ h' u! R3 I! r8 ]) T顺序表示和链式表示的区别:
    3 R* a+ E4 \5 p/ Y- k* v8 r1 ]
    9 G- h6 Q' r! E' t0 }+ u创建方式:, R- |3 J' A) ]" ]1 C. o7 @

    4 b* r' ^4 Y) A& |* i, P8 d1 L6 U4 @顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    * X* d5 P: }0 q# ?# A- T" f' j( u& Y+ E9 {; A- \% S, F" P' Z( ~% k
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    0 Y# @4 k# e( `; S, W4 y* j3 e7 }! a4 P- ^* R5 N
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    " m! \+ j+ _% g: w& I( ]
    % [' l! K8 F; J; Z时间复杂度:
    / r! D- J" Q7 \% h5 L  w- n( o2 q  j2 |- v0 m5 P1 K8 Z9 }
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)* p0 M! E: W4 y6 Q0 X8 x  o6 D
    0 s$ }8 l& Y1 P, Y
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作), E. I9 N3 d9 s
    4 w) ]) e0 Z. g' }
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    0 y) T3 \& E- j" h1 v. x; e3 ?  y* e0 x: P
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
      q/ `' m- y  {$ U5 G6 A0 i! Z1 i
    查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);* N8 G; l% W9 d- G. h

    $ k1 J9 h' L2 M; G9 H- V" z4 _顺序表示和链式表示的相同点:
    2 |& V$ w1 p! v$ Q$ q  `/ u8 \  z9 j- j/ U. I& I: V
    删除内存空间:
    9 D0 O! d8 X- W6 w! ^
    * |2 }8 h% X  s% e: u' I  i内存空间的删除都需要对每一个存储单元单独释放空间。" T# ]& V2 ?0 {# y0 H" o, {! s
    ' m! k; `) W$ m% _. N+ H0 o$ ^- l
    代码实现:
    8 y1 A* [1 l9 }+ l8 G# U9 O" {8 @5 i3 o
    顺序表示方法:+ F9 h/ ]3 E; A

    , W3 O9 _  i/ k' c+ T结构体定义) k: `$ U3 z7 Z; o
    + b2 p( S; _) E3 t* [/ C2 ~
    typedef struct {
    8 @( W' a7 U1 a/ t+ ]& S* V    ElemType * elem;
    ; V6 L8 ~9 {! p. @5 f    int     length;        // 线性表的现有长度
    ! c0 e* P( k+ O! W/ F) J    int        listSize;    // 线性表的最大长度
    " |- `% B& z4 w; x: S  a3 {1 @( F0 _}SqList;
    & t* ~* o( z: O+ H6 m' z& {  O
      p* T8 E" m* i  U6 D初始化
    $ z0 c3 `" L" o/ K  S+ o. H# V+ X" n- c* c; F) l
    void InitList(SqList *L){/ d; V& C9 Y1 d4 Y
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    & }2 R7 g0 ?( i5 ^/ |$ d    if(!L->elem) {
    ! N& ?9 o7 X; u' E& k) R  s5 J        cout<<"申请空间失败!\n";
    % M8 B5 q4 o# m6 X; ]        DestoryList(L);; a. f* n" h3 [6 I" U
        }
    4 d* S( Q$ o# f( L$ }" ?7 _    L->length = 0;; U: d, W; t: D$ }. o8 Q
        L->listSize = LIST_INIT_SIZE;4 b. e' `! g( _1 f
        cout<<"线性表初始化完成!\n";
    0 G8 r6 k+ }# [; a6 Q}7 Y  U. Q( F8 ^% m
    . d! |1 j& a# @0 x/ i
    增加元素
    ( [, E$ g; R# ]2 E/ r! F6 c: I; K0 C3 z/ x( E
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素
    / m9 J2 J/ {4 @  V: w* x! {/ Y    if(L->length>=L->listSize){* O4 h& f8 U& {% ]
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    " G; I. r& V' [        if(!L->elem){! @+ I6 F. {; {& m1 k6 D: T
                cout<<"增加空间失败!"<<endl;
    # N0 V3 W: a. x& o0 {) C9 q            DestoryList(L);
    5 o) H$ K; n: {6 ^  P" P- _        }% @; {3 P. ^! v" i$ d# Y% ?& V
        }' ^0 E, a: M2 }
        * (L->elem+L->length) = e;6 Y8 P) G: p0 E% ]! {
        L->length ++;    0 n5 W# y+ ]. Z+ H( W6 ]
    }
    , p2 k3 p6 e9 j: L4 Q+ X7 K: W# d: b7 v: I
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素8 c$ X! [5 B" N' G7 C3 f% P) j2 H( s
        int i;
    - l$ V0 Y) j$ u+ V- u7 S# i    L->length++;
    0 Z) E7 }6 }5 o* f9 H& t6 g    for(i=L->length;i>=e_where;i--){
    - g/ C( B3 P% `* A0 a        if(L->length>L->listSize){& s+ E# Z" i. M9 Q$ ?
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    9 N/ Y. q& U# S1 I; ^            if(!L->elem){
    7 b5 _1 U9 m$ B                cout<<"增加空间失败!"<<endl;; p* E$ ^0 [8 C8 w& R" `2 b
                    DestoryList(L); * I7 o" M, O. o" Q4 m7 k; ^- |% b
                }
    ! A  Y6 z1 S5 V- F: ^        }' P  F6 T( A- e$ C) L
            *(L->elem+i+1) = *(L->elem+i);        : T5 T7 F4 D) {2 y" i
        }
    2 P5 `! b: X0 F    *(L->elem+e_where)=e;& C; F  C1 T* j$ b( A: }# K% P1 ?
        cout<<"增加后的线性表如下:"<<endl;
    : r& K# a+ _8 P- r    ListShow(L);8 G% {# S6 g# }; `- o  }* M7 r
    } . A; \8 p/ G2 h
    : C5 j7 P0 P7 o
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    2 C8 k2 p( A9 j% q3 ]1 l" i8 i    int i;
    ; Q- ?" r' W  V, [    L->length++;
    7 S9 U$ a& Y: n' `2 }! h    for(i=L->length;i>e_where;i--){! o# \3 l: {1 s4 `
            if(L->length>L->listSize){
    $ f7 ~, y9 E3 z            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));/ B( A, n5 Y" g/ L$ a8 d! l
                if(!L->elem){
    7 K. z7 B! W/ P0 Q& \& t9 b& T( V                cout<<"增加空间失败!"<<endl;
    ; ~5 \: W0 c5 Q, U' O                DestoryList(L); ! H% z+ I: l8 D5 `3 F) R9 r
                }
    * e, j2 D; k9 f  Q        }
    1 h  U8 w( k" I# P        *(L->elem+i+1) = *(L->elem+i);        
    1 [; B4 D1 y  q# c5 K5 E    }! {1 ~  R0 G" w) }" j8 |: }# N
        *(L->elem+e_where+1)=e;  n: i  |! C  J1 S
        cout<<"增加后的线性表如下:"<<endl;
    * B0 {0 e4 r. _; q+ B& ^    ListShow(L);- |; f2 `) w) F: H
    }
    + a1 f1 Z1 G/ Y2 h- R! M6 a3 P2 s0 j& ~2 N# B
    删除元素" B' V# T* U* H( [6 U4 u6 f; k
    9 e! k% ^6 f, z; r8 k* {$ [
    void ListDelete(SqList *L, int e_where){    //删除某位置元素 8 V  u" h+ q, }
        L->length--;
    6 F% ?+ @5 S' }0 p( ~    for(int i=e_where;i<=L->length;i++){% z' I; J8 ]' M' _
            *(L->elem+i-1)=*(L->elem+i);
    5 G' D; P$ L; @* g    }" ?0 e$ Z) w- ^4 n& i
        cout<<"删除后的线性表如下:"<<endl; / p+ {+ j7 Z- D- T/ @) L& c, o& o5 ]% Q
        ListShow(L);2 j4 T0 Q+ \" c# Y6 @0 k' z
    }
    8 O8 K7 y" D6 O* {- m  N) M$ G
    1 p* b6 t8 d% i% G: ], X; m销毁列表
    % b4 W. O! O' r. s/ L$ S2 A7 H& R# }, e; F- y% b; z0 k
    void DestoryList(SqList *L){
    9 ~$ o9 v' Z4 v! j! F' ?    int i=0;
    4 E1 N% L8 p0 M0 ~    for(i=0;i<L->listSize;i++){) z. X# a0 J( V1 K% T, w
            free(L->elem);
      J0 i/ T% F! x$ G        L->elem++;% W; B  Y. T0 o) a# z' F
        }3 l) I( ^, W' D9 `1 R  c" K. {
        exit(0);        
    & m8 K8 b% P+ J; [% w9 q6 `}
    6 G6 j0 S; l, d2 `, O- O  N* G6 e& w. s- s, h. J
    链式表示方法
    , [" I9 X- o' N
    + V) L3 A* U! X& L! K结构体定义. E( E, C+ ?" w: l4 j* U

    & l6 p- M: o& h6 G$ E- Ztypedef struct L_Node{
    " X' Q+ h) B8 j* p: R    ElemType data;5 R3 G  A( ?' Y5 e
        struct L_Node *next;# u& A/ b2 y- m- B. H9 [( x  M2 U
        //struct L_Node *last;    //增加可变成双向节点 8 X, T/ v% R9 Q* ^3 I( H) A- j
    }LNode;
    5 r7 i1 Q, o8 s+ h: ~- J
    : P: Q  N! l4 ?  y- f初始化
    1 W; A& G2 q0 T! f) e4 ^7 Y2 e, b' N3 d: W, I: r8 _+ M1 H
    void LinearNode::InitLNode(){/ T; N/ _; Z: N" {, Q
        HeadList = (LNode *)malloc(sizeof(LNode));
    ) f4 i; x# q- M+ A- k* B6 T5 {    if(!HeadList){
    ' x3 d$ u3 H& y. x! p        cout << "初始化链表失败!" << endl;
    + L/ B' }) [$ A. R! ^( a        exit(0);
    3 b/ _; J' _* x    } ! f7 ?. J8 i4 Q' U  g; f9 o
        EndList=HeadList;
    / ?) K& b) }; r2 [3 l/ s    HeadList->next = NULL;0 p' X9 r" f4 o1 q6 o7 `( g
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;
    ' P8 k) z1 y5 Q+ ^    Length = 0;
      ]0 o$ T' y3 f. J- H* e" M: k: E    e_where= 0;
    ) u" j! ?, M0 ]) A  V}) |7 K* t: c% f" P5 x# M" Z" [
    " a/ o4 c" B/ U# w8 w# h9 q
    增加节点
    4 G4 j0 H& @- V5 u
    # g1 T$ z: u" ~2 Z- o7 `void LinearNode::AddNodeHead(ElemType num){    //头插法
    , ?0 c2 t4 q0 w" T& \    node = (LNode *)malloc(sizeof(LNode));- B* {9 C) W9 V3 {! A
        if(!node){
    + S) e+ k3 w5 @% f5 ^  Q- \        cout << "新建节点失败!" << endl; $ X% T4 Q9 p6 O5 h- F% `
            return;
    3 b: c/ ^! ~0 c% \    } & A8 V% c4 ^0 X
        node->data = num;4 ^5 G0 i6 X* a3 D$ \( I' J5 j
        cout << node->data <<"   ";
    $ S/ U0 ]$ t! Y' }  `9 ]+ B    if(NULL==HeadList->next){
    - f  ~0 g( Z: n        node->next = NULL;* r/ N( ]9 `% }7 n* Y
            HeadList->next = node;4 ^( h" L4 ]  V3 I, Q/ ^" [( Q* W* |
            EndList=node;$ L" y6 f+ D( n* C
        }# D0 s/ \# b; y! p3 ^" b# H& X
        else{+ i6 c* [+ o5 T5 y
            node->next = HeadList->next;
    : C4 W5 D' r& y$ ]- b) E$ L8 v9 i        HeadList->next=node;
    5 {+ L" f7 b6 w6 }2 R# F    }
    ! h0 r( v4 H( x; `    Length++; . U1 ^# j8 M# x
    }
    2 P* {0 c1 E* [- j8 b% ^
    4 i( S3 D2 q6 e! o: E1 Yvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    % X  v' I% f2 {) o    node = (LNode *)malloc(sizeof(LNode));
    , ]' @, T- X9 S6 K    if(!node){1 f* v: ~0 L* m! L# A/ m: w+ X5 {" E0 k
            cout << "新建节点失败!" << endl; + M& m8 r- P+ V+ K- v
            return;
    6 y* l. Y6 L  v. i3 P    } ; d+ l" A; c8 ~
        node->data = num;
    1 u# c& M  Z+ z6 R- e    cout << node->data <<"   ";* j0 g+ ?9 [9 _7 P
        node->next = NULL;& l+ t1 B& V. g' b5 P! T$ S
        EndList->next = node;2 W. h& z2 v# S" X& \3 F
        EndList = node;
    % D, u! r5 u3 s4 ]6 ~" g    Length++;
    / v! ^! A2 L. W}- I& P# ?+ U  ^

    , H# n& g, E: ]5 s; D删除节点
    / i. e; A0 D2 t( R% x7 T9 M9 g* F1 \+ I) [: a3 b/ y
    void LinearNode:eleteNode(ElemType elem){5 r; \& s" {0 [5 C/ O. }4 y1 J
        if(NULL==(HeadList->next)){
    9 B) E2 W' C- h        cout<< "无节点"<<endl;
    ' ~5 v. ~9 Q* [; F- v/ g( u7 t        return;
    2 @3 d, ?6 o* n. Y! x    }8 p) V, I& C8 [/ O0 i- _( ]% r
        Node_cur = HeadList;+ L  d6 W; W5 U$ o, w
        while(NULL!=Node_cur->next){1 ?% ?. e5 h/ E* [) E; n' ~
            Node_temp = Node_cur->next; - v! Q3 R& g5 H
            if(elem == Node_temp->data){
    - b. V! d9 w" m2 F, i& b- U- I            Node_cur->next=Node_temp->next;" Q( Q9 l0 q0 N6 [  `) l0 \5 ?
                free(Node_temp);+ T; F9 t5 c, M' p, D* A
            }
    1 u( C% W/ g8 u% a) b! [) d        if(NULL!=Node_cur->next)( H! U& ?* ?+ u& J7 t. o
            Node_cur=Node_cur->next;! j' q: A6 i5 l; k, R5 ^
        }
    ! ~! S5 I. w, u* G    cout<< elem <<" 元素已删除!"<<endl;
    6 F+ U' {% }) e  ^% y4 p% d+ l) P} 3 D& G! u4 C! Y
    1 P9 F- p6 I/ j% P( E
    显示链表
    ! B4 m3 r1 l% V9 G3 R! q5 `* d( ?# \! x$ l( u) B& D3 L
    void LinearNode::ShowLNode(){/ X% d5 `1 U) T" w/ c: x
        if(NULL==(HeadList->next)){- i& G2 g" [4 D* B. X  \2 O
            cout<< "无节点"<<endl;
    , B6 w! m9 M4 s: Y' S        return; # Y6 s/ H- J& Y  c+ [: K8 M
        }
    / k/ s# H# V* W2 ?4 e    Node_cur = HeadList->next;
    # S5 V$ U+ S* ^- s    while(NULL!=(Node_cur->next)){) `- T, l2 Y# G* R2 B- @' b% `( c( ^
            cout<< Node_cur->data << "   ";
    ! q- ]( S$ q8 |2 A  G8 ~        Node_cur = Node_cur->next;
    5 o" c1 L& k; y3 K' |6 B8 I    }- G6 u! G- X! w
        cout<< Node_cur->data << "   ";
    8 v$ ~2 j9 Y2 w. J0 D( B    cout<<"链表中的数据已显示!!"<<endl;$ @5 W0 W- ]6 \0 k
    }
    ) I0 P' a2 B: n$ l; a. m) B& f
    . b0 ]) a/ l- f( A8 e( [销毁链表
    6 T- x, R) D4 u: ]- ^# J9 ]! P5 R: ?. A. `2 y* y
    void LinearNode:estoryLNode(){7 I6 ~! P* _* {/ X. I9 v& G
        Node_cur = HeadList->next; 0 n" ?9 D4 y9 ~" }! h4 s9 Z8 v5 @, ^
        while(NULL!=(Node_cur->next)){) s1 Q- X1 J/ L& l
            Node_temp = Node_cur->next;
    $ D: ?3 u1 S) K' d& K        free(Node_cur);2 x; L' o# B0 V
            Node_cur = Node_temp;1 M0 y6 z, m  ]0 r" Y" Q9 F
        }1 y  ?% m+ D; C0 ~; _  G1 V; V
        free(Node_temp);
    1 k- Y* I  V6 P/ t    cout << "数据节点已完全释放!"<<endl; & k- y& ~  \! q! W! r, s+ Z7 |
        free(HeadList);    // 释放头节点
    , u0 h( k/ n1 _: \' u' b    cout << "头节点已释放!"<<endl;
    - r# c" J$ J! k! c————————————————
    , t1 {0 [/ u5 P, a9 ?/ h6 p; B版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 d7 |, g- h6 C/ P4 W& f
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    0 m( m6 ^$ Z, M; B$ K: v/ A* t
    , V  O# ]5 z! K2 n6 ?
    9 |; z" q* Q9 Q1 K2 v
    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-21 13:17 , Processed in 0.435076 second(s), 51 queries .

    回顶部