QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1420|回复: 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

    ) U: i  Q7 c' k) K& B6 X线性表顺序表示、链式表示实现方法及其异同点0 s: [2 d3 y" P
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。
    ( a: K' J  Q6 A, S# T0 e/ X! \: i0 X8 i
    本文采用C++实现两种表示方法。
    8 G$ V% c0 q* p8 z' f7 ?$ Q8 J
    & T& _$ c& J3 a9 N: ^% @: ?目录, c/ p. n9 e) c/ _$ n( `

    ' M4 ]' z0 ~5 ?+ I3 C, W! ~: l' V, L顺序表示和链式表示的区别:: x9 E( I7 B0 t& h

    $ l0 Q: t. X$ ]2 ~. b5 I9 X: M创建方式:
    / a' \' Q5 v' g/ F# M. O* W' Y% B3 T
    时间复杂度:0 Y1 R9 L/ N: m# I
    4 p! e" g' i, ~8 E" u) I4 `6 I
    顺序表示和链式表示的相同点:
    . y* K* F3 q. w! {0 f* ~# ~" e* k* p8 O4 Q: B% _
    删除内存空间:. i% J6 W+ |9 K5 [: t1 c$ z
    ( |! h$ N& ~6 Y0 N3 ~; e9 j
    代码实现:
    4 _3 q  `) \/ D6 m
    . B+ Q3 @8 ^" p: g3 ^顺序表示方法:
    7 @  U+ f$ a' M* t. N6 {# z& p* p
    结构体定义
    ! z" E& f; T4 a5 B/ Z: M. T& K
    4 I  Y: q& L) l& K9 i初始化
    ! t, v7 n8 n3 g7 V) O. @  {& o4 I8 L7 V% A0 g1 c6 V4 y& W
    增加元素
    ) g) X% G! T; h- Y. ~8 ?7 d0 ]2 t! [) Q' v. d6 Q# K- l& p- X
    删除元素
    ' h( M# d* w/ Q* j4 f* Q7 x( v: B$ G1 d5 I! x
    销毁列表
    . f6 X2 L  D. v6 D# W8 L; H# E. q1 U4 e6 V
    链式表示方法
    2 n# O; X6 K( T. l
    . i! l6 e; y! G* C结构体定义
    + o. n. V& F; {# Q, m
    * J9 V$ s7 E6 ]初始化: d# c2 |4 N  E' l

    ) |7 K7 p4 V( ]% u4 Y: d" d增加节点4 U% s- B+ ~6 a6 s7 _. }

    5 k, M2 e4 U1 V4 p  G' L删除节点2 S" K3 P+ U$ t

    % Q5 \# w- ], B: H7 n& H显示链表) i3 a; a1 j2 l. i7 q

    ) f5 X/ B! u8 F/ a" K9 E9 u1 e销毁链表* _9 m6 a& r) P1 F3 q3 J3 G, F
    9 P% S7 n$ M% @& }$ ?
    顺序表示和链式表示的区别:
    ' Q! F: T% F/ Q/ G! \8 }" x2 _9 i2 o# k2 ]; S* d8 X
    创建方式:
    . ?* a, n* O5 A* B5 V9 {( q+ d3 s# F, |$ q1 k2 @
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    / Y  l8 Z3 m% J% {  k
    8 @2 ]) y; D- |- Q! M(PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    ! B- S6 |- \$ a! K& P- K  {: D' ~6 {
    * y- t( t3 V1 _, s5 @链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。
    , \- X6 ^; J7 Y1 {2 f9 _- o' E7 l8 O/ ~
    时间复杂度:8 F4 e# b# g8 J
    4 }, ]9 ?) l/ D* O6 a
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)+ v9 k4 U. N! L3 q( K, Y! A+ B

    8 n4 D7 B- S% a9 S增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    ) y+ j: Z6 M2 m4 s/ [  Q+ ?8 w! j
    ( @+ s& m' V% W3 n- p9 QPS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。* @% x: t+ i: F/ r! V4 [( ~. \
    4 W3 w8 d1 ~) q. c
    修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);7 B( I2 F; M0 C" Y4 v( u; a

    , z' p+ n' O" O5 V- @1 G查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    6 o5 A3 Z0 p( V9 j6 V# Y
    ; {; P( Y0 X- R8 A2 o# o2 p顺序表示和链式表示的相同点:
    6 \$ B& G* L- \& M) K9 B# v7 ?, A' C
    $ L; K% ?% s$ j7 m1 p3 y; y- L! e删除内存空间:
    ! ^! a* `+ _  w! E# s7 L. x" e8 |" Y1 D/ S5 A5 a
    内存空间的删除都需要对每一个存储单元单独释放空间。4 E# p1 ~" R* O- c& Z) H

    ' N; L/ |6 U7 i3 X. V3 [代码实现:
    ! |2 B; c3 x0 d& B4 z6 c  |. Y3 p, X3 d" C% p
    顺序表示方法:# u3 m& p' \# v! p% s, f: v

    : _) L# `- n% [1 Z结构体定义6 Y6 {/ j4 l+ p; ?

    + s  p2 Z9 D# H- o0 K3 |typedef struct {
    1 X7 \% `5 E# k- z9 j7 E) \    ElemType * elem;
    ; s5 J- n8 A- Z: Q5 b    int     length;        // 线性表的现有长度
    1 V3 e' v- R: ~/ q; d4 j, l1 q    int        listSize;    // 线性表的最大长度" F, Z3 ~9 f0 h. G# u" \) N
    }SqList;
    % U; N  E5 F  Q# g) X( A! D
    0 \! a, \: f# i. i初始化
    ' ]" ]5 e( o; \: L6 A& i. o" J7 v
    / S& \( e6 R, @1 ?, W+ @$ Avoid InitList(SqList *L){
    $ K8 o- d. H7 u1 i( K    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;
    * U( H5 C4 m& `9 A* X7 f0 Q: ~    if(!L->elem) {
    3 O3 m: t  B0 D7 Q3 v/ T        cout<<"申请空间失败!\n";) Q8 f$ g* N4 z! ~8 t8 ^
            DestoryList(L);
    ) D# ]. w) L  t1 Z6 S4 C    }# W, R* b- s5 }" P; R
        L->length = 0;  w" t8 ~; }& F9 t7 P1 s% W8 {
        L->listSize = LIST_INIT_SIZE;0 S' ~" w4 z+ q' e
        cout<<"线性表初始化完成!\n";  B* z' z9 [- N1 m* [, V' u
    }
    ' D# R$ {3 B" [2 s8 o
    - T( F7 h+ _4 W+ D' E增加元素; ~# k9 h( O: M+ S

    & x- R1 E. s' l, H+ h5 P4 @void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素3 {9 D* p$ [/ K5 m9 i
        if(L->length>=L->listSize){
    , p3 K* m" i4 ~% X3 e        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));7 ~3 B" }/ M% Y" v' d6 _
            if(!L->elem){% ?! V. j) p' j2 r* C* L0 c; t
                cout<<"增加空间失败!"<<endl;
    : y6 U; h  F3 d/ J5 E            DestoryList(L);
    ! V/ S: {$ n& z" I2 M. `        }1 T% M1 I3 r; `& b2 J! a* n3 r3 N- u
        }$ h6 A) e5 x, C% z5 E
        * (L->elem+L->length) = e;  V6 }+ d/ }; z* K" _  T
        L->length ++;    & F3 S  t4 |( M4 {
    }
    ' I; t, @9 E  K, j) W3 @; {/ h; U
    ( u: A( H$ Q, A, g' Pvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    - ~( V& C2 D4 ~+ s9 K) A! ~    int i;
    ! h  c& z  ^! K& G, p% |    L->length++;/ e5 k7 e! z0 s! `
        for(i=L->length;i>=e_where;i--){
    7 E' D' I+ _! x3 b1 Z        if(L->length>L->listSize){$ X$ z: A: y' h& n0 Z9 }
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));( h) W: _& J; E
                if(!L->elem){
      b) R1 N5 C7 H/ u% @                cout<<"增加空间失败!"<<endl;
    " F. p# N, |8 t7 I. P! z                DestoryList(L); ( f+ x) [/ G1 g3 g, Z& ?) P
                }
    ! A7 @; j* m% C/ o        }
    # M# w' B5 `" z1 {- r5 w        *(L->elem+i+1) = *(L->elem+i);        
    / o1 {+ W& w0 d; x    }- w1 Y/ G) ?/ M( t9 p; L% y8 u
        *(L->elem+e_where)=e;8 L% B! ]& f# O, I: ~) P
        cout<<"增加后的线性表如下:"<<endl;
    / b: R2 Z- z# E* D4 v0 i$ f    ListShow(L);$ ^% R3 [8 I1 i) Q3 d' Z
    }
    4 P8 ?! H& d* j
    ; H7 A# B' B, Svoid ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素8 p3 S+ A5 F: _( D6 m
        int i;
    # H: t: D5 F# V) P    L->length++;% g2 U$ F4 ~8 o, |1 p6 R+ g2 G
        for(i=L->length;i>e_where;i--){
    $ u7 T8 d4 p& R        if(L->length>L->listSize){  Z9 c) W! @# K" d: H
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    . z: g# s. s1 i7 i0 f8 o            if(!L->elem){1 O6 D- z- M6 w2 G. n, B/ O+ t9 I) D
                    cout<<"增加空间失败!"<<endl;
    7 Z8 W! r* l0 C# @                DestoryList(L);
    . V  c' Z9 h& u& J            }; M% M: [0 p6 D& m
            }
    . K. S7 B4 O* U/ n- C" W# ^        *(L->elem+i+1) = *(L->elem+i);        " R9 q5 y4 y+ J6 Y& E+ c. S
        }/ G& @, i  Y  i1 W7 m8 B; M
        *(L->elem+e_where+1)=e;
    - q1 d; D3 {, G# L7 H) Q    cout<<"增加后的线性表如下:"<<endl; ; m8 n# _: Z0 D  V
        ListShow(L);
    , K- O0 ~9 E7 G& [) c9 L}2 f% J1 Y3 {4 {+ ^- k0 i9 u
    " B3 |' I$ p9 x( _  S
    删除元素; H+ \2 r$ i1 R/ R: `

    9 `( g3 p0 t) Y6 X% P; p' {! dvoid ListDelete(SqList *L, int e_where){    //删除某位置元素
    - ^& L" h4 Y/ c0 h* x    L->length--;
    6 w+ m% b$ Q* U    for(int i=e_where;i<=L->length;i++){, ^8 M- B; G7 q: O4 G
            *(L->elem+i-1)=*(L->elem+i);
    + Q" H) q- T- R; ~! a3 Z. Z    }
    , j7 V. N' x8 X4 R9 \# g- @    cout<<"删除后的线性表如下:"<<endl;
    6 O' v/ I) Z$ D7 I    ListShow(L);
    3 m- R3 W7 Z# B}& S, w" w: v2 w
    - N+ s6 `, [' I0 L
    销毁列表# f/ d' ]4 P; A2 _, G5 Z
    6 P& u' {4 L2 @' S. w! z6 P
    void DestoryList(SqList *L){; c# a3 ]$ u% ?' O; R( M
        int i=0;' ~0 d- i# ~- I0 I! \6 e
        for(i=0;i<L->listSize;i++){! b7 I  o$ N; O2 g
            free(L->elem);! W) k# a. a0 G, U6 t( x  j' G, B
            L->elem++;
    7 b: q9 A4 E+ b5 M; j$ i    }
    . M) `. ]/ ~0 z) Q" h9 ~3 P    exit(0);        1 n  w  k2 U; }7 L& V3 x
    }4 i$ K% a* u- @$ }* ]) `
    5 _. ^9 a- q  K6 o' q+ n3 e( C
    链式表示方法7 i9 _0 H5 @) s5 ^
    : X# F3 b& `" X& z
    结构体定义
    8 N; z( X8 S) V
    7 z: J8 h5 V6 i/ Z+ q6 y5 xtypedef struct L_Node{
    : K! Y8 K% S. b! j# @/ r    ElemType data;; f: l# h0 _3 m, u4 B0 _* J
        struct L_Node *next;) ]3 r) i8 @% T- N6 ]7 B
        //struct L_Node *last;    //增加可变成双向节点
    * s! {# w0 e9 q; x}LNode;
    3 p$ m+ v  D, w4 l4 c
    ! ~. V$ d6 @5 H6 W; a7 i1 n! }初始化
    4 Z) {. c. A) y8 r+ o
    3 H* e4 |" |6 r# @( j+ Q: nvoid LinearNode::InitLNode(){
    + r0 [0 a. [( f    HeadList = (LNode *)malloc(sizeof(LNode));
    0 V7 L" d- B; \; }5 \' y" h+ h4 M    if(!HeadList){
    & ~( A/ I" x, `6 t' \5 T& g% X) k        cout << "初始化链表失败!" << endl; 3 y2 j4 E. ]: B& l/ H: X  j) d: S7 [
            exit(0);
    9 G9 D$ e6 N5 [4 s1 Z6 J& I    } / e: _: Z, J6 s- l. ~/ O: D8 U
        EndList=HeadList;6 T* c  U7 _" B; Q$ _3 q3 X7 j
        HeadList->next = NULL;
    , q* S  c" H! x# b( d9 X/ K3 U    cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;& B) s- C/ Y9 x$ h2 V; z
        Length = 0;
    % m! W& Q) Q" k    e_where= 0;
    $ Y0 w9 V% N# ]4 s3 _' y}
    ; P1 G4 @. i( i6 u2 }% e
    ( ^) ^  e7 Z4 N  S增加节点
    / H* ~! _: z8 x8 ?+ h, U( O2 J0 R1 `7 }; u* C, }# ?
    void LinearNode::AddNodeHead(ElemType num){    //头插法
    ( }; [' e4 a" t; g9 w4 ?$ L/ O    node = (LNode *)malloc(sizeof(LNode));
    - ]; \8 _+ R7 ^2 X    if(!node){
    8 s( p9 i: A" t: K; W+ l9 p( ]        cout << "新建节点失败!" << endl; / N$ ]: E1 t, A7 Z9 K  G, H6 e1 Z
            return; 7 p  M1 _' V6 L* j6 q  _  N
        }
    2 ^; Q/ f" s: y; E3 e, {    node->data = num;* {; Y' S8 W$ W' e4 s+ y) V4 ~
        cout << node->data <<"   ";
    . _' b! F7 B( W) {- S    if(NULL==HeadList->next){$ h1 K3 R0 p: S+ b; d, s
            node->next = NULL;
    . [; r  l) U/ S6 U. M% R        HeadList->next = node;! i2 E, F* x9 J! x, C, k! f
            EndList=node;: |: e7 D) s! C+ J* Q* o
        }
    * `; K( V( Q( V, d  p, [    else{
    7 q+ |" D0 M9 |5 |) e        node->next = HeadList->next;- Y! d; u  }! n! B- p$ K
            HeadList->next=node;: z+ J) t* U; S9 l+ E
        }
    3 }$ }5 ?, K3 u    Length++; / |! E2 T2 i* p4 ]
    }
    ) c# N7 H6 }; s/ k. H3 Z2 f: M  O, b  }$ M7 K7 K" Y+ Z% d( J: |" {
    void LinearNode::AddNodeEnd(ElemType num){    //尾插法
    : o( ~; V% b; d8 o1 J    node = (LNode *)malloc(sizeof(LNode));0 _4 J9 Z2 u5 E$ Q" r
        if(!node){
    " f3 e" z; r, ^+ H' q        cout << "新建节点失败!" << endl; , n) B" q+ n0 o3 d2 ]3 m& N
            return; ; M# `4 i2 b. K6 T8 F7 u: }1 H
        }
    ' I2 Z7 G4 r3 b3 ^5 H% l: M* ]4 C% b    node->data = num;
    * C) x4 b  f* l* I/ d& D    cout << node->data <<"   ";7 I' ?8 c# B' ?* a9 Z
        node->next = NULL;# f7 h3 u% L3 d, n
        EndList->next = node;4 m: P- Q- U3 l: \
        EndList = node;
    ; ?' A1 `3 ]2 G- P# P2 o    Length++; ; O) m8 e# r. F! b
    }
    2 J1 }; i* Q0 ~3 r0 [2 q! S+ R+ N5 A* K! u: o
    删除节点
    / n' R# V7 I, a8 e( o- P) D: j% K% K' v6 u' f0 |
    void LinearNode:eleteNode(ElemType elem){
    ; x2 ^3 l- B& n' j    if(NULL==(HeadList->next)){2 }( K2 I0 Z5 I# }5 g/ S' w" a
            cout<< "无节点"<<endl;3 X" l9 A. U. D! b, w2 c' Z
            return; % |6 C! ~+ @2 f  f7 h
        }/ s' k8 Q! S9 {: J$ V2 u" R  v4 R
        Node_cur = HeadList;% j/ q5 T5 C* s4 I8 j. J5 i
        while(NULL!=Node_cur->next){2 a# q9 F' Y9 R; K2 Y6 g
            Node_temp = Node_cur->next;
    + f9 W, G( o% y        if(elem == Node_temp->data){& o. w# e2 }5 P1 \) Q
                Node_cur->next=Node_temp->next;
    # Y. ?% ~0 H1 \( b6 S            free(Node_temp);8 h) B1 n* C, F$ d/ G% U2 S
            }' T# n, e3 h6 Y* ^% R/ B# a4 p9 A% b5 l
            if(NULL!=Node_cur->next)( z- G' N! D9 s- x) M
            Node_cur=Node_cur->next;
    ; N; a  E' w  y. q" Z" Z    }
    ' `& s; m! N2 s; v. L    cout<< elem <<" 元素已删除!"<<endl; % ?) p1 F+ Z& G+ p# d8 U* H4 z2 G
    }
    - n) m5 V! h& {6 ]
    $ R; b8 r6 f. {显示链表
    + ^! d" T! B8 w6 I" Z: W9 O+ [5 k; A6 h2 b: U
    void LinearNode::ShowLNode(){
    1 w/ ^1 P* f$ Y- `6 c+ D% Z2 i    if(NULL==(HeadList->next)){
    " g/ M9 D7 n' I2 P        cout<< "无节点"<<endl;! ]: Y' l. l' P( v
            return; ' w) G$ u1 z0 S- _" z. U4 F' }
        }
    - Z7 h. b* q/ G3 H" y  ^$ C    Node_cur = HeadList->next; # `/ F8 z8 h4 I: A( S
        while(NULL!=(Node_cur->next)){8 n, N7 ]. u6 r! K! ]1 p
            cout<< Node_cur->data << "   ";5 O! m- E6 [) r) J  l4 F
            Node_cur = Node_cur->next;
    3 L/ V! s6 `# E    }7 h( B" ]' F* B/ K# P) W
        cout<< Node_cur->data << "   ";
    1 E' v( A; p8 C    cout<<"链表中的数据已显示!!"<<endl;* w- K* ^$ W# K* E0 S' O0 F
    }
    8 K. O: e: ~$ T2 ~1 a# j! u
    2 A3 d0 i) i( s+ d销毁链表
    . S) @) g1 Q5 e2 X
    4 E; D; B3 c3 z$ Y2 Svoid LinearNode:estoryLNode(){) s+ w7 ]' D. ^2 d* t* E
        Node_cur = HeadList->next;
    ) n4 n3 V+ F2 g% [1 R8 z0 M7 k    while(NULL!=(Node_cur->next)){
    9 r' V+ q7 T5 H: O& f7 u0 P        Node_temp = Node_cur->next;/ D2 t3 x2 k6 R6 ]
            free(Node_cur);( t( C8 M) p5 s9 C# z6 Z
            Node_cur = Node_temp;
    ( v* x% Q4 r! w% p$ Q) U- w/ t    }- v% p" W7 S) I& O$ J9 D
        free(Node_temp);
    + t4 c! b* w- H- ?# W# @' \1 `    cout << "数据节点已完全释放!"<<endl; # `# Z$ r6 ~) {# Z
        free(HeadList);    // 释放头节点
    # n$ D" s# S! B4 n  T% N2 ]    cout << "头节点已释放!"<<endl; 3 n6 l- a9 j$ f5 `
    ————————————————  M  e; u0 [# U- w7 D  Y% F
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ L/ W. |& d  J* k
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    + F: J" W/ p" g% T; x, l5 P/ w7 Z$ S+ y! R5 w

    + Y: W1 x% V& _& F
    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-26 23:25 , Processed in 0.406424 second(s), 51 queries .

    回顶部