链表就是一个元素个数可以实时变大/变小的数组
链表就是被锁链链接起来的表。这里的表指的是一个一个的节点,节点内的一些内存可以用来存储数据;这里的锁链指的是链接各个表的方式,C语言中用指针来链接2块内存
链表是由若干个节点组成的,节点由有效数据和指针组成(节点结构完全类似),有效数据用来存储信息完成任务的,指针区域用于指向链表的下一个节点而构成链表
总结
链表本质上就是用来解决数组的大小不能动态扩展的问题,所以链表其实就是当数组用的。
链表就是用来存储数据的,链表用来存数据相对于数组来说有点就是灵活性,需要多少个动态分配多少个,不占用额外内存。
单链表的实现
定义的struct node只是一个机构体,本身没有变量生成,也不占用内存。结构体定义相当于为链表节点定义了一个模板,但是还没有一个节点,将来在实际创建链表时需要一个节点时用这个模板来赋值一个即可
链表的内存需求比较灵活,只能使用堆内存:malloc申请堆内存,大小为一个节点大小,清理申请到的堆内存,把申请到的堆内存当做一个新节点,填充新节点的有效数据和指定区域
#include<stdio.h>
//构建一个链表的节点
struct node
{
int data; //有效数据
struct node *pnext; //指向下一个节点的指针
};
int main(void)
{
//定义头指针
struct node *header = NULL;
//创建一个链表节点
struct node *p=(struct node*)(malloc(sizeof(struct node));
if(NULL==p)
{
printf("malloc error.\n");
return -1;
}
//清理申请到的堆内存
bzero(p,sizeof(struct ndoe));
//填充节点
p->data = 1;
p->pnext = NULL; //下一个节点不知道是啥,所以暂时指向NULL (下一个节点的首地址)
header = p; //p是第一个节点的首地址,p赋值给header 相当于将头指针和首地址链接起来
return 0 ;
};
头指针 header 只是一个指针,指向第一个节点的首地址,只占四个字节,头指针的类型是 struct node *
#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
//构建一个链表的节点
struct node
{
int data; //有效数据
struct node *pnext; //指向下一个节点的指针
};
int main(void)
{
//定义头指针
struct node *header = NULL;
//创建一个链表节点`
struct node *p1=(struct node*)(malloc(sizeof(struct node));
if(NULL==p1)
{
printf("malloc error.\n");
return -1;
}
//清理申请到的堆内存
bzero(p1,sizeof(struct ndoe));
//填充节点
p1->data = 2;
p1->pnext = NULL; //下一个节点不知道是啥,所以暂时指向NULL (下一个节点的首地址)
header = p1; //p是第一个节点的首地址,p赋值