#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;
}
void backset(biao*point1,int x)
{
biao* point2 = point1;
while ((point2)->next != NULL)
{
point2 =(point2)->next;
}
biao* point3 = (biao*)malloc(sizeof(list));
if (point3 == NULL)
{
printf("error of point3");
return;
}
point2->next = point3;
point3->next = NULL;
point3->data = x;
}
int main()
{
biao *good = NULL;
frontset(&good, 1);
frontset(&good, 2);
frontset(&good, 3);
frontset(&good, 4);
backset(good, 0);
dataprint(good);
return 0;
}
backset函数解析:
1.为什么没有和前插一样采取二级指针?原因很简单,因为前插需要挪动头指针的位置,让它指向由新表块构成的新头,而尾插只是在原来的表块后加入新的表块,没必要也不能移动头指针的位置
2.为什么要用point2来拷贝point1进行操作?因为point1不能动。
3.微操(point2->next!=NULL):我们的思路和头指针一样,要改变倒数第二个表块的next的指向,让它指向我们malloc的空间,所以我们要把头指针指在NULL的前一个表块上 ,如果写成point2!=NULL为判断条件,那么头指针会指向NULL的表块,程序会出错。
4.常规操作,让next指向我们malloc的空间,并为空间中的data赋值,然后让它的next指向NULL