一、什么是数据结构
1.什么是数据结构
数据结构研究计算机数据间的关系
包括数据的逻辑结构和存储结构及其操作
2.数据结构基本概念
1.数据(Date)
数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。
2.数据元素
数据元素是数据的基本单位,又称之为记录(Record)。一般,数据元素由若干基本项(或称字段、域、属性)组成。
3.数据的逻辑结构(前驱,后继)
集合——数据元素间除“同属于一个集合”外,无其他关系
线性结构——一个对一个,如线性表、栈、队列
树形结构——一个对多个,如树
图状结构——多个对多个,如网状图
4.数据的存储结构
定义:逻辑结构在计算机中的具体实现方法
存储结构是通过计算机语言所编制的程序来实现的,因而是依赖于具体的计算机语言的
法一:顺序存储:将数据结构中各元素按照其逻辑顺序存放于存储器一片连续的存储空间中(如C语言中的一维数组);
法二:链式存储(重点):将数据结构中各元素分布到存储器的不同点,用地址(或链指针)方式建立它们之间的联系;
法三:索引存储:在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表; 法四:散列存储:根据数据元素的特殊字段(称为关键字key),计算数据元素的存放地址,然后数据元素按地址存放————适合查找频率高的情况
二:线性表之顺序表(上)
1.什么是线性表及顺序表
线性表
定义:线性表是包含若干数据元素的一个线性序列
L为表名,ai(0≤i≤n-1)为数据元素;
线性表的特征:
a.对非空表,a0是表头,无前驱;
b.an-1是表尾,无后继;
c.其它每个元素ai有且仅有一个直接前驱ai-1和一个直接后继ai+1;
顺序存储结构的优点
a. 逻辑上相邻的元素ai,ai+1,其存储位置也是相邻的
b.对数据元素ai的存取为随机存取或按地址存取
c.存储密度高
存储密度D=(数据结构中元素所占存储空间)/(整个数据结构所占空间)
顺序存储结构的缺点
对表的插入和删除等运算的时间复杂度较差
PS:线性表的顺序存储经常被称为顺序表
e.g.
#define N 100 typedef int data_t; typedef sruct { data_t data[N]; int last; //相当于一个下标,表示真实含有的数量 } sqlist, *sqlink;
2.代码规范要求
设线性表L=(a0,a1,........,an-1),对L的基本运算有
1.建立一个空表:list_create(L)
2.悬空表:list_clear(L)
3.判断表是否为空:list_empty(L)。若表为空,返回值为1,否则返回0
4.求表长:length(L)
5.取表中某个元素:GetList(L,I),即ai。要求0≤i≤length(L)-1
6.定位运算:Locate(L,x)。确定元素x在表L中的位置(或序号)
7.插入:Insert(L,x,i)。将元素x插入到表L中第i个元素ai之前,且表长+1
8.删除:Delete(L,i)。删除表L中第i个元素ai,且表长减1,要求0<=i<=n-1。
9.求两个表的并集 La∪Lb
10.删除表中重复的元素
3.顺序表的实现1
定义一个结构体
typedef int data_t; #define N 128 struct sqlist_t { data_t data[N]; int last; }; typedef struct sqlist_t sqlist; //sqlist L; struct sqlist_t L; typedef struct sqlist * sqlink; //struct sqlist_t * p;sqlink p;
也可以直接定义,如下
typedef int data_t; #define N 128 typedef struct { data_t data[N]; int last; }sqlist,*sqlink;
sqlist.h
typedef int data_t; #define N 128 typedef struct { data_t data[N]; int last; }sqlist,*sqlink; sqlink list_create(); //创建一个线性表 int list_clear(sqlink L); //线性表置空 int list_empty(sqlink L); //判断线性表是否为空 int list_length(sqlink L); //求线性表的长度 int list_locate(sqlink L, data_t value); //定位运算,确定这个值是否在表中 int list_insert(sqlink L,data_t value ,int pos); //插入一个数
sqlist.c (底行模式输入:vsp 另一个文件名,功能是分屏)(必须加上头文件)
#include "sqlist.h" #include <stdio.h> sqlink list_create(){ return NULL; } int list_clear(sqlink L){ return 0; } int list_empty(sqlink L){ return 0; } int list_length(sqlink L){ return 0; } int list_locate(sqlink L, data_t value){ return 0; } int list_insert(sqlink L,data_t value ,int pos){ return 0; }
test.c (底行模式输入:vsp 另一个文件名,功能是分屏)
#include "sqlist.h" #include <stdio.h> int main() { sqlink L; L = list_create(); return 0; }
编译文件步骤
①预处理——②编译——③汇编——④链接——⑤执行
①②③独立完成形成.o文件
4.顺序表的实现2
创建线性表的步骤:
①.申请内存
②.初始化
③.返回
下面三个程序需同时满足:
sqlist.c
#include "sqlist.h" #include <stdio.h> #include <stdlib.h> #include <string.h> sqlink list_create(){ sqlink L; //malloc L = (sqlink)malloc(sizeof(sqlist)); if(L == NULL){ printf("list malloc failed\n"); return L; } //initialize memset(L, 0, sizeof(sqlist)); L->last = -1 //return return L; } //ret 0——success -1——fail int list_clear(sqlink L){ if (L == NULL) return -1; memset(L, 0, sizeof(sqlist)); L->last = -1 return 0; } int list_free(sqlink L); if (L == NULL) return -1; free(L); L = NULL; return 0; } //list_empty:is list empty? //para L:list //@ret 1--empty 0--not empty int list_empty(sqlink L){ if (L->last == -1) return 1 else return 0; } int list_length(sqlink L){ if(L == NULL) return(L->last+1); } @ret -1---not exist or pos // int list_locate(sqlink L, data_t value){ int i; for(i = 0;i <= L->last;i++){ if(L->data[i] == value) return i; } return -1; } int list_insert(sqlink L,data_t value ,int pos){ int i; //full or not