一、数组
1、数组的定义
数组是具有一片连续的存储空间并且具有相同的数据类型的多个变量的集合。需要事先根据元素的个数来确定数组的长度。
2、 数组的一般形式
<存储类型><数据类型><数组名>[常量表达式];
存储类型:一般默认为自动存储
数据类型:要看存储的数据是什么类型,就选择什么类型的数组;
数组名:合法的标识符
首地址、地址常量
表达式:数组的维数(元素个数,为常量表达式)
eg:
int arr[5];----->表示一个可以存储5个整型数据的数组
3、数组的引用
数组只能逐个访问
数组名 [下标]; //下标从0开始
eg:
int arr[5]--->arr[0], arr[1], arr[2], arr[3], arr[4]
4、数组的初始化
1)数组的完全初始化
int arr[5] = {1, 2, 3, 4, 5};
2)数组的部分初始化
int arr[5] = {1, 2};
eg:
int arr[5] = {0};//数组里面的所有元素初始值都为0
3)不给下标的初始化
当我们给了N个初值,那么这个数组嘴都就只能存储N个数据
int arr[] = {1, 2, 3, 4, 5};//这个数组就只能存储5个数据
5、数组的大小
数组所占字节数 = 单个元素所占的字节数 x 元素个数
sizeof(数组名) sizeof(数据类型) N
元素个数 = 数组所占字节数 / 单个元素所占字节数
二、链表(单链表--有头链表)
1、链表的定义
1)定义
链表是一种物理存储单元上非连续,非顺序的一种存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。可以不用事先定义长度,在运行时动态的生成结点。
2)特点
逻辑结构为线性结构,存储结构为链式存储,每个元素的地址空间不是连续的。链表的优点是能够解决顺序表中资源浪费的问题,以及空间不足的问题,元素的插入和删除方便;缺点是查找以及修改效率低,需要从头遍历整张表。
2、链表的分类
1)有头链表
一开始创建一个节点,记录链表的首地址,头节点的值不重要,删除数据而不删除链表时不能删除头节点
2)无头链表
头节点就是第一个元素,第一个元素不能删除要判断删除的元素是否是头节点
3、链表节点的相关结构体
typedef int data_t;
typedef struct linklist
{
data_t data; //节点的数据域,存放数据
struct linklist *next; //节点的指针域,下一个节点的地址,用指针表示
}Linklist;
4、链表的相关的算法操作
1)创建链表的头节点
Linklist *Create_Linklist()
2)判断链表是否为空
判断链表的头节点的下一个节点是否为空
int Linklist_Is_Empty(Linklist *head)
3)计算表长(有效节点的个数)
int Linklist_Get_Lenght(Linklist *head)
4)插入数据
//从表头插入(不需要返回值)
void LinkList_Insert_Head(LinkList *head, data_t data)
//按位置插入
void LinkList_Insert_Pos(LinkList *head, int pos, data_t data)
5)删除数据
//按位置删除数据(要删除节点的上一节点的地址要知道)
void LinkList_Delete_Pos(LinkList *head, int pos)
//按值删除
void LinkList_Delete_Data(LinkList *head, data_ data)
6)查找数据
//按位置查找数据
void LinkList_Search_Pos(LinkList *head, int pos)
//按值查找元素
int LinkList_Search_Data(LinkList *head, data_t data)
7)修改数据
//按位置修改元素
void LinkList_Change_Pos(LinkList *head, int pos, data_t data)
8)清空和销毁链表
//清空链表
void LinkList_Clear(LinkList *head)
//销毁链表
void LinkList_Destory(LinkList *head)