#include<stdio.h>
#include<malloc.h>
typedef struct list biao;
struct list
{
int data;
biao* next;
}list1;
void dataprint(biao* point)
{
biao* list1 = point;
while (list1 != NULL)
{
printf("%d->", list1->data);
list1 = list1->next;
}
printf("NULL\n");
}
void frontset(biao** point1, int x)
{
biao* point2 = (biao*)malloc(sizeof(biao));
if (point2 == NULL)
{
printf("error about point2");
return;
}
point2->data = x;
point2->next =*point1;
*point1 = point2;
}
int main()
{
biao *good = NULL;
frontset(&good, 1);
frontset(&good, 2);
frontset(&good, 3);
frontset(&good, 4);
dataprint(good);
return 0;
}
解析:
1.good指针的类型是list结构体类型,它指向了单链表的开头,而不是指向一块特定的表
2.为什么good的初始值为NULL?因为单链表的结尾是NULL,这样便于下面的前插操作
3.frontset函数解析:
1.为什么要使用二级指针?因为操作必须给到结构体指针good,因为这步的操作是前插新的表块,而不是改变旧的表块,它的作用只是改变指针good指向的位置,所以要使用二级指针对一级指针good的引用进行操作。
2.检查机制:当malloc申请不到新空间时就会返回空指针NULL,此时报错并直接结束函数
3.定义一块要插入的表,用x给data赋值,而用next指向原来的表头,表示在访问完新加的表块后访问原来的表头,而再把表头赋值为要插入的表表示将前插的新表块作为新的表头进行使用
4.为什么空间没有与形参一起被释放?使用malloc没有free,则会在return 0处进行释放,所以函数结束后不会被释放,在平时使用malloc要释放其空间,但在前插表中这块空间是要被保留的,所以不free
4.dataprint函数解析:
1.每次循环都把打印的节点后推一块,从第一块表打印到最后一块表