1.基本概念
1.数据(Data) 数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。
2.数据元素(Data Element) 数据元素是数据的基本单位,又称之为记录(Record)。一般,数据元素由若干基本项(或称字段、域、属性)组成。
2.数据的逻辑结构
表示数据运算之间的抽象关系
按每个元素可能具有的直接前趋数和直接后继数将逻辑结构分为“线性结构”和“非线性结构”两大类。
集合——数据元素间除“同属于一个集合”外,无其它关系
线性结构——一个对一个,如线性表、栈、队列
树形结构——一个对多个,如树
图状结构——多个对多个
3.数据的存储结构
存储结构:逻辑结构在计算机中的具体实现方法。
存储结构是通过计算机语言所编制的程序来实现的,因而是依赖于具体的计算机语言的。
3.1顺序存储
将数据结构中各元素按照其逻辑顺序存放于存储器一片连续的存储空间中
如c语言的一维数组,如表 L=(a1,a2,……,an)的顺序结构
3.2 链式存储(重点)
将数据结构中各元素分布到存储器的不同点,用地址(或链指针)方式建立它们之间的联系
数据结构中元素之间的关系在计算机内部很大程度上是通过地址或指针来建立的。
3.3索引存储
在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。
3.4散列存储
根据数据元素的特殊字段(称为关键字key),计算数据元素的存放地址,然后数据元素按地址存放
4.线性表
线性表是包含若干数据元素的一个线性序列
记为: L=(a0, ...... ai-1, ai, ai+1 ...... an-1)
L为表名,ai (0≤i≤n-1)为数据元素;
n为表长,n>0 时,线性表L为非空表,否则为空表。
线性表L可用二元组形式描述:
L= (D,R)
即线性表L包含数据元素集合D和关系集合R
D={ai | ai∈datatype ,i=0,1,2, ∙∙∙∙∙∙∙∙∙n-1 ,n≥0}
R={<ai , ai+1> | ai , ai+1∈D, 0≤i≤n-2}
关系符<ai, ai+1>在这里称为有序对
表示任意相邻的两个元素之间的一种先后次序关系
ai是ai+1的直接前驱, ai+1是ai的直接后继
线性表的特征:
1) 对非空表,a0是表头,无前驱;
2) an-1是表尾,无后继;
3) 其它的每个元素ai有且仅有一个直接前驱ai-1和一个直接后继ai+1。
5.线性表顺序存储
若将线性表L=(a0,a1, ……,an-1)中的各元素依次存储于计算机一片连续的存储空间。
设Loc(ai)为ai的地址,Loc(a0)=b,每个元素占d个单元 则:Loc(ai)=b+i*d
5.1顺序存储结构的特点
逻辑上相邻的元素 ai, ai+1,其存储位置也是相邻的
对数据元素ai的存取为随机存取或按地址存取
存储密度高
存储密度D=(数据结构中元素所占存储空间)/(整个数据结构所占空间)
顺序存储结构的不足:
对表的插入和删除等运算的时间复杂度较差。
6.顺序存储结构的表示
在C语言中,可借助于一维数组类型来描述线性表的顺序存储结构
#define N 100
typedef int data_t;
typedef struct
{ data_t data[N]; //表的存储空间
int last;
} sqlist, *sqlink;
7.顺序表的实现
设线性表 L=(a0,a1, ……,an-1),对 L的基本运算有:
创建接口
typedef int data_t;
#define N 128
typedef struct{
data_t data[N];
int last;
}sqlist,*sqlink;
7.1建立一个空表:list_create(L)
sqlink list_create(sqlink L){
sqlink L;
L = (sqlink)malloc(sizeof(sqlist));
if(L == null){
printf("list malloc failed\n");
return L;
}
memset(L,0,sizeof(sqlist));
L->last=-1;
return L;
}
memset
函数用于设置一块内存的内容为指定的值。其原型为:
void *memset(void *s, int c, size_t n);
s
是指向要设置的内存块的指针。c
是要设置的值,通常是一个无符号字符。n
是要设置的字节数。
7.2置空表:list_clear(L)
int list_clear(sqlink L){
if(L == NULL){
return -1;
}
memset(L,0,sizeof(sqlist));
L->last=-1;
return 0;
}
7.3判断表是否为空:list_empty (L)。若表为空,返回值为1 , 否则返回 0
int list_empty(sqlink L){
if(L == NULL){
return -1;
}
if(L->last=-1){
return 1;
}
else{
return 0;
}
}
7.4求表长:length (L)
int length(sqlink L){
if(L == NULL){
return -1;
}
return (L->last+1);
}
7.5取表中某个元素:GetList(L , i ), 即ai。要求0≤i≤length(L)-1
int GetList(sqlink L, int i){
if(L == NULL){
return -1;
}
if(i > L->last || i < 0){
return -1;
}
return L->data[i];
}
7,6定位运算:Locate(L,x)。确定元素x在表L中的位置(或序号)
int Locate(sqlink L, data_t x){
if (L == NULL){
return -2;
}
int i; // 初始化 i
for(i=0; i<=L->last; i++){
if(L->data[i] == x){
return i;
}
}
return -1; // 在循环外返回 -1,表示元素不在表中
}
7.7 插入 元素:list_insert(L,value,pos)
//1. 判断顺序表是否满
//2.pos ∈[0,last+1]
//3.移动 从后往前
//4.存新值
int list_insert(Sqlink L, data_t value, int pos){
if(L->last == N-1){
return -1;
}
if(pos < 0 || pos > L->last+1){
return -1;
}
for(int i = i->last;i>=pos;i++){
L->data[i+1] = L->data[i];
}
L->data[pos]=value;
L->last++;
return 0;
}