一,链表
什么是链表:
链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
- 链表由一系列结点组成,结点可以在运行时动态生成。
- 每个结点包括两个部分:
一个时存储单元数据元素的数据域:
另一个是存储下一个结点地址的指针域
二,malloc函数
什么是 malloc 函数:
malloc 的全称是 memory allocation ,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域。以 void* 类型返回分配的内存区域地址。
- 当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
- void* 类型表示未确定类型的指针。
- C,C++ 规定,void* 类型可以通过类型转换强制转为任何其他类型的指针。
- malloc 函数一般需要和free函数配对使用。
- 简单应用一下
#include <stdio.h>
#include <stdlib.h>
int main(){
int *a = (int *)malloc(sizeof(int));
}
利用 malloc 函数动态分配内存;
(int * ) 表示强制转换,因为malloc函数返回的是 viod* 类型指针,sizeof(int) 是 malloc 函数的参数,指定一个int类型大小的内存;
#include <stdlib.h>是malloc函数的头文件。
三,free函数
什么是free函数
- c语言函数
- 头文件是malloc.h或stdlib.h
- 作用:释放malloc(或calloc,realloc)函数给指针变量分配的内存空间的函数
- free使用后该指针变量一定要重新指向NULL;
- 指针定义初始化NULL;
四,NULL
什么是NULL:
- Null,本意是"空的;元素只有零的"意思。计算机中通常表示空值,无结果,或是空集合。
- NULL指针是一个无类型指针,并且值为0。一个指针,拥有2个属性:地址值和指针类型。
- 两者的作用是:
(1)地址值标识变量的首地址(32位系统下指针的地址值占4字节);
(2)指针类型告诉编译器,应该怎样进行接下来的数据访问(int型数组和float型数组是不同的;数组访问与结构体访问也是不同的等等)。 - 是空指针,指向地址为0的内存,在用法上,常用来表示不存在
if((fp=fopen("stu","rb"))==NULL)
exit(0);
解析:如果打开的这个名为stu的文件不存在,就退出程序;
五,链表的实现
输入一个n,输入n个数,将这n个数用链表存储
#include <stdio.h>
#include <stdlib.h>
struct Haha{ //定义结构体 ,结点
int val; //数据域
struct Haha *Next; //指针域
};
//输入一个N,输入N个值,用链表来存储
int main(){
struct Haha *tmp, *head, *pre; //定义一个tmp指针,定义一个头指针,定义一个pre指针
tmp = NULL; //tmp 指向 NULL
head = NULL;
pre = NULL;
int n, x;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &x);
// 创建节点
tmp = (struct Haha *)malloc(sizeof(struct Haha));//动态分配内存,tmp去指向,(struct Haha *)表示强制转换
tmp->val = x;
tmp->Next =NULL;
if(i == 0)
head = tmp;
else
pre->Next =tmp;
pre = tmp;
}
pre = head;
while(pre != NULL){
printf("%d\n",pre->val);
pre = pre->Next;
}
}
假如输入6,输入123456,存储后运行结果如下