数据结构
数据结构:研究的是数据的逻辑结构,存储结构及其操作
逻辑结构:数据元素与数据元素之间的关系
线性关系
一对一
树形关系
一对多,或一对二(二叉树)
图状关系
多对多
存储结构
1.顺序存储:顺序并且连续存储
顺序存储:在逻辑上相邻的元素,在物理空间上也相邻
优点:查找方便,
存储空间的利用率可以达到1 缺点:插入和删除不方便,
申请空间的时候,必须是一片连续的空间,对空间的要求比较高
会用空间碎片的产生
2.链式存储
链式存储:在逻辑上相邻的元素,在物理空间上不一定相邻
优点:插入元素不需要移动大量的空间
对空间的要求没那么大,
缺点:查找不方便
存储空间的利用率不足1,没有顺序存储的大
3.索引存储
索引存储:依据索引表查找数据大概位置,详细查找数据本身(冲突没有解决号的哈希存储)
优点:查找方便
缺点:有索引表的存在,要浪费空间
插入元素,删除元素之后,索引表要更新
4.哈希存储
哈希存储:根据关键字直接就能定位到记录本身,就能拿到数据
优点:查找方便,插入,删除也方便
缺点:如果哈希函数设计的不合理,查找的效率就会很低
数据
数据:现实生活中一切可以处理的信息
操作
创建,增,删,查,改,销毁
线性结构的顺序存储:
1.顺序表的特征:
(1).顺序并且连续存储
(2).大小固定
(3).表空不能取,表满不能存
(4).插入和删除不太方便需要移动元素,查找较方便
2.定义顺序表
1.定义数据元素的类型
#define N 20
#define M 12
typedef struct people //定义一个通讯录的个人信息
{
char name[N]; //姓名
char phone1[M]; //手机号码
char addr[N]; //地址
}data_type;
2.定义一个顺序表
#define SIZE 10
typedef struct list{
data_type arr[SIZE]; //满足(1)顺序并且连续存储,(2)大小固定
int count; //用它来保存顺序表有效数据的个数
count==0表空
count==SIZE 表满;
}List;
3.创建顺序表
开辟顺序表空间和开辟数据类型空间,大小为size。
4.插 入 元 素
分头插,中间插和尾插,尾插,把尾节点的下个地址指向新插入地点。中间插和头插,先找出位置在从后向前依次向后移。再插入对应位置。
5.显示顺序表
一一遍历显示
6.删除元素
和插入相同,找到位置,从前向后依次向前覆盖。尾删时直接释放最后的空间
带头结点的不循环单链表
认识链表
结点定义:
创建链表
插入结点
显示链表
给链表删除元素
受限的线性表
栈:受限在了操作上
只允许数据在一段进行插入和删除操作,允许操作的一段叫做栈顶 特点:先进后出(FILO)
队列:受限在了操作上
只允许在一段执行插入操作,另一端执行删除操作,允许插入的一段叫做队尾,允许删除操作的一段叫做队头 特点:先进先出(FIFO)
串:受限在了存储上
只允许存储字符 * ' a — 1
栈:
栈的定义:
ypedef int data_type;
//顺序表的定义
typedef struct list
{
data_type data[SIZE]; //存储空间
int count; //指示元素的个数
}List;
//栈的定义
typedef struct stack
{
data_type data[SIZE]; //存储空间
//只能在栈顶进行操作
int top; //指示栈顶
}Stack;
入栈和出栈
队列
队列的定义
//定义大小
#define SIZE (10)
//定义数据类型
typedef int data_type;
//栈的定义
typedef struct stack
{
data_type data[SIZE]; //存储空间
//只能在栈顶进行操作
int top; //指示栈顶
}Stack;
//队列的定义
typedef struct queue
{
data_type data[SIZE]; //存储空间
//在队尾插入、队头删除
int tail; //指示队尾
int head; //指示队头
}Queue
队列入队出队: