概论
数据:所有能被输入到计算机中,且能被计算机处理的符号(数值、字符、文本、图像等)的
集合。是计算机操作的对象的总称,是计算机处理的信息的某种特定的符号表示形式。
数据元素:是数据(集合)中的一个“个体”,在计算机中通常作为一个整体进行考虑和处理。是数据结构中讨论的基本单位。
数据结构:存在一种或多种关系的数据元素的集合 or 带结构的数据元素的集合
数据结构包括“逻辑结构” 和“物理结构”两个方面(层次):
①逻辑结构 是对数据元素之间的逻辑关系的描述,它可以对应一个数据元素的集合和定义在此集合上的若干关系来表示;(人脑在逻辑上理解的结构),可划分为线性结构和非线性结构
常见:集合,线性,树形,图状
②物理结构 是逻辑结构在计算机中的表示和实现,故又称“存储结构” 。是逻辑结构在存储器中的映象
具体衡量、比较算法优劣的指标主要有两个:
①.空间复杂度S(n) ——根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。
②. 时间复杂度 T(n) ——根据算法写成的程序在执行时耗费时间的长度。这个长度往往也与输入数据的规模有关。时间复杂度过高的低效算法可能导致我们在有生之年都等不到运行结果。
tips:嵌套循环的时间复杂度为各层循环层数之积,if复杂度取各情况中最大的
数据存储基础
1.数组
int a[10];
2.指针与动态存储分配
#include<malloc.h>
int* a;
a=(int*)malloc(n*sizeof(int)); //开辟相应的存储空间
… …
free(a); //使用完的存储空间需要释放
3. 结构
struct Student stu[n];//结构数组定义
struct 结构名{
类型名1 结构成员名1;
类型名2 结构成员名2;
......
}变量1,变量2...;
4.链表
①单向链表
struct Node{
ElementType Data;
struct Node *Next;
};
②双向链表
struct Node{
ElementType Data;
struct Node *Next;//后继结点
struct Node * Previous;//前驱结点
};
③循环链
5.类型定义typedef
typedef 原有类型名 新类
链表
引入链表可解决如下问题:
1、顺序表(线性表的顺序存储实现)往往需要事先预分配存储空间,然而实际应用中,存储空间的需求往往未知,预先分配空间过大,可能造成浪费。
2、顺序表(线性表的顺序存储实现)的插入和删除往往涉及大量的元素移动,比较低效;
无论带不带头结点,一个单链表总有一个头指针
单向链表的常见操作
1.插入结点
①t->Next = p->Next;//新结点t指向p的后继
②Step2:p->Next = t;//p指向新结点t
2.删除结点
①q=p->next;//先标记待删结点
②p->Next = p-Next->Next;//调整p的指针域
③free(q);//释放待删结点的存储空间3.单向链表的遍历
p = head;
while (p!=NULL) {
……
处理p所指的结点信息;
……
p = p->Next;
}
单链表的建立方法
1. 在链表的头上不断插入新结点
2. 在链表的尾部不断插入新结点(需要有一个临时的结点指针一直指向当前链表的最后一个结点,以方便新结点的插入)
单链表虽然是线性表的一种链式实现,但也可以用于实现队列、堆栈,通常称之为链式队列(链队列)、链式堆栈(链栈)
单向循环链表
将单向链表的最后一个结点指向头结点形成一个环,即成为单向循环链表,较之单链表,其优势是:可以通过其中任意一个结点出发访问到其他结点。单向循环链表的操作方法与单向链表相似,只是循环停止条件存在差异。单向循环链表不一定存在头结点。