数据结构
什么是数据结构
数据结构:数据的逻辑结构、存储结构及操作
数据元素及数据元素之间的相互关系,或组织数据的形式。有人认为:按照某种逻辑关系组织起来的一批数据,应用计算机语言,按照一定的存取方式把它们存储到计算机存储器中,并为这些数据定义一个运算集合,就称为一个数据结构
数据
数据(Data)
数据即信息的载体,不再是单纯的数值,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。
2.数据元素(Data Element)
数据元素是数据的基本单位,又称之为记录(Record)。一般,数据元素由若干基本项(或称字段、域、属性)组成。
例如产品的记录:
产品编号 产品名称 规 格 出厂日期
0001 TV 29 1999/09
0002 TC 28 1999/09
例如图书信息的记录:
编号 书 名 作 者 出版社 出版日期 。。。
001 数据库 李四 科教 1998.7
002 数据结构 张三 国防工业 2002.2
3.节点:数据元素又称为节点
逻辑结构
数据元素之间存在某种关系
逻辑结构 : 数据与数据之间的规律和联系
逻辑关系 逻辑结构 特点 应用
线性关系 线性结构 一对一 线性表(顺序表、链表、栈、队列)
层次关系 树状结构 一对多 树
网状关系 图状结构 多对多 图
存储结构
存储结构:数据的逻辑结构在计算机上具体实现
用代码来表达逻辑结构(表达数据与数据之间的关系)(1)顺序存储结构: 顺序存储结构在将数据顺序存储器一片 连续 的存储空间中 例如数组
(2)链式存储结构: 链式存储结构,在内存当中是 不连续 存储的,通过指针将节点连接在一起
(3)索引存储结构: 在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。
(4)散列存储结构: 哈希表,存的时候按照对应关系存,取的时候按照对应关系取
操作(数据运算)
对数据进行的操作(或运算)也不再是加、减、乘、除等数学运算,而是诸如:(图书管理系统中)
查询(查找一本书的信息)、
插入(增加一本书的信息)、
修改(某书修订后,修改元素中的某些信息)、
删除(某书不再版了,做删除标记)、
分类(按某数据项的值建立索引)
等这样的运算。
算法
算法(Algorithm)是一个有穷规则(或语句、指令)的有序集合。它确定了解决某一问题的一个运算序列。
-----解决问题的思想办法
算法的特性
(1)有穷性 —— 算法执行的步骤(或规则)是有限的;
(2)确定性 —— 每个计算步骤无二义性;
(3)可行性 —— 每个计算步骤能够在有限的时间内完成;
(4)输入 —— 算法有一个或多个外部输入;
(5)输出 —— 算法有一个或多个输出。解决一个问题可以有多种不同的算法,在算法正确的前提下,评价算法好坏的方法 :
消耗时间的多少 :时间复杂度
消耗存储空间的多少 :空间复杂度
容易理解、容易编程和调试、容易维护。
程序
讨论了数据结构与算法的基本概念后,有必要提到瑞士科学家沃思(N.Wirth)的著名公式:
***数据结构 + 算法 = 程序***
数据结构是研究从具体问题中抽象出来的数学模型如何在计算机存储器中表示出来;而算法研究的是对数据处理的步骤。如果对问题的数据表示和数据处理都做出了具体的设计,就相当于完成了相应的程序。
练习
//定义一个全局变量
int last = 5 //last 时刻代表着数组中有效元素的个数
//main中
int a[100] = {11,22,33,44,55}; //部分初始化
showArray(a);//遍历数组中有效元素 11 22 33 44 55
insertIoto(a,3,100)//在3的位置插入一个数 100
showArray(a); //11 22 100 33 44 55
deleteFrom(a,3);// 删除3位置的数据
showArray(a); //11 22 33 44 55
#include<stdio.h>
int last = 5;
int insertIntoA(int a[],int post, int number)
{
int i;
for(i=last;i>post-1;i--)
{
a[i] = a[i-1];
}
a[post-1] = number;
last++;
return 0;
}
int deleteFromA(int a[],int post)
{
int i;
for(i=post;i<last;i++)
{
a[i-1] = a[i];
}
last--;
return 0;
}
void showArray(int a[])
{
int i;
for(i=0;i<last;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int a[100] = {11,22,33,44,55};
showArray(a);
insertIntoA(a,2,88);
showArray(a);
deleteFromA(a,2);
showArray(a);
return 0;
}
顺序表
线性表:顺序表 链表(单向链表 单向循环链表 双向链表 双向循环链表) 栈 队列
线性表特征:一对一
顺序表:
逻辑结构: 线性结构
存储结构: 顺序存储
#define N 100 //顺序表的结构体定义
typedef struct
{
int a[N]; //存数据的数组 --数据域
int last; //时刻代表顺序表中有效元素的个数
}seqlist_t;
顺序表的操作:
//1. 创建一个空的顺序表
//2. 判断一个顺序表是否为空 空的话返回1 不空返回 0
//3. 判断一个顺序表是否为满 空的话返回1 不空返回 0
//4. 遍历顺序表中所有有效元素
//5. 在指定位置插入数据 i = p->last;i> post - 1; i--; p[i] = p[i-1];
//6. 删除指定位置上数据 i = post ;i< p->last;i++; p[i-1] = p[i];
//7. 求顺序表的长度
//8. 查找某个元素出现在顺序表中的位置
//9. 清空顺序表
sequence //顺序
list // 表
seqList //
create //新建 创建
full //满
empty //空
insert into //插入
ete from // 删除