QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1552|回复: 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 @- F! a3 [6 [+ S线性表顺序表示、链式表示实现方法及其异同点( I7 z; j% p( }' ^. V
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。; s/ a3 q2 j0 [: a! X' Z, s/ n5 j
    ! E) G+ b3 B7 ]4 |
    本文采用C++实现两种表示方法。& ^" k; H7 A8 @" J# [: z

    6 \6 G& u5 u; Q: {/ b( H1 m目录8 |" P  f* W7 Z) X: `. M" v- K" r6 f

    ! c7 W8 ]8 t1 J% b( H' O顺序表示和链式表示的区别:0 b$ B& B$ L6 q' z/ `9 |- N1 E! U* r

    ! v/ ~; C( x0 T* q3 A, A, Q" r9 h创建方式:) h" A  d" p7 O
    1 w6 h( N% v' z: @9 [
    时间复杂度:
    , V! \% H4 E& E( ?5 @% z+ n  [# d) ]) V8 X- G3 y
    顺序表示和链式表示的相同点:
    - q. V- m9 s; G  W. I0 w/ o- l& E4 N% Y; W+ Y4 h) v. S% W
    删除内存空间:. @' z& i" S; q- C, H# @
    7 e2 j5 e- `& a- T- Z
    代码实现:
    & p3 v8 l8 B) F) o  W# L7 s5 {2 J2 T& I( a
    顺序表示方法:% C  e2 l: T* V; p8 K

    & e; Z! {3 i( h! g6 I结构体定义
    2 e" M3 R7 w9 }8 p8 j
    # E/ N5 `! \3 T  r+ Y1 @8 R6 w初始化+ C; E7 }2 C1 j5 `- u- e# U: ]6 B
    $ E/ [0 x- s* J2 Q3 p
    增加元素
    5 M# ], C. O4 `: E) D+ ^; C" ^0 R+ j$ ?  @& T
    删除元素" _* G% \; E. ?' M$ L

    0 c7 i& d* G& v9 C/ R销毁列表5 J( r: r; z! t7 a  _2 Y

    $ U" Y# z9 S2 V! \9 O; ^链式表示方法9 f+ c" o0 f5 C" E

    ! B- p' G" ~  X% B) ^4 }* V6 _" e结构体定义; }& ]. G. y* T5 r( M: }

    , O$ M* M7 o  t/ {3 b- r' F9 I初始化" Q  k. u* c) C2 l% R
    + X: A' z7 m& ]8 W# @% a; J0 o+ ~
    增加节点
    0 l7 {( M" K% M8 H9 M: j# m
    ( l9 F, j! U- t- c5 }删除节点
    5 X5 p1 u) E3 m  o& H) M$ H/ O0 @8 K  j6 k. [6 v. ~# Z
    显示链表
    & A4 Y+ k  x/ R0 d/ p: C! g1 t
    1 H6 c* j* p: B; L% O6 B- O销毁链表
    & `8 _, U$ \% `9 x( Y6 ~' ?4 s/ V! V3 S# M
    顺序表示和链式表示的区别:
    2 F% C! E# i! M& N+ u+ [! B* |; l: X! M4 B$ z0 ]; l
    创建方式:$ G! ]9 |1 A# A" O+ m! }
    * x, T$ l! b/ f  ~) t0 f5 i
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    / X: {  S' q! ^% [- n, G
    * e8 K+ |. P* X(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    ) }8 ?# S- ?& z8 n5 w6 C6 b# D; U
    . B2 E$ w: k" `$ }$ z) F( T! ]链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。7 c4 b5 ~% H' i

    " {- l2 Z$ N+ w& @' T时间复杂度:
    + u! @6 _% V+ r; C- ^. `( O% w8 L2 g
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)$ T/ E: Z- @8 C
    5 K+ |9 J, E. V; w9 q* `
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)# q6 S2 f8 l, p

    ( L4 v; n8 m  `  OPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。8 H  Z# S4 S( \$ A- ^
    , p1 y7 z: @9 E4 d* |# ?3 Z$ K: }
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    - a% f2 ?& [* b7 j3 J: h
    ' e$ `& @3 i3 m( D: B- a4 y查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    4 F, {* P( j+ q
    2 V/ c3 V. I& _; r/ |8 f顺序表示和链式表示的相同点:
    " r/ Z2 L8 k' z) x) n  P  l  @! [+ E# j# n8 C3 J6 P# `
    删除内存空间:4 u/ I0 r5 F: }- w

      Q! p& o9 I6 L+ q内存空间的删除都需要对每一个存储单元单独释放空间。: d# a9 q$ \0 j: O5 \0 z

    8 Y+ ~- y7 o& t% J代码实现:) L5 b9 [* c6 L: v/ g. `. G9 L$ p. b
    3 G: a4 m. G+ Z' Z) r
    顺序表示方法:
    ; U8 j6 Y; G  N5 y7 l6 F9 ?- Z9 C9 r/ ~. w" W& W' d/ W
    结构体定义
    0 g5 ]  W/ A6 n3 q5 X6 s& }5 o' \5 ^1 N/ u
    typedef struct {- A; S# Z4 _5 j) V) O
        ElemType * elem;2 S1 `- x0 ?0 ]8 J. Z$ E) V
        int     length;        // 线性表的现有长度 % D; E0 U/ t- Q9 Z4 K3 ^
        int        listSize;    // 线性表的最大长度2 I6 t& X9 C) ~1 A5 J& N
    }SqList;
    1 M2 ]7 O" y, y8 w$ ^/ e
    $ @+ n$ k- ]9 I; {3 K1 L& h初始化) {$ K. x. G) _) _
    8 H- I9 E5 e" I6 F  {: u1 Y$ C
    void InitList(SqList *L){
    ) J& b7 {* ]+ b  X1 D, f    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    , u0 s- Z7 |7 q& `( a    if(!L->elem) {9 N/ a2 O! F2 d  Y: x" z
            cout<<"申请空间失败!\n";
    7 s$ u/ c: M- d8 B2 ~        DestoryList(L);
      J" O  ^7 e! j! ]    }4 F' s: w: J& L, r5 x
        L->length = 0;
      d5 m9 T% \6 c1 C5 `    L->listSize = LIST_INIT_SIZE;
    " D2 {2 [% S5 S1 n) N) u! d9 e    cout<<"线性表初始化完成!\n";1 o# d$ N) y" Z$ O7 b1 Z4 d; M$ _
    }3 o8 o4 I+ A4 C" q3 }  ~

    + ^6 ?0 [, C1 w2 I0 `: X7 e9 N) G增加元素/ Y/ e; ?- c/ D6 n0 h
    6 U2 n4 X1 K9 s# @! {& w
    void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素( ^5 K7 J$ v  p  C2 ~
        if(L->length>=L->listSize){
    % {" E# u1 W  G. k, M$ P8 Z        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));- f7 O- D1 t5 `- E$ C! x" h
            if(!L->elem){% R, u2 e0 b+ s. N
                cout<<"增加空间失败!"<<endl;
    % u# J  ]- G: r            DestoryList(L);
    + ^  s+ h0 r  [  _        }" ^& f$ z+ G3 z0 m& D
        }
    ! t0 @: d& H: r% `* [    * (L->elem+L->length) = e;
    $ ?; h: W4 v% t    L->length ++;    & i" [! _( F$ X. H: f# _$ ^" p
    }) L/ b$ t9 z1 O! x+ S

    - t8 S9 g9 v9 Y) e$ ?% W# Ovoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    9 X& M5 W1 @: w' e' {    int i;
    ! u' a( S' l, Z, l9 ^$ [1 S* y9 g    L->length++;$ _* r& }/ N8 z. I+ R8 [& M! z3 x
        for(i=L->length;i>=e_where;i--){9 T) h0 O' C9 S( A3 S
            if(L->length>L->listSize){! f+ ]2 N9 L6 Z
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    - N* r( Q/ @# `. u0 Z5 ]            if(!L->elem){
    + Y# r7 W4 Y" q& |+ G                cout<<"增加空间失败!"<<endl;
    ; W  W1 T* d5 T" c                DestoryList(L);
    3 _5 H8 @/ g2 Y% B$ m            }
    0 D6 m/ J) y" y6 m/ f        }% l+ r1 P! Z* ^( ]: I  Y
            *(L->elem+i+1) = *(L->elem+i);        
    9 V4 j, }7 b3 Y( h/ ]4 y9 U5 h2 N    }
    . D; q% v0 p% i, H% V+ Y$ s, o    *(L->elem+e_where)=e;
      A; ~8 G0 |6 b    cout<<"增加后的线性表如下:"<<endl; 2 C$ v: h! B3 K6 L( }" z
        ListShow(L);* H- {) c/ J  n  H, O0 X
    }
    1 M  W( o( b# p2 K, S/ e6 c8 _1 Q- u; W. ^4 o2 s
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素" q! T5 d  r! [2 c- q* J
        int i;
    * d' ^4 a" J  @+ B7 M    L->length++;8 H8 x! `7 \; m7 ~! Z+ k4 c9 N$ k' O
        for(i=L->length;i>e_where;i--){/ A1 S$ t9 d% ^* Q8 B9 [; c! [
            if(L->length>L->listSize){
    % H/ k7 r5 r1 x' |, Q* g6 v  r. x: P            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));2 [0 G5 ~$ g7 _6 R6 `7 E9 L
                if(!L->elem){
    + a; X1 @- y0 ^2 K# W# w, G, K2 k                cout<<"增加空间失败!"<<endl;' X5 d+ [. p" k/ n: O3 O
                    DestoryList(L);
    . t/ Q1 x6 M5 Q7 P7 s* |            }0 U) a* c- p; x, C7 G/ c1 F) t
            }
    ! I0 C2 ^$ U! z$ V) R- l* M5 l: \$ A        *(L->elem+i+1) = *(L->elem+i);        % c/ u8 H# w, `6 m' o4 S
        }
    # I4 J& B% D8 I" @' v4 ?    *(L->elem+e_where+1)=e;
    % w+ H3 V1 q2 I    cout<<"增加后的线性表如下:"<<endl; % M! |% P/ L# k2 Z1 d
        ListShow(L);" }$ D- P, m, Z" Y: ?6 c
    }
    9 `1 `" j& z9 M2 [  p5 W; W3 y- c+ K( \) o/ K) p
    删除元素
    & Z: b, F& y7 h/ S3 m+ Y
    4 a+ v0 r$ H: O' i" X2 Cvoid ListDelete(SqList *L, int e_where){    //删除某位置元素
    / H6 i# M2 C1 x& e9 W. m7 \    L->length--;) e* L  e/ H* C- E4 `
        for(int i=e_where;i<=L->length;i++){2 e6 a( m# M) {$ K0 v6 S4 P. w4 g' c
            *(L->elem+i-1)=*(L->elem+i);" }" f. ^% d! J# D
        }
    . m! k8 s# I+ h- H' f    cout<<"删除后的线性表如下:"<<endl;
    # o6 `9 @* @- g+ L6 `9 q" C    ListShow(L);& K) D9 q+ ?- Q3 T; g* ?$ q" z2 g
    }/ [6 m: E# I' H$ j% F3 P4 [' d

    ! `1 w. W: G+ y5 x销毁列表
    . S# {- c, I1 }  j- Y; U! b9 L& l" j3 ~5 U9 B- P& H: V
    void DestoryList(SqList *L){
    9 r+ W# N8 @& `, x& {  S! U# d    int i=0;3 l; W7 s. ^4 ~' [( \) v% z
        for(i=0;i<L->listSize;i++){$ W8 |3 j7 p; k/ v
            free(L->elem);
    2 s2 l6 y: \, _4 u# n' ?$ o- f$ d        L->elem++;* K+ Q& G1 S7 N1 O. v
        }( t# n; u4 Q& |) h# Y
        exit(0);        
    ; t. N9 E& \" Y% x, w/ J& D+ O}
    ' _/ X6 q- _" j; h! g; o; @
    7 u, v6 e' N( C8 f9 i7 i+ u链式表示方法
    $ T, A) r# d6 A! E& Y$ E
      D7 Q7 x* j6 s$ j; ?5 I( n' w/ s结构体定义
    5 L; T" j% I8 Z3 ?" j
    " E- O  F* w4 i& B* f7 r8 C0 Otypedef struct L_Node{
    % t' ?% Z' h# n# h  l$ b" r! o( l    ElemType data;8 y, o* c) l. C4 N% F1 q3 A
        struct L_Node *next;! _* l. l9 N- M+ a
        //struct L_Node *last;    //增加可变成双向节点 - b/ X% B8 q! ^
    }LNode;
    ' j; _. s+ C; T
    6 U: n4 V5 [) c初始化
    # h! a" o0 I5 K! N" |% m: j& J1 b: e* ~3 K
    void LinearNode::InitLNode(){
    8 ~, h" B2 B8 A3 M( ^    HeadList = (LNode *)malloc(sizeof(LNode));
    # J, o& ~3 O: W, J; S0 m2 i5 I    if(!HeadList){
    * i. ]1 K6 z% |8 x        cout << "初始化链表失败!" << endl;
    - o. c3 i+ m5 |3 B$ K( `. E        exit(0);
    . A5 t: c8 J- _" `0 n  o    } ; O; f9 [7 }4 r5 z. ^. d+ Q
        EndList=HeadList;" k1 X0 W, _4 |( P- l2 y
        HeadList->next = NULL;
    3 R. A4 \( W8 V3 m2 p" U    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;3 v# X0 i! D( k
        Length = 0;7 @5 ^% |" @6 A8 r
        e_where= 0;4 W' R( z0 c& x$ k; q6 e% m6 J
    }
    ( R/ Y" ]4 |* v: l
    ) [7 t/ v9 X8 e. J! z增加节点
    # J- ?& p0 ?4 F# U' b! k+ g
    # C2 }: i2 k0 ~' J: @# tvoid LinearNode::AddNodeHead(ElemType num){    //头插法
    " Q- N2 v9 t! O! z5 ^    node = (LNode *)malloc(sizeof(LNode));' \' r* Y! O3 `6 P- s3 o1 ^6 J
        if(!node){
    % O0 ]* v* ]5 H3 s6 n        cout << "新建节点失败!" << endl;
    ( v* K+ \, f) `        return;
    ! O  o# {" C* z# z    } - `3 Q" O' v" I+ S* x$ y1 a
        node->data = num;7 `3 T$ p# u# K+ ]( U4 n1 D
        cout << node->data <<"   ";
    # ]5 L. _; Z! T/ o! N5 q; g0 k    if(NULL==HeadList->next){
    ! W7 U1 \, Z) W& @# r        node->next = NULL;; @$ W- G- L( v3 {+ k
            HeadList->next = node;
    ' s/ M0 W6 {& ~* i/ o% ~: r        EndList=node;( J' a" v1 N# U* N0 h4 d8 H
        }# d% C$ E+ h' ^$ S. B  y3 d1 y
        else{
    # ^# h0 J( o. n1 b) M# H        node->next = HeadList->next;) _: z( z* J. d% W4 G
            HeadList->next=node;& P0 ?4 ?( o8 b
        }+ i4 t) z3 Y& r
        Length++; 4 K7 @: o  c; x3 o- [7 p
    }8 K) c" j9 Y! x2 X& [# L* q

    , Q7 L) y% A) \void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    - f4 p: J: M+ K0 ?5 k    node = (LNode *)malloc(sizeof(LNode));* D9 G+ ~* o  V* w
        if(!node){! l; b1 q  L" M7 h% C
            cout << "新建节点失败!" << endl; 6 d& R9 E, M0 v7 @- R
            return;
    ! d8 W3 Y$ S2 Z% ], g+ c. f    }
    2 [$ E9 ~! I$ ^4 r    node->data = num;9 p; q( z/ H, h1 @
        cout << node->data <<"   ";" L) V2 Z8 U- H4 T. {# B* W
        node->next = NULL;+ _9 s& O! X3 [$ n9 n
        EndList->next = node;7 r0 f+ o, H& X1 B, v; {& v/ U
        EndList = node;
    ( z6 {( P: _8 ]# l- ^* s' i    Length++;
    1 W6 k9 ]. W5 q' F/ \}( z0 I) N1 \' Q, X  l8 D! n8 I

    & |) ^3 ~: t1 O  a7 S; H, s删除节点+ M% {' O/ L: D8 N. K. ]; Q# R

    ) O; G, u/ b" X; {- E4 A6 fvoid LinearNode:eleteNode(ElemType elem){
    ( y+ O6 E. h* v6 o  f    if(NULL==(HeadList->next)){- A, _& Q6 |0 ?0 ^3 y, ~6 l, r  h& Z
            cout<< "无节点"<<endl;
    . b: O6 \& R5 A! r2 O        return;
    6 _/ g2 X0 V( `# ~9 Q# k, n    }
    $ B: T4 [8 h# i" W& z# N    Node_cur = HeadList;
    / L5 t! Z2 C  d- _0 B6 F& n    while(NULL!=Node_cur->next){
    ( Q, K4 ~3 }5 a! A        Node_temp = Node_cur->next; ( Z" o! L( s7 e! ?
            if(elem == Node_temp->data){  Q2 v" Y0 I) ^" v4 H
                Node_cur->next=Node_temp->next;
    # u/ m( O  f2 b3 m& }9 `            free(Node_temp);* \' n  l8 \* k% m6 C
            }; H" y6 A  x& u  S  L( Q
            if(NULL!=Node_cur->next)% u: G0 M- E+ _( q* e7 h0 e4 ]
            Node_cur=Node_cur->next;
    # I: K# C- D5 G6 O" G; q    }
    - U$ F& H3 }/ e% L/ {6 _    cout<< elem <<" 元素已删除!"<<endl;
    + W' t! v! m  y, h8 i2 r3 e+ T1 J! y7 w} 1 d9 a6 e: N" x5 _9 k* m" R

    & {! F' _  g; `3 A& [# W) ?8 u显示链表
    2 w- z: u( D' e9 }8 ]% ^0 D0 C- l
    ) Q+ T- j. e  e$ ~8 p: kvoid LinearNode::ShowLNode(){4 X# D0 f! [/ J2 h" f
        if(NULL==(HeadList->next)){
    7 H# u# d- t2 x7 g        cout<< "无节点"<<endl;
    . y1 `& ^3 J6 \! N& C' G: o3 u        return;
    5 k9 r0 u* P: _. q- U    }
    + {3 b( v4 x5 U2 M9 }: U    Node_cur = HeadList->next; 8 K9 f6 ?8 A, J( L
        while(NULL!=(Node_cur->next)){
    8 S2 y7 H: |8 O+ U1 ^& p+ l        cout<< Node_cur->data << "   ";0 U$ |: l& h, d  S9 \8 f
            Node_cur = Node_cur->next;5 b! S- i: B3 a' }' B
        }2 j  {1 z8 p2 Z- P/ m/ \3 Y. a
        cout<< Node_cur->data << "   ";2 s( f* O/ n1 O! n& q' g
        cout<<"链表中的数据已显示!!"<<endl;2 c; D) s  P8 H2 [( q4 p) Y
    }
    $ e& o7 k% f) I7 A( e1 B  V0 i8 E6 q3 c6 j! J
    销毁链表
    4 ~  a. M, e8 z! m( y1 a6 `. x6 Q1 R# }
    void LinearNode:estoryLNode(){' [. f- ?) n: _: B: _! H- x
        Node_cur = HeadList->next; % w; I' i* X# t, t% p8 g
        while(NULL!=(Node_cur->next)){
    & |/ s) ?3 F8 R; n2 `        Node_temp = Node_cur->next;
    0 |  l6 q" b  d' y' X        free(Node_cur);) b. o# u  E3 B( l
            Node_cur = Node_temp;8 `* i9 e% i5 k0 @5 L% g& t2 Q, P
        }
    4 [' n% P, m1 s/ X4 h) j    free(Node_temp);
    2 m  x8 M( S+ j  r0 G4 a    cout << "数据节点已完全释放!"<<endl; 2 A8 h) o) p7 K+ \+ l- k) C
        free(HeadList);    // 释放头节点 $ o( f! ]6 f, L$ T' H$ F) d
        cout << "头节点已释放!"<<endl; # O- O, {" C+ _1 b
    ————————————————
    5 ~( T5 Q5 \( e: ?3 B) l- V版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 ^7 z$ i3 G/ ~- q% a
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    ! T; R, d% U% I, N6 {7 j' i3 h! ?% K4 K  P
    8 T/ p* O8 B5 F6 I7 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-6-9 20:09 , Processed in 0.630082 second(s), 50 queries .

    回顶部