数据结构
1.数据结构的基本概念
1.1数据结构发展:
1968年,一个美国的教授开创了数据结构课程,研究的是数据怎么进行存储,怎么表示数据组织关系的课程。
数据结构:
就是指数据的关系和数据的存储以及对数据的操作
学习数据的存储有哪些表示,以及存储数据之间的关系怎么表示,(存储有哪几种,关系有哪几种)并且之后过程可以使用哪些数据结构,是学习这一门课程的主要目的。
程序的出库不在是单纯的数值,而是描述一个信息,解决数据如何在计算机中存储,表示数据与数据之间关系的内容
数据与数据之间不是孤立存在的,数据之间存在着某种联系(关系:线性关系、层次关系、网状关系)
1.2数据结构相关概念
1.数据:能够输入到计算机,且能够被计算机识别处理、存储、显示的内容
2.数据元素:数据的基本单位,就是一个完整的数据内容。如:书(编号,书名,出版社,作者,出版日期等)
3.数据项:数据元素的单元,如:书-------编号
4.数据结构:就是研究非数值类型数据的相互之间关系,存储与运算
1.关系:逻辑结构
数据元素之间的抽象关系(先后、层次、从属、邻接)
集合结构、线性结构、树形结构、图形结构
2.存储:存储结构
数据的存储结构,数据在计算机中的存储方式
顺序存储、链式存储(离散存储)、索引存储、散列存储
3.数据运算
对数据能够进行插入、删除、查找、排序
4.四种逻辑结构
数据与数据之间的联系规律关系,就叫做逻辑关系,也叫作逻辑结构
集合:
所有的数据元素之间没有必然的联系,只是有共同的特点、属性
线性:
数据元素之间具有一定的先后顺序
树型:
数据元素之间是层次方式来表示关系,有一定的包含、从属关系
图型:
数据与数据之间有多种关系存在
5.四种存储结构
数据以指定的方式存储在计算机中
顺序:
数据元素在存储空间(内存)是连续的,一个接一个存储
链式:
数据元素在存储空间不一定是连续的,数据元素一个可能存储在A地址,另一个存储在B地址,把数据串联起来。
索引:
顺序和链式结合,;如:电话本
散列:
重点掌握顺序存储和链式存储
6.数据运算
增、删、改、查
之后在存储数据时,我们就可以根据数据的特点,选择一种逻辑结构(能够表示出数据的关系),再选择一种存储结构(在计算机中如何存储数据),最终完成数据的存储
2.存储:存储结构
2.算法的概念
2.1算法
解决问题的步骤描述
在计算机中算法是一个又穷的指令(语句)有序集合
2.2算法与程序的区别
算法是解决问题的方式方法(步骤描述):功能的实现描述
程序是用计算机语言的具体实现
区别:算法可以不依赖于计算机语言,而程序必须依赖计算机语言的实现
2.3.算法的好坏判断
1.正确性:能否正确的解决问题
2.效率:消耗时间多少,消耗空间多少
3.编程:算法结构要好,易于理解,编码和测试
2.4算法效率的度量
2.4.1.时间
1.事后统计:把算法实现进行运行,统计运行前和运行后的时间之差,就是算法功能运行的时间-----存在其他影响
2.事先估算:认为cpu执行每条语句的时间都是一致的,通过统计语句的执行次数来做估算
3.语句频度:在算法中一条语句执行的次数
语句频度之和(每一条语句执行次数之和)就是事先估算的算法时间。
在循环中语句频度是不定的,把语句的频度不定的情况叫做问题规模,用n表示。
4.算法的时间复杂度:在算法中可执行的语句频度之和,就叫做时间复杂度,记作:T(n)
大O表示法:(让n趋近无穷大的表示方式,只留下最大次幂)
2.4.2.空间
空间复杂度:实现算法所需要的空间大小S(n);
3.数据结构
数据结构:就是根据需要存储的数据,选择具体的逻辑结构与存储结构来存储数据
3.1线性表
逻辑结构:
在程序存储多个数据,如果在数据之间存在一定的先后顺序,叫做线性结构,也叫作线性表
存储结构:
1.顺序存储:
用一段连续的空间来进行存储数据,当存储了数据需要把对应的关系也描述出来
2.链式存储:
逻辑结构+存储结构==数据在计算机中存储--》数据结构
顺序表:
逻辑结构:线性表(线性关系)
存储结构:顺序存储
顺序表的实现:
-
一段连续的空间,通过地址来表示
-
需要记录元素的个数
顺序表的运算:
插入
删除
修改
查找
清空
创建
#include<stdio.h>
#include<stdlib.h>
//实现顺序表,顺序表就是用于存储先后关系的数据
//顺序表
struct list_table
{
int age[10];//由于是顺序存储地址表示关系,所以不用额外定义关系的表达
int num;
};
//创建顺序表
struct list_table *creat ()
{
//struct list_table sql;//结构体变量 ,离开函数创建的顺序表消亡
struct list_table *slist=(struct list_table *)malloc(sizeof(struct list_table));//申请在堆区不会被释放
slist->num=0;
return slist;
}
//判断顺序表是否存储满
int full (struct list_table *slist)
{
if(slist->num==10)
{
printf("is full!\n");
return 1;
}
else
return 0;
}
//添加,---往顺序表添加数据;
void add(struct list_table *slist,int addage)//顺序表末尾添加一个数据
{
if(full(slist))
return ;
slist->age[slist->num]=addage; //添加一个数据
slist->num++;//个数+1
}
//插入----往顺序表指定位置插入
void insert (struct list_table *slist,int addage,int post)
{
if(full(slist)||(post>slist->num-1))
return ;
for(int i=slist->num-1;i>=post;i--)
{
slist->age[i+1]=slist->age[i];
}
slist->age[post]=addage;
slist->num++;
}
//判断为空
int empty (struct list_table *slist)
{
if(slist->num==0)
{
return 1;
printf("is empty\n");
}
else
return 0;
}
//删除
void del(struct list_table *slist,int post)
{
if(empty(slist)||post>slist->num-1)
return ;
for(int i=post ;i<slist->num-1;i++)
{
slist->age[i]=slist->age[i+1];
slist->num--;
}
}
//修改
void update(struct