数据结构1

来源:互联网 发布:金山数据恢复手机版 编辑:程序博客网 时间:2024/04/30 15:39

一些基本概念和术语:

数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合
数据元素:是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录
数据项:一个护具元素可以有若干个数据项组成,是数据不可分割的最小单位
数据对象:是性质相同的数据元素的集合,是数据的子集
数据结构:是相互之间存在一种或多种或多种特定关系的数据元素的集合。
逻辑结构:是指数据对象中数据元素之间的相互关系。
有以下四种关系: ①集合结构:集合结构中的数据元素除了同属于一个集合外,他们之间没有任何关系
     ②线性结构:线性结构中的数据元素之间是一对一的关系
     ③树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
     ④图形结构:图形结构中的数据元素是多对多的关系
物理结构:是指数据的逻辑结构在计算机中的存储形式,分别是顺序存储和链式存储
顺序存储:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的
链式存储:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续 的


线性表:(元素有a1-an)

1.线性表的定义:零个或多个数据元素的有限队列
除了第一个数据元素没有前驱和末尾元素没有后继外,其他元素都有一个前驱和一个后继。
2.线性表的顺序存储结构
指的是用一段地址连续的存储单元一次存储线性表的数据元素。示意图如下:
顺序存储的结构代码:
[cpp] view plain copy
  1. #define MAXSIZE 20    /*存储空间初始分配量*/  
  2. typedef int ElemType;   /*数据类型视情况而定*/  
  3. typedef struct  
  4. {  
  5.     ElemType data[MAXSIZE];  /*数组存储数据元素*/  
  6.     int length;  /*线性表当前长度*/  
  7. }SqList;  

顺序存储结构的插入与删除:

获得元素:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*初始条件:顺序线性表L已存在, 
  2.   操作结果:返回值e表示L中第i个数据元素的值*/  
  3. #define error 0;  
  4. #define success 1;  
  5. int GetElem(SqList L, int i, ElemType *e)  
  6. {  
  7.     if(L.length == 0 || i < 1 || i > length)  
  8.     {  
  9.     return error;  
  10.     }  
  11.     *e = L.data[i - 1];  
  12.     return success;  
  13. }  

插入操作:

插入算法的思路:
插入位置不合理,抛出异常;
若线性表长度大于等于数组长度,则抛出异常或动态增加容量;
插入元素填入i处,i处后面的每个元素后移一位;
表长+1

代码举例:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int ListInsert(SqList *L,int i,ElemType e)  
  2. {  
  3.     int k;  
  4.     if(L->length == MAXSIZE)  
  5.     {  
  6.     return error;  
  7.     }  
  8.     if(i < 1 || i > L->length + 1)  
  9.     {  
  10.     return error;  
  11.     }  
  12.     if(i <= L->length)  /*插入元素不在表尾*/  
  13.     {  
  14.     for(k = L->length - 1; k >= i - 1; k--)  
  15.     {  
  16.         L->data[k + 1] = L->data[k];  
  17.         L->data[k + 1] = L->data[k];  
  18.     }  
  19.     L->data[i - 1] = e;  /*插入新元素*/  
  20.     L->length++;  
  21.     return success;  
  22.     }  
  23. }  


删除操作:

删除操作思路:
删除位置不合理,抛出异常;
取出删除元素;
从删除位置开始遍历到最后一个元素,分别将他们向前移动一个位置;
表长-1

代码举例:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int ListDelete(SqList *L,int i,ElemType e)  
  2. {  
  3.     int k;  
  4.     if(L->length == 0)  /*线性表为空*/  
  5.     {  
  6.         return error;  
  7.     }  
  8.     if(i < 1 || i > L->length)  /*删除位置不正确*/  
  9.     {  
  10.     return error;  
  11.     }  
  12.     *e = L->data[i - 1];  
  13.     if(i < L->length)     /*如果删除不是最后1个位置*/  
  14.     {  
  15.     for(k = i; k < L->length; k++)  /*将删除位置后继元素前移*/  
  16.     {  
  17.         L->data[k - 1] = L->data[k];  
  18.     }  
  19.     }  
  20.     L->length--;  
  21.     return success;  
  22. }  
线性表顺序存储结构的优缺点:
优点:1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间
     2.可以快速的存取表中任意位置的元素
缺点:1.插入和删除操作需要移动大量元素
     2.当线性表长度变化较大时,难以确定存储空间的容量
     3.造成存储空间的“碎片”
0 0