zoukankan      html  css  js  c++  java
  • 浅谈数据结构之线性表顺序存储(一)

        首先,数据结构是由某一数据元素集合及该集合中所有数据元素之间的关系组成。具体来说,数据结构应当包含三方面的内容:(1).数据的逻辑结构;(2).数据的存储结构;(3).对数据所施加的操作。而数据的存储结构形式有两种:顺序存储与链式存储。在这里,先谈一谈线性表的顺序存储。

      线性表:零个或多个数据元素的有限序列。第一,它是一个序列,也就是说,元素之间是有顺序的;第二,它是有限的,即元素个数是有限的。而线性表的顺序存储结构,说白了,就是在内存中找块地,通过占位的形式把一定的内存空间给占了,然后把相同数据类型的数据元素依次存放在这块空地中。我们发现,描述顺序存储结构需要三个属性:(1).存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置;(2).线性表的最大存储容量:数组长度MaxSize;(3).线性表的当前长度:length。注意:在任意时刻,线性表的长度应该小于等于数组的长度。因为线性表的长度是线性表中数据元素的个数,随着线性表插入与删除操作的进行,这个值是变化的。还有一点:线性表的第i个元素是要存储在数组下标为i-1的位置上,因为在C语言中,数组是从0开始第一个下标的。对于一个线性表来说,插入数据与删除数据都是必须的操作,此外,初始化、置空线性表,顺序输出线性表中数组的元素也是常见的操作。具体操作代码如下所示:

      1 #include <stdio.h>    
      2 #include <stdlib.h>  
      3  
      4 #define OK 1
      5 #define ERROR 0
      6 #define TRUE 1
      7 #define FALSE 0
      8 
      9 #define MAXSIZE 100          /* 存储空间初始分配量 */
     10 
     11 typedef int Status;          /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
     12 typedef int ElemType;        /* ElemType类型根据实际情况而定,这里假设为int */
     13 
     14 Status visit(ElemType c)
     15 {
     16     printf("%d ",c);
     17     return OK;
     18 }
     19 
     20 typedef struct
     21 {
     22     ElemType data[MAXSIZE];        /* 数组,存储数据元素 */
     23     int length;                    /* 线性表当前长度 */
     24 }SqList;
     25 
     26 /* 初始化顺序线性表 */
     27 Status InitList(SqList *L) 
     28 { 
     29     L->length=0;
     30     return OK;
     31 }
     32 
     33 /* 初始条件:顺序线性表L已存在;操作结果:将L重置为空表 */
     34 Status ClearList(SqList *L)
     35 { 
     36     L->length=0;
     37     return OK;
     38 }
     39 
     40 /* 初始条件:顺序线性表L已存在;操作结果:返回L中数据元素个数 */
     41 int ListLength(SqList L)
     42 {
     43     return L.length;
     44 }
     45 
     46 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
     47 /* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
     48 Status GetElem(SqList L,int i,ElemType *e)
     49 {
     50     if(L.length==0 || i<1 || i>L.length)
     51             return ERROR;
     52     *e=L.data[i-1];
     53 
     54     return OK;
     55 }
     56 
     57 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
     58 /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
     59 Status ListInsert(SqList *L,int i,ElemType e)
     60 { 
     61     int k;
     62     if (L->length==MAXSIZE)  /* 顺序线性表已经满 */
     63         return ERROR;
     64     if (i<1 || i>L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
     65         return ERROR;
     66 
     67     if (i<=L->length)        /* 若插入数据位置不在表尾 */
     68     {
     69         for(k=L->length-1;k>=i-1;k--)  /* 将要插入位置之后的数据元素向后移动一位 */
     70             L->data[k+1]=L->data[k];
     71     }
     72     L->data[i-1]=e;          /* 将新元素插入 */
     73     L->length++;
     74 
     75     return OK;
     76 }
     77 
     78 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
     79 /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
     80 Status ListDelete(SqList *L,int i,ElemType *e) 
     81 { 
     82     int k;
     83     if (L->length==0)               /* 线性表为空 */
     84         return ERROR;
     85     if (i<1 || i>L->length)         /* 删除位置不正确 */
     86         return ERROR;
     87     *e=L->data[i-1];
     88     if (i<L->length)                /* 如果删除不是最后位置 */
     89     {
     90         for(k=i;k<L->length;k++)    /* 将删除位置后继元素前移 */
     91             L->data[k-1]=L->data[k];
     92     }
     93     L->length--;
     94     return OK;
     95 }
     96 
     97 /* 初始条件:顺序线性表L已存在 */
     98 /* 操作结果:依次对L的每个数据元素输出 */
     99 Status ListTraverse(SqList L)
    100 {
    101     int i;
    102     for(i=0;i<L.length;i++)
    103             visit(L.data[i]);
    104     printf("
    ");
    105     return OK;
    106 }
    107 
    108 int main()
    109 {
    110         
    111     SqList L;
    112     ElemType e;
    113     Status i;
    114     int j;
    115     
    116     i=InitList(&L);
    117     printf("1.初始化L后:L.length=%d
    ",L.length);
    118     
    119     for(j=1;j<=10;j++)
    120         ListInsert(&L,j,j);
    121     printf("2.在L的表尾依次插入1~10后:L.data=");
    122     ListTraverse(L); 
    123     printf("L.length=%d 
    ",L.length);
    124 
    125     ListInsert(&L,1,0);
    126     printf("3.在L的表头插入0后:L.data=");
    127     ListTraverse(L); 
    128     printf("L.length=%d 
    ",L.length);
    129 
    130     GetElem(L,6,&e);
    131     printf("4.第6个元素的值为:%d
    ",e);
    132     
    133     ListDelete(&L,5,&e); 
    134     printf("5.删除第%d个的元素值为:%d
    ",5,e);
    135     printf("依次输出L的元素:");
    136     ListTraverse(L);  
    137 
    138     ListInsert(&L,5,4);
    139     printf("6.插入第5个元素值后,依次输出L的元素:");
    140     ListTraverse(L); 
    141     
    142     GetElem(L,8,&e);
    143     printf("7.第8个元素的值为:%d
    ",e);
    144     
    145     i=ClearList(&L);
    146     printf("8.清空L后:L.length=%d
    ",L.length);
    147     
    148     return 0;
    149 }
  • 相关阅读:
    ztCreateUserWizard输入密码和设置安全问题
    寻觅在office(确切的说是word) 的工具栏中添加控件的方法,找到了这个控件列表
    vs2005,combox 数据绑定和SelectedIndexChanged事件触发 引发的问题
    今天下载安装了Enterprise Library for .NET Framework 2.0 January 2006,准备试试dataAccess application block
    zt 3DO的历史,让人感慨啊
    iBM,tivoli,flash挺有意思的
    zt科学家发现自转最快中子星 比地球快1亿倍
    c#中读取应用程序路径的方法
    郁闷啊郁闷,为了access的like,折腾了一上午.
    人生
  • 原文地址:https://www.cnblogs.com/mix88/p/6105357.html
Copyright © 2011-2022 走看看