QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1555|回复: 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 P3 D6 Y8 F; t' y
    线性表顺序表示、链式表示实现方法及其异同点1 U' [* W* A/ o! T
    线性表是最常用且最简单的一种数据结构,按存储单元排列可分为顺序表示和链式表示两种方式。% L) G6 p5 ?" a/ r

    % [6 {) c3 ^  A本文采用C++实现两种表示方法。
    5 }3 i. ^. N  k& S& t1 y4 Q, k/ q) Y; N4 Y
    目录
    + f2 W8 q3 h# ]5 v3 W
    - l8 t" W6 u, f顺序表示和链式表示的区别:
    # l5 t$ O, V4 G& a3 T& I( k3 S& c7 _9 m7 Q
    创建方式:
    0 [7 i6 E$ l. q
    / f3 C, H9 H, @4 M' i/ ?时间复杂度:
    , ^: C& T2 |( Y' @
    " b  B- {& w; h- i" {顺序表示和链式表示的相同点:
    ( e; q' Z; C3 X5 F7 @( u
    ! v- }  p* b% Y2 Q删除内存空间:" X5 @7 Q. f! ]; l+ R$ Z

    & @3 R5 }" F: f3 w" i* E8 I代码实现:
    - o. I$ I- V& B. L7 U4 q, z5 Y# o$ S  i2 s; O
    顺序表示方法:, J/ {- m2 f1 f

    8 M4 [% Z6 b, d, i结构体定义+ a/ W8 v8 k' Q4 P

    / n, N1 D: K8 {# H- |) E初始化% L3 O( ]. F- B! x& {

    0 U  L) B, ~$ w* [: H+ [7 k  t  _增加元素
    ! ]: S/ r0 a- l4 i8 o% @
    - t$ H' D% ]( W" j删除元素) ^( B/ ]* R9 f  F9 ~
    4 Z4 E5 V7 P7 {' L! m& A& S1 y
    销毁列表( `7 J7 I* D$ p; P' ~

    4 b+ ~0 B. B! W, B5 s链式表示方法
    ' E1 O3 v- K8 U! u
    " {& f; \4 u8 s结构体定义$ N+ ^. `$ T% x+ L! ?

    % ]3 d/ g4 C$ g: n( H初始化: z/ D; _/ A; @5 |8 W

    % [2 k+ ?1 \# I" B/ v增加节点
    * Z: g$ r" P5 L) I* S8 |2 z! b7 \3 Q! `  E! \. ~
    删除节点
    + Y6 D5 Q, \$ C$ q: `. e
    ( x8 V- p3 U! C( ?显示链表$ L" ?; {4 t: D+ I; n; n% Z# |
    0 \2 G: B/ _5 I6 Y3 H3 A& E. [
    销毁链表
    6 T" y  ^8 }: Y+ [  Z" w/ \/ I8 V  F6 R$ @. g5 V" R
    顺序表示和链式表示的区别:7 j( z* ?* E' t

    ) O/ U+ y# f: T+ z' `+ R# E% ^% E% T创建方式:+ K5 ?9 V% [% x: L5 C8 v; }& d) m
    ! F: D2 \" B2 x* ?8 q/ W
    顺序表示方法单次创建多个存储单元,相邻的元素存放在连续的存储空间之中。
    6 \( j6 V: i. d4 ?7 p! m- [7 n+ t/ u7 h: j; H8 \* D- `
    (PS:内存空间申请请参考https://blog.csdn.net/Baimax1/article/details/105954552)
    6 E2 {7 F; X3 ?; z9 e2 J8 g* k) R6 ^% f5 J7 Q
    链式表示方法单次创建单个存储单元,存储单元之间地址不一定连续。存储单元包括数据部分和地址部分,数据部分存放需要保存的数据,地址部分保存下一个存储单元的地址(单链表,双向链表的地址部分同时也存放上一个存储单元的地址)。* Q2 f/ u# x7 Y8 Z

    / [6 a. k" s/ N2 g6 r6 S时间复杂度:
    : q% s$ F. z$ L* \: ^5 g/ V! v! s/ k8 ~. t) T6 x+ w. E  n9 v
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(1);(PS:在未知位置的元素前 / 后操作)
    9 z( X* c- @. b7 j* e' H6 j4 Q/ W0 R1 Q$ C7 C! y
    增加 / 删除元素操作:顺序表示方法 O(n);链式表示方法O(n);(PS:在已知位置的元素前 / 后操作)
    , d) y9 [: _, ?7 I' g3 X4 I- b' Y$ r; u& v6 J$ ]  l
    PS:顺序表示需要将元素一一后移,链式存储结构需要查找该元素的位置。( m' L; f3 S5 V3 w

    0 D8 p) k3 D, ]# Z修改 元素操作:顺序表示方法 O(1);链式表示方法O(n);
    3 Y6 e! s: s* T
    4 N$ x# @% ~) |1 [查询 元素操作:顺序表示方法 O(n);链式表示方法O(n);
    3 k* c# f+ @" [/ S% I2 i
    2 u( \) A! F; P4 C) v顺序表示和链式表示的相同点:& [. O" B) _6 l$ j
    . M/ u# W2 h( @' O* O, h0 k
    删除内存空间:. ]4 S. T0 _8 Z$ F7 |' B' W
    % E  T. y4 k- {1 r  ^2 C9 V
    内存空间的删除都需要对每一个存储单元单独释放空间。
    ; [6 E- P& _' `* u! M7 k4 V7 a7 W0 l1 K$ U
    代码实现:$ I5 S0 i6 _- p. n  |! s

    1 n0 v; E% E$ F- ?! u. F顺序表示方法:6 l; V* T3 r0 G1 g
    ) g# W7 R, I& N% F9 d
    结构体定义
    & `- w8 x1 T' Y/ M# N; a$ u# Q. r
    6 p& y3 a5 O/ p: n/ C+ Ftypedef struct {
    ! u- m9 P, \  B    ElemType * elem;
    6 }( R  U9 l) _$ T  L; @- g    int     length;        // 线性表的现有长度 * B. x" e" w! E$ N0 p2 n) |" w2 m
        int        listSize;    // 线性表的最大长度6 m2 ]/ _4 S% B  h+ v( S% j, r( ]
    }SqList;% W- A+ ?9 V( t* D' ?( r$ r
    : @% h& o3 @+ q' E
    初始化6 P) W5 k( }6 ]

    3 g$ o% j9 ^/ i: @& Qvoid InitList(SqList *L){0 O8 T# x, k' T" L
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ;0 ]. d% y3 g) J6 f8 ]
        if(!L->elem) {, K1 r. m6 P5 J# a; v- G
            cout<<"申请空间失败!\n";2 ~. X/ |/ g3 U+ [: h0 @4 s
            DestoryList(L);
    ! w% E" p* \( d7 C4 B6 f; d    }, \0 C8 ]; s; d! X5 f
        L->length = 0;6 s: ^' y# q8 ?# t' ~
        L->listSize = LIST_INIT_SIZE;
    7 t4 T8 F2 ]0 X    cout<<"线性表初始化完成!\n";
    ( o& }" e1 y9 {% I}
    / a  G0 W' h  f) q! H  c, |
      m  _- `: p3 S* T" t增加元素
    ; w, {4 X& W3 {: |3 \
    . D+ E! g9 a) m  t+ ?void ListAdd(SqList *L, ElemType e){  //在末尾直接增加元素2 s* h# U6 ]  J. m; N! z
        if(L->length>=L->listSize){
    % x: ]" t( Z" J  k; q1 \        L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    / C: B! _0 }8 L1 R: g        if(!L->elem){
    1 \" J* t; ~1 J/ f$ Y            cout<<"增加空间失败!"<<endl;
    0 q; N( _  x& Y: U, g4 G            DestoryList(L);" t- [- c& {0 B$ _& Y9 a
            }
    8 a/ g$ _- b; ], `' c/ r    }5 \( L* k! g' L& J& c
        * (L->elem+L->length) = e;0 Q( g# S7 @8 x4 s. U5 w/ C! x
        L->length ++;    / E  d" X- t( P  Q
    }
    : V  F1 j, t/ W
    : C: d) N* T9 x6 Qvoid ListAddBefor(SqList *L, ElemType e,int e_where){     //在某位置前增加元素
    - a# Y+ G9 c4 V: G9 Q. p) c    int i;
    7 ?2 }; }0 t/ E+ f0 m$ }    L->length++;
    " p+ O/ b  l+ B+ ?0 ~1 k    for(i=L->length;i>=e_where;i--){
    # D( ~7 Y+ E% w, M( |3 H* |5 p        if(L->length>L->listSize){9 `, C* n4 S3 {5 D4 ?
                L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));
    2 G+ _/ }% w* f1 F            if(!L->elem){) F" u2 F  y* q# M; Y: _6 l' V. L
                    cout<<"增加空间失败!"<<endl;
    / I8 w2 R2 S# {" V$ c; _" A                DestoryList(L);
    * n0 c) y/ A+ w* z9 t            }
    : ?( h% N6 r4 \, o8 @        }+ I7 u8 r' `0 S, s+ E) Y
            *(L->elem+i+1) = *(L->elem+i);        
    0 |7 E4 M3 s. H  B# a9 m6 p( S) R3 L  u    }% u% a: a  p4 R
        *(L->elem+e_where)=e;
    , q! [* Q. k3 O4 m; o  f    cout<<"增加后的线性表如下:"<<endl;
    6 y0 y+ v( u# p; `    ListShow(L);
    9 u' H1 Q+ \% @' F$ `+ e} # g7 E  l0 Z! B, \: m( Q4 W: Y8 l  K
    5 s' u. U! w+ A& P
    void ListAddAfter(SqList *L, ElemType e,int e_where){     //在某位置后增加元素
    ) M8 a% ]* d  d5 T; d) m9 a    int i;
    $ g% B; f! j! {' x/ X* y    L->length++;
    ) P4 r6 {0 a( J: [2 o    for(i=L->length;i>e_where;i--){3 g) a& ?" d2 R9 T
            if(L->length>L->listSize){
    ( y, ]7 `7 H8 Z% X) ?& K: x/ M            L->elem = (ElemType *)realloc(L->elem,(L->listSize+LISTINCREMENT)*sizeof(ElemType));( o  p9 M7 I5 l, }4 D5 Q4 m3 Y
                if(!L->elem){
    " k. ?9 j! t+ T                cout<<"增加空间失败!"<<endl;5 k. R' P! _+ d0 m2 {
                    DestoryList(L);
    $ u: ^$ p! K9 d5 l% F$ d) b7 v% _            }
    + _- i; ~' }$ W1 c( v3 c  U0 \3 ^5 `        }7 j! s2 n  G* p9 H5 `" I4 v) ~
            *(L->elem+i+1) = *(L->elem+i);        & y5 W& p3 Z' ^1 Q4 e/ W
        }2 q6 o9 |: R' S5 h& b% s
        *(L->elem+e_where+1)=e;) y0 x4 u+ @6 r2 p3 C4 u! D6 \
        cout<<"增加后的线性表如下:"<<endl;
      m2 m) v) c% [$ I* B    ListShow(L);
    / j, d! i0 K# e  G9 u! D9 f9 i}) l) `4 [* f5 B! N; z! b

    1 k: V9 m1 p+ F7 \0 E) D0 C- F删除元素
    8 v% @6 I2 w: V7 ]" }* F: n8 s# P( g3 K1 J1 p- P! o( U- D
    void ListDelete(SqList *L, int e_where){    //删除某位置元素
    - q, @3 J7 f' e, ]7 \' C/ C    L->length--;
      M( `* f. G3 P5 m    for(int i=e_where;i<=L->length;i++){5 u; V. Z6 w5 ^! k; n8 z& _
            *(L->elem+i-1)=*(L->elem+i);
    6 P$ A2 `/ W' D! ?3 n: R; ^# y# ~: C    }
    ; f8 J! {6 u5 f    cout<<"删除后的线性表如下:"<<endl;
    * ?& V$ e- l+ G$ W( ]    ListShow(L);# M( s+ T* S& M% g( e/ |
    }
    3 u  A: B# U3 ^
      W) I: H( \* y% d. ]销毁列表
    ) s' e* h$ x- }9 P" ^6 F& Z
    * r0 |  g  M7 @+ Q9 Mvoid DestoryList(SqList *L){( U# s7 C  z: i8 t& k$ B+ g. i
        int i=0;' p: I/ N' `1 J( ^# I
        for(i=0;i<L->listSize;i++){! W# ^5 c% ^4 d- \
            free(L->elem);
    ! Y# a% m. \' S& W4 y1 s. u5 O        L->elem++;
    " Q- V1 ]$ e/ s  v& z9 y    }
    / }3 U8 G3 |( O: S    exit(0);        
      `2 r! p- F" W- _}2 V( |6 ]# ~6 J1 t8 c* T% b

    6 M6 h- F: U1 p链式表示方法
    6 Q' w5 }8 x- l) L7 p+ u: {2 h" D3 j3 t$ D+ G. p
    结构体定义
    9 y/ [# m2 M9 w6 w% h; c) o, @/ e1 |. n1 C0 h* v
    typedef struct L_Node{4 S9 b: R; s  n+ I9 J
        ElemType data;7 X0 b* R# v. j- P, T
        struct L_Node *next;. i* ]9 C) n% @( T
        //struct L_Node *last;    //增加可变成双向节点 * Q" L$ a: ^) J  v& m
    }LNode;
    $ L8 D+ J& o& M2 A, \8 x2 _8 y8 i) Q9 p8 z
    初始化
    8 J6 O% x& |8 Y0 q, T  E
    7 U1 Q  C0 X# Svoid LinearNode::InitLNode(){
    7 X1 M5 n" C. ^2 N  ^, _6 i    HeadList = (LNode *)malloc(sizeof(LNode));
    - j* M, K. x& K/ N' r% ?' b# o    if(!HeadList){
    1 k4 T* b. A, J        cout << "初始化链表失败!" << endl;
    ! E+ o% O4 x, u) B& p4 R! Q        exit(0);
    8 o( P* M" Q- g  Y" u2 U4 Q    } 2 v8 s6 ?- k! Z( n' y. G+ A  c
        EndList=HeadList;
    ( O0 u( T  w  F8 C: i    HeadList->next = NULL;! y- N7 l) B/ Z  L& A' d5 e" }
        cout<< "初始化链表成功! 初始地址为:" << HeadList << endl;4 e$ k: P2 C% l0 {& ]0 D
        Length = 0;
    : T$ u* a: O  [* p3 K    e_where= 0;7 C; x0 O# s2 I5 ?
    }
    , J9 V2 i+ j' I7 W7 q
    . M5 V( N' I3 r( k$ x: y3 d; O3 y增加节点' G) ]# l+ N2 ~& \" m3 x+ j/ Q- S) w

    5 x& b0 Y: q3 f! H& U% L- F# Fvoid LinearNode::AddNodeHead(ElemType num){    //头插法 + m+ U$ F- K3 p  b# s( L4 P' a/ j
        node = (LNode *)malloc(sizeof(LNode));
    6 L% _5 z+ \5 t0 v; v; t' R/ x    if(!node){# I$ O, i$ D) E% W7 l- H2 f$ W
            cout << "新建节点失败!" << endl; 6 m, a' u' @3 D" c' F2 ^
            return;
    2 o* g" j9 g: [) P- R; P. _    }
    - F8 R/ {6 l7 G1 m2 |8 C# l    node->data = num;
    ' E4 \/ T  H# G# C3 H# N    cout << node->data <<"   ";8 Q6 |- V0 s: n1 D9 U$ T! [) L0 f9 D
        if(NULL==HeadList->next){
    1 m$ Y7 N; b1 C+ T$ q9 x* [        node->next = NULL;
    ; ?" L3 v# w$ ?# a        HeadList->next = node;
    3 K9 f1 o0 q+ \- q3 W. V        EndList=node;1 C4 R  ?' s( ?" u; |0 p# O
        }
    % p  L( n! j) P8 T( B    else{/ `6 H+ e: j" R: D( X, Q, D( V
            node->next = HeadList->next;
    ) Q2 {) p; M+ m1 M% c! G: h4 H        HeadList->next=node;4 }) a6 ~$ g" @# |: W1 ?+ [
        }
    ! L2 f% N, G) g    Length++;
    # q4 f5 a3 r3 h' u}" v  c0 a' r* z

    1 T4 V% K8 l* Q3 z. Lvoid LinearNode::AddNodeEnd(ElemType num){    //尾插法
    * N$ V9 n, G1 p    node = (LNode *)malloc(sizeof(LNode));
    $ C1 X4 X( q. K* q, C8 v( G( \    if(!node){
    7 k2 `# @$ f! o) ?9 D6 k, B        cout << "新建节点失败!" << endl;
    ( Q* X7 a) X/ i+ H& V, ?* [        return; " c. p0 e# v! ?# l. F8 I
        } 6 ~3 [! G- [, q" Z
        node->data = num;
    + ^5 X2 S  H9 }, H5 t3 i; N0 P    cout << node->data <<"   ";: @- a9 a* ~" v' i2 F/ N" d
        node->next = NULL;
    " p; K. \8 T! _  [& H: ?6 X    EndList->next = node;
    6 ?' [$ }6 P# r    EndList = node;
    # I2 M( k2 p/ D4 T  g" C% j  z    Length++;   |% p  L/ f1 T# i/ Z7 D0 b
    }9 L2 Y0 o" Z- W% ^

    & k1 Q  C, l% W$ w删除节点
    : s8 c: s2 r8 z% P: B% ]3 p- ^4 o8 V% i/ D5 H/ k/ o2 Z
    void LinearNode:eleteNode(ElemType elem){" }8 T- d8 e$ l: z- a7 j
        if(NULL==(HeadList->next)){7 E" c: D. |+ q  e- J/ J* {, ^4 M6 t
            cout<< "无节点"<<endl;! j  B! m3 u# K+ V4 W+ f& C
            return; + e# z5 q3 j3 v5 @8 m
        }
    ' j$ E+ b  n0 e. Z    Node_cur = HeadList;7 @3 R0 N' J7 G% J0 U
        while(NULL!=Node_cur->next){
    ) v6 z5 ?8 R+ ~6 @  S; o        Node_temp = Node_cur->next;
    % y2 f  J) d5 s$ M+ _2 Z        if(elem == Node_temp->data){/ ]1 V/ g" K* X" g0 {8 k! t% i
                Node_cur->next=Node_temp->next;
    / v+ X5 ^) s  w! A# k. [/ U+ ]* l* |            free(Node_temp);
    # v5 A5 p6 @- m0 S        }
    : N2 ?+ L! l" m7 a        if(NULL!=Node_cur->next)
    ' z% f! L& U) s        Node_cur=Node_cur->next;
    5 H3 ]% `! {3 n% Q! `0 ?7 m- {    }1 k& A8 J% y! [7 N# [  q
        cout<< elem <<" 元素已删除!"<<endl;
    & j( E/ G2 V* V- J} " u* v9 A! U6 |
    * W0 z7 E* D2 l+ p+ v
    显示链表  D# Q/ a8 h% q, g1 M" q5 {2 {
    , b6 w8 ~% e3 ^4 d6 h
    void LinearNode::ShowLNode(){
    2 c5 f5 Q- i; C( B* d    if(NULL==(HeadList->next)){* K; ^, N& I. x1 f, N5 U/ q
            cout<< "无节点"<<endl;2 ^: b  D* C  C1 B) H
            return;
    5 ?2 ?* m* {3 A5 z: y    }$ L( x- v4 j5 Z/ _+ q) m, Z5 s6 `, \
        Node_cur = HeadList->next; 2 `" ^9 p( F7 @2 o& J. a
        while(NULL!=(Node_cur->next)){9 x7 g% v4 m8 J1 D
            cout<< Node_cur->data << "   ";
    " s8 `2 U7 K" W7 V" D7 c        Node_cur = Node_cur->next;
    5 s$ c5 ?) g7 a/ i7 }; `/ Z    }
    + j- x, J; W* c$ c: @* {. n  m2 G    cout<< Node_cur->data << "   ";4 t% \$ _) C: d7 P; _7 u
        cout<<"链表中的数据已显示!!"<<endl;. Z9 O( k1 ?9 Q5 m# q
    }
    ' u, x2 J7 {( B- u& A# ^2 c( J) x* t) o2 B# y3 x
    销毁链表0 K3 K- C/ L% f2 Y9 E, m
    : H$ W5 c( P7 z
    void LinearNode:estoryLNode(){" b4 l1 o% _% p1 J7 U
        Node_cur = HeadList->next;
    " s1 w9 {, R, c$ _' f  f' t% D" O    while(NULL!=(Node_cur->next)){
    & {7 e: \5 d* O* Z7 x8 h- ^        Node_temp = Node_cur->next;- N# K4 Z# O, b# u, Z
            free(Node_cur);, H( _# |7 v& C% O; N" Z7 O  T
            Node_cur = Node_temp;
    - @; U+ l/ T7 y; a9 o    }% V) m: a7 H3 F) H' m
        free(Node_temp);
    $ E/ b" X+ n# ^* e' M* y# k: |5 N    cout << "数据节点已完全释放!"<<endl;
    8 ^  Q5 r: a6 b' v' y    free(HeadList);    // 释放头节点
    + L& n# d& C& l# z8 Q0 S* q2 G7 ~    cout << "头节点已释放!"<<endl; 8 Q7 F2 r: W; q3 Q  t
    ————————————————* g8 c+ M% H2 [& b# k+ N9 U: `
    版权声明:本文为CSDN博主「星河有鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( c* P5 h: t3 l: ?3 P# S$ H/ v8 I
    原文链接:https://blog.csdn.net/Baimax1/article/details/106036286
    , t. z2 M2 f& D/ _- S" `6 G
    , m7 `( l* E/ T2 l9 W: \$ Y2 p9 c2 H% N  \: J, 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, 2026-6-10 06:04 , Processed in 0.398594 second(s), 50 queries .

    回顶部