QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1562|回复: 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
    - K2 S1 Q( I% K5 m0 b* d* }
    线性表顺序表示、链式表示实现方法及其异同点
      c$ g1 d9 n. o0 X% o" m$ _线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    & F3 v# N) M6 c  l9 d& j
    1 I8 u7 [& p) L) I! u% Y本文采用C++实现两种表示方法。4 X( Q" n# s, Z. l- F

    4 u: g& c8 U. P) {目录8 n6 a/ `; b; w$ c+ N4 D

    ; T6 l! F8 `1 B+ _3 T9 s$ r顺序表示和链式表示的区别:
    5 }$ I, w/ M/ c% w) c/ K. i3 i/ U: p3 {8 n
    创建方式:
    % R* E: U5 [7 c4 P, i
    6 A- f" j2 U5 K( Z6 {时间复杂度:
      H6 s( G  s/ S3 }! b5 ?" C+ ~
    / L6 [( d" }6 h8 C$ w! h- @$ R顺序表示和链式表示的相同点:
    2 j! a4 ]" _8 t% X4 F( e. _* Q% h$ N% }) _
    删除内存空间:
    ' w' E6 [) I: f9 H; m# s8 g$ ?( o0 ]8 l. V" b& f' \! N! Z
    代码实现:) g0 t/ H0 b: s

    6 b+ c% ~7 _3 G4 x& C# n顺序表示方法:
    ' c8 |% d& Z9 f6 H  m$ c; B
    5 D8 T6 G+ I/ B& }3 f结构体定义
    8 l$ q4 g5 H# l' {0 M. ^& s: u( E& X- R8 m9 ]' Q' u/ w$ Q; ^; k* W
    初始化
    + g) e* }7 B2 r' ^7 t/ {* B$ s/ j% P, [
    增加元素
    ' J$ W$ b, b. m# |/ A" v; r/ L( e8 e6 c* s
    删除元素
    2 M+ ^9 }. k. ^
    3 ]7 D; K% Q( f销毁列表
    8 R0 q' F  q6 h/ u
    8 x6 Y+ ]: _$ x$ k8 S. C链式表示方法  `/ U) I* d6 T/ ~5 R4 c1 v5 P: o
    ; o( T0 A& [% S
    结构体定义0 s0 t7 q  [$ u
    / h) G, V3 p. I0 U
    初始化1 E" F. c( d9 t" g& B

    * `$ I" \8 X  p! i增加节点
    / J8 j+ W& @) \7 {4 g  k  K# y: F
    ( r( r5 M2 `9 c7 H5 y6 Q0 q" |删除节点7 ^0 J9 s/ x3 N# d' L% D; S

    " H" v$ {* H3 G7 a显示链表
    1 k8 E' L' y( ^& F6 D+ X# t* P# e4 o% x9 Z
    销毁链表
    : _: z2 |# S. r) L1 F1 c: l3 U8 t2 f/ D& M  o0 W/ v
    顺序表示和链式表示的区别:/ O7 ]$ [. [& ^( R, Z

    " T( X) u& l- L+ S! @# a+ \8 R创建方式:5 s/ R) Y# x; a: s* Y2 w% A% j

    , G4 v4 m) L6 o# r% A9 X( {顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。- K- |6 @6 P$ L9 |; d
    3 X0 C: o8 F2 S, T8 y' _6 t
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552); E" j( P9 a% F/ z
    6 S& M+ r! p9 x2 }
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    $ D0 Z# ]' w: Q2 q% ]) F. }# r' @4 }9 g! E; |
    时间复杂度:
    2 V$ @' x2 G* b6 D3 i& X3 |( e% w: s+ C6 k+ t# H8 @! z
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    ( C; ]# q# ?: {+ S* v4 q7 K- ?
    " p  Z. p! X- r% P. r增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)  [, }  Y, {! W9 y
    - E" v' r" b1 R
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。
    " Q" a5 w3 m/ G; a; w. `* e4 ?, Z* _4 P0 \, z4 q; p4 B- R
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    3 a  T5 t- U9 }5 i$ q: d
    ! ?" i& U' Q5 C查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    ; E; g7 k' C9 l, x; }! w- G4 J- [+ U) a5 @6 R6 l
    顺序表示和链式表示的相同点:
    # \" p  m8 f# d) r0 z/ V
    8 i: ^6 ?3 H& ~. R' O. ]; V' Z删除内存空间:
    + y8 v0 A, n) a+ @' U: S  z1 H" q9 }+ T' M, q
    内存空间的删除都需要对每一个存储单元单独释放空间。4 o: y# w0 @  T" U/ z

    1 G1 L# H2 E) W$ @0 f代码实现:' e' e$ S  C6 S0 F4 K
    ) L$ H- k% M& ]* Z* a4 T
    顺序表示方法:
    $ n5 h. [2 N- M
    % X. t( V1 [* P3 l+ I! I; G结构体定义- o3 ^& B4 `0 E5 G, D% i3 N7 e/ f4 a
    4 v. s+ s1 d4 i8 D
    typedef struct {
    - g9 x, j) G+ `# b5 W. [: N  N9 F. y    ElemType * elem;- ^1 t! C1 f% Z; \
        int     length;        // 线性表的现有长度
    % n, X$ W$ }& b1 p    int        listSize;    // 线性表的最大长度$ s, B) [. }/ v2 }
    }SqList;. D2 X& C& u( b$ f

    * j7 z, ~* Z3 o7 [( _+ X初始化
    * c- H' {' K. S( ~# @
    ; k$ ]& z# m& {- V! q; B7 f/ Qvoid InitList(SqList *L){
    / _+ W# y2 t( ]    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    - x# T0 J$ S1 E( V% w$ Y    if(!L->elem) {' _, w+ x, C2 W& I* h) [
            cout<<"申请空间失败!\n";# F. o) E0 M* d  {: D
            DestoryList(L);
    4 Z2 H" w( p2 r8 [+ X. r5 m6 Y+ d& {    }
    ' |( g9 c+ G3 {$ a, y# M1 \  T    L->length = 0;& O9 W. S) L' k; y2 ^
        L->listSize = LIST_INIT_SIZE;
    . |+ y( m% c: f2 `    cout<<"线性表初始化完成!\n";
    ' @% h0 b/ O7 a}: j; v$ F% K  L  M( {- o1 O

    # _( h) k4 V' o7 N3 k增加元素9 ~$ r6 s' w$ j

    1 o+ g4 r4 P3 f6 Lvoid ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素" n9 }/ Q' ~' P
        if(L->length>=L->listSize){+ F! ^& n: {  x6 K  @% K/ F, I
            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
      m2 _6 l5 @1 \! R! o6 ]6 i        if(!L->elem){
    + T0 g* _, }9 k" W, c            cout<<"增加空间失败!"<<endl;, u: E0 u, y: b! S. R* U
                DestoryList(L);
    $ X/ Q  X/ s* o, H* O" `, v        }5 ~, U  ^* |# B" T, X' ?4 D
        }
    5 ^9 h2 R$ j  Z4 W5 c    * (L->elem+L->length) = e;
    2 s* _/ ~& q2 H) S0 O1 ]4 F    L->length ++;   
    $ I# P' G9 y9 ^& l, K, ]}5 ?3 q, Z' V$ d( Q
    $ p' f" Q1 V' z. U6 C
    void ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素% [5 B1 [+ t; L
        int i;4 S8 s% v* a" D6 ^* Q
        L->length++;( m2 U" i1 K( G- `$ V; Q
        for(i=L->length;i>=e_where;i--){
      \  K8 F: w  b, Y9 e) B, b        if(L->length>L->listSize){9 j( r' P4 x" x# T. n
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    6 X3 h$ }' ~3 z$ a7 K" e+ c2 F9 h            if(!L->elem){
    1 |; H; ]9 t. l" [* K! d                cout<<"增加空间失败!"<<endl;! X5 T7 y  `3 x; w- w
                    DestoryList(L); 6 c6 d% I* X% g. M( e: T
                }0 [1 z, R. z2 I+ ^7 R; ^
            }9 O, T' h3 s) G$ o; g; ]/ b4 E
            *(L->elem+i+1) = *(L->elem+i);        * T. G: v- B# E6 N4 m: B
        }6 Q2 z, F6 Y' \* q  b+ [
        *(L->elem+e_where)=e;3 G$ A! k( F2 m$ G8 A, p
        cout<<"增加后的线性表如下:"<<endl; ; f' {. u2 l( t9 V4 X( O
        ListShow(L);
    4 s- ~5 M; \% ?3 o} " V" D0 v( o+ M7 G. {' G

    " A+ F; x: f0 z) Fvoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    - k! J" l, b4 @1 ^3 \: ~    int i;7 ~; Y- W0 G1 o5 Z0 ]7 n
        L->length++;
    * z& v: {- a) H' c, m0 A    for(i=L->length;i>e_where;i--){
    - l4 I9 Y4 H. i) {4 H# G6 c        if(L->length>L->listSize){( n8 o+ b+ q8 c/ c
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    5 H( V2 |2 L1 r+ B0 S            if(!L->elem){
    - g' _" v% A( j                cout<<"增加空间失败!"<<endl;
    ) Q7 O5 S. ]) o' r, X3 j                DestoryList(L);
    ; s  [8 g! Z. A7 k            }) f- |0 e$ m& n; O  F
            }- @4 @2 U. m- u5 I' J
            *(L->elem+i+1) = *(L->elem+i);        
    : Y2 S0 r: @- W+ m, }    }0 ]- B) a' S8 o& P
        *(L->elem+e_where+1)=e;+ [( c4 `- E9 y, j' m; D: w9 S
        cout<<"增加后的线性表如下:"<<endl;
      [! z1 A1 w. o/ {/ N* n( W    ListShow(L);
      A* X' t. P+ J6 N+ M}
    8 b/ h, P3 D9 z3 @7 H" r' M
    8 l$ }9 h+ F" G& F) p删除元素
    ' w1 v5 i" {6 D/ W+ v1 f, Z
    / u8 |2 }& `% P& x4 Zvoid ListDelete(SqList *L, int e_where){    //删除某位置元素 5 W" m1 v( z+ }! C1 k9 o9 \
        L->length--;
    & ^" C' n0 c- p2 p. f  e    for(int i=e_where;i<=L->length;i++){
    # s6 D& I) U9 K2 V& S8 ?) I9 ^        *(L->elem+i-1)=*(L->elem+i);' [9 h; R- w  Z3 Y+ }& R$ s* x
        }5 V" s5 A$ d! O0 R, l1 `
        cout<<"删除后的线性表如下:"<<endl;
    ' \9 ~) a0 E/ Z! L    ListShow(L);
    + Z  U1 o3 \% p+ Z4 l( J" s, b}
    , W, c: f6 U; C& H
    " K! g& J. K  q6 \8 Y销毁列表
    - I6 r& o6 o7 T/ z8 ]* S: x- Y3 X) }3 W8 c
    void DestoryList(SqList *L){
    / m& k9 U+ [3 W    int i=0;1 U; K2 }. ?4 P) i0 V# S4 P8 x7 W
        for(i=0;i<L->listSize;i++){6 \( E' ]6 |0 q; Q0 Q% l8 X
            free(L->elem);4 f# h3 j2 p) f3 Z/ W7 r& }
            L->elem++;+ w) d; G; {! f9 l& z+ O
        }1 Q/ M, P6 U# r7 F
        exit(0);        4 a6 H' K* p: r- P: {- K4 A$ G
    }
    2 J7 [; u8 T* J, {' p: n6 n5 a. y" [  B& _5 I" }
    链式表示方法4 W- f9 K' G. q+ r
    1 k. ~4 }4 ~/ L8 H# C
    结构体定义9 q; o- N- V& i# P

    / y& @) e  o) y9 n8 Etypedef struct L_Node{- t9 K' O. A" u' g* A
        ElemType data;
    4 r9 H3 B$ |5 N& O1 x8 x    struct L_Node *next;/ w+ Q/ ?7 x/ C  G2 y
        //struct L_Node *last;    //增加可变成双向节点
    8 K  p6 U  A1 f$ o! g# F" q5 n}LNode;+ d& w" }& s1 L2 ^
    " d1 P  H! S+ J9 Y# w3 O
    初始化
    ' a3 B7 ^: Z8 f( O7 f
    # A, V' w) Z2 a9 Nvoid LinearNode::InitLNode(){
    + d+ Q6 c$ p, V$ M7 X    HeadList = (LNode *)malloc(sizeof(LNode));" h$ I4 Z" |2 A1 }/ l- |
        if(!HeadList){# J1 y: ?1 h* ?3 i
            cout << "初始化链表失败!" << endl; 5 v- n$ |5 S9 P: n3 K
            exit(0);
    ! P, J* ^! L* @# S1 @& b) {, _4 n9 S    }
    : `/ v3 E/ q1 w. ?& y7 L, q5 c    EndList=HeadList;/ J' a( D# ]5 G; h: [; U$ ~3 ?
        HeadList->next = NULL;
    : Z) _4 u: K$ _' n6 Y6 m4 X9 _    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;+ M: V3 f& O5 @+ J2 \3 P
        Length = 0;
    ! z+ P! c# n8 \9 A4 g: [    e_where= 0;& _7 ?9 l& p0 i9 N
    }6 X7 C4 E- v) W+ Q
    5 W% w, s: t/ E6 X+ _' L
    增加节点
    7 G* d$ [! A6 W# r) P. ?$ H
    & e* H! D7 i' ^8 nvoid LinearNode::AddNodeHead(ElemType num){    //头插法
    ; y6 @& ]3 @7 Q% h    node = (LNode *)malloc(sizeof(LNode));7 O0 w" f1 D7 ~3 M+ R/ c
        if(!node){
    - |3 H  |4 z" x* K- d0 d        cout << "新建节点失败!" << endl;
    " E! H1 O  u9 _) q# R2 I# G: C, F        return; 7 x; J: ?% G; q  N: J
        }
    9 m# \/ ~, ]6 A/ w  C    node->data = num;
    ' A! e$ m/ K/ e! p  y    cout << node->data <<"   ";4 A1 W+ Z# m' J4 W
        if(NULL==HeadList->next){
    % L& B: ?, p  |; h3 ~1 D! ?) @* A        node->next = NULL;* K3 a" m3 Z8 F4 O2 }6 U
            HeadList->next = node;
    : O2 i1 b! ?7 H- Q. ~; \; k. U        EndList=node;" r" ^  y5 Z" ?+ T
        }: i7 {/ s" W; C8 B) w
        else{, L' ~" w+ x6 f2 l/ f4 N
            node->next = HeadList->next;
    ' V; H6 j" x2 ^        HeadList->next=node;, G) J2 |' c" S" C: p: S
        }
    ! p- N, K8 E& M) E6 j    Length++;
    - ^# x1 Z- `1 K2 ]7 h+ a}
      B  D. x" m, ?& H3 t& U) b- o8 |' i$ H% ]  e
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法 & {+ G* c1 E* }$ M/ B- i+ T; j+ r! K
        node = (LNode *)malloc(sizeof(LNode));) d% h. j* e: o" O* P2 Z" [
        if(!node){6 p6 x* D% m: @- `$ ?
            cout << "新建节点失败!" << endl; & b( T' T7 W  {% Z0 e' _7 b- l; B
            return;
    - ]0 S# F* v+ b! q% L    } 2 |- [; |& w: E7 D
        node->data = num;4 t7 c7 c: C" y4 J! I  H$ K- U
        cout << node->data <<"   ";
    7 \1 q( k1 Z" X* o- B, r6 s- k# N    node->next = NULL;
    6 M( ?, u; w7 b7 k6 M- o+ K    EndList->next = node;
    ) e; C8 F" l* M; b    EndList = node;% P6 G' a; \' ]) d8 \: _
        Length++;
    ) v3 M+ N& k) n" K; A% X/ o}; |' t* Y! A: C9 u3 H. u

    ' I" F& ?$ U, S8 g5 q6 A# C2 p删除节点
    " c/ g6 C# Q/ @& z, q3 A/ y2 E9 r6 k# s0 @9 i
    void LinearNode:eleteNode(ElemType elem){
    # Y% H+ a: f8 e2 z; p$ [    if(NULL==(HeadList->next)){
    + Y  A( |( `5 y7 d' h        cout<< "无节点"<<endl;
    4 R* R/ b7 \  i5 F5 O% b. ^5 d        return; 9 `- y. o( W/ R
        }
    / D4 ^; i/ A/ W+ L/ s2 l6 w    Node_cur = HeadList;
    : b! V: \: y* g0 I& b4 |# X    while(NULL!=Node_cur->next){5 ]0 o$ C' F. z  w
            Node_temp = Node_cur->next;
    0 F% [4 _6 q1 }        if(elem == Node_temp->data){
    9 Z+ s# e$ D. j! ]6 [, a' H( @            Node_cur->next=Node_temp->next;
    7 P' C3 A# |. P0 F            free(Node_temp);" G. f  c, ]/ ^& e
            }
    , O6 O8 P- x( h5 M8 C( ?        if(NULL!=Node_cur->next)
    ) p# O/ O! b" J3 ]+ g" Z4 w6 }        Node_cur=Node_cur->next;
    6 ]5 C5 m4 ?& I: m$ T, M    }
    + C0 d! n/ k* G0 u    cout<< elem <<" 元素已删除!"<<endl;
    5 }& E# p9 U: Q. D" _}
    - v# ?) u. t/ n6 u" k, B$ A0 T8 }: N
    / p- p# t- f/ [! G7 t# m& E3 t/ K* F显示链表
    * x- y( T+ Z$ `' X: J' r
    ; d3 F8 @6 i! F5 l7 Vvoid LinearNode::ShowLNode(){
    " F! h8 i" a2 W" C+ C9 F3 T    if(NULL==(HeadList->next)){
    * n5 h% k* H& L" O* f4 A! x. S2 A        cout<< "无节点"<<endl;7 o* H2 j" d3 M  Y6 _( D/ E
            return;
    $ ]% e$ R% F0 L. ?# B% Z9 k: q    }% ^6 p% N) U! }- h8 Y& e
        Node_cur = HeadList->next; + e- {$ [- \) c- G6 O! ?& T
        while(NULL!=(Node_cur->next)){& h: s* l3 Z' a
            cout<< Node_cur->data << "   ";* o1 X5 y+ \  L8 J6 {+ J/ t
            Node_cur = Node_cur->next;/ P5 q6 _; W3 _! r; W5 X5 X' f" o, B
        }
    & G- {& m, G, t! J# t( x: u    cout<< Node_cur->data << "   ";
    3 b# D. ^8 O. G7 t! \% b# H    cout<<"链表中的数据已显示!!"<<endl;" }" j" W  J4 i% {8 u' U
    }
    / r6 N; {- @; R# L$ A
    7 M2 Y( J9 U0 U8 p5 L7 l3 r+ x销毁链表$ D6 v2 x, q0 D/ }1 Y

    ; A$ [3 z' e1 jvoid LinearNode:estoryLNode(){6 Z# S. B4 t' ]0 }8 h
        Node_cur = HeadList->next;
    8 Q  _1 g- J" f) ~& _    while(NULL!=(Node_cur->next)){
    ' Y) j) a: ?- p3 F        Node_temp = Node_cur->next;% {5 M; E: @. d. u; P; c
            free(Node_cur);5 h! L- D3 n6 I
            Node_cur = Node_temp;0 d% i0 `: o% {$ ~
        }
    / t2 F7 l9 a4 w  E5 w    free(Node_temp);; P$ }6 |( Q9 [- {3 \, n
        cout << "数据节点已完全释放!"<<endl; # z7 h8 {2 \  u- Y
        free(HeadList);    // 释放头节点 ) [% {8 `8 p2 F) J: q. ~4 d& U
        cout << "头节点已释放!"<<endl; : G% M" v! Z" C# E' B  w
    ————————————————
    7 w+ B2 L/ {  s# t! y! k版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 B$ Y# S6 C4 P  A$ t+ N
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    $ w1 H& z+ A, s; Y5 h; R2 k% `( Y8 f( G: o# Y) E2 [/ w

    2 M% j. v& x& t* d9 B
    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-6-16 18:53 , Processed in 0.578415 second(s), 51 queries .

    回顶部