1. 数据结构 (基础支撑)
数据(Data){
1.存储在某种介质上,
2.可识别,
3.物理符号
要素{
1.类型(type):例 int
2.值(value) 例 32767
}
}
// 用来识别信息的基本组成单位
数据元素(DATA Element){
1. 若干数据的集合
2. 用来表示现实世界的一个完整的信息
}
// 对数据的处理方法
数据结构{
1. 逻辑结构:数据结构中数据元素之间存在的逻辑联系
A. 集合式:数据元素之间是散列的(无联系)
B. 线性 :数据元素之间存在线性关系(栈,队列)
C. 非线性联系{
a. 树状关系
b. 图状关系
}
2. 物理(存储)结构(存储结构) : 数据元素的物理存储
A. 顺序存储(用连续的存储单元来存储(数组))
B. 链式存储(用不连续的存储单元(链表))
衡量标准{
1. 逻辑结构(时间复杂度)
2. 物理结构(空间复杂度)
}
1. 数组不是数据结构,存入了啥就叫啥逻辑结构
2. 时间复杂度不是运行时间
3. 贪心,DP,回溯,最短路径,分治,递归,深搜广搜,,,,
}
2. 算法 (方案)
线性表: 用来表示数据集合中数据元素之间的逻辑关系
表示{
1. 数据集合
2. 数据元素之间的逻辑次序
}
例:DataList{
春-夏-冬-秋 (数据集合的数据元素是没有次序的)
逻辑次序: 图例法 春->夏->秋->冬
}
二元组来表示: DataRelationship = {<春,夏> <夏,秋> <秋,冬>}
序偶表示
线性表的特点
1 2 3 4
(首元素) (尾元素)
1. 前驱
2. 后继
首元素:线性表中没有前驱的元素叫做首元素
尾元素:线性表中没有后继的元素叫做尾元素
非终端元素: 线性表中有唯一的前驱和唯一的后继的元素叫非终端元素
1. 顺序表 : 把一个线性表,用连续的存储结构存储
顺序表是线性表
用数组存储
2. 实现顺序表{
1. 要有一个数据集合
2. 要有一个数组(连续)
}
声明一个连续的存储单元
1. 定义一个数组 数据类型+数组名[元素个数]
*2. 声明一个动态数组
malloc(字节数)--在内存中分配多少个字节
问题
1. 是否分配成功
2. 分配成功在哪里
3. 放什么类型的值
返回值{
成功 返回首字节地址
失败 返回null
}
若单元分配成功返回首字节的地址
但是改地址无类型(void)
通过强制类型转换
例:在内存中分配 4 个内存单元
int *p;
p = (int*)malloc(4);
#include <stdio.h>
#include <stdlib.h>
int main ( void ) {
int * p;
p = ( int * ) malloc ( 5 * sizeof ( int ) ) ;
if ( ! p) {
printf ( "分配失败" ) ;
} else {
printf ( "分配成功" ) ;
}
for ( int i = 0 ; i < 5 ; i++ ) {
p[ i] = i;
}
for ( int i = 0 ; i< 5 ; i++ ) {
printf ( "%d " , p[ i] ) ;
}
printf ( "\n" ) ;
printf ( "%d %d" , * p, sizeof ( int ) ) ;
return 0 ;
}