9.2.1 单链表的节点构成
(1)链表是由节点组成的,节点中包含:有效数据和指针。
(2)定义的struct node只是一个结构体,本身并没有变量生成,也不占用内存。结构体定义相当于为链表节点定义了一个模板,但是还没有一个节点,将来在实际创建链表时需要一个节点时用这个模板来复制一个即可。
9.2.2 堆内存的申请和使用
(1)链表的内存要求比较灵活,不能用栈,也不能用data数据段。只能用堆内存。
(2)使用堆内存来创建一个链表节点的步骤:1、申请堆内存,大小为一个节点的大小(检查申请结果是否正确);2、清理申请到的堆内存,清零;3、把申请到的堆内存当作一个新节点;4、填充新节点的有效数据和指针区域。
9.2.3 链表的头指针
(1)头指针并不是节点,而是一个普通指针,只占4个字节,头指针的类型是struct node *类型的,所以它才能指向链表的节点。
(2)一个典型的链表的实现就是:头指针指向链表的第一个节点,然后第一个节点中的指针指向下一个节点,然后依次类推一直到最后一个节点。这样就够成了一个链表。
9.2.4 实战:构建一个简单的单链表
(1)目标:构建一个链表,然后将一些数据(譬如1,2,3三个数字)存储在链表中
#include <stdio.h>
//构建一个链表的节点
struct node
{
int data; //有效数据
struct node *pNext; //指向下一个节点的指针
};
int main(void)
{
//头指针
struct node *pHeader = NULL;
//每创建一个新的节点,把这个新的节点和它前一个节点关联起来
//创建一个链表的节点
struct node *p = (struct node *)malloc(sizeof(struct node));
if(NULL == p)
{
printf("malloc error\n");
return -1;
}
//清理申请到的堆内存memset(),bzero()
bzero(p,sizeof(struct node));
//填充节点
p->data = 1;
p->pNext = NULL; //将来要指向下一个节点的首地址
//实际操作时将下一个节点malloc返回的指针赋值给这个
pHeader = p; //将本节点和它前面的头指针关联起来
return 0;
}