#include<stdio.h>
#include<stdlib.h>//因为使用了malloc函数
typedef struct node{
int value;
struct node *next;
}Node;
//这里必须加typedef,在定义结构体是直接将重命名了类型名,使用时就不用再前面写上structuct了,这里不仅重命名了一个名字,有两个名字
//其中一个为结构体类型,第二个为结构体指针类型(其实就是允许在结构体中再用相同的名字再去命名一个结构体)
int main()
{
Node *head=NULL;//head指向链表的第一个结点的数据元素,一开始没有任都东西,整个linked-list是空的
int number;
do{
scanf("%d",&number);
if(number!=-1){
//add to linked-list
//因为每读入一个数据就需要Node的一个结构体 ,然后连起来
Node *p=(Node*)malloc(sizeof(Node)); //malloc分配的内存大小至少为参数所指定的字节数;malloc的返回值是一个指针
//malloc调用的时候它会沿着表寻找一个大到足以满足用户请求的所需要的内存块,然后将该内存块一分为二
p->value=number;//新来的结点的前半部分传入数据
p->next=NULL; // 新来的结点的后半部分指向NULL
//find the last,用遍历的方法找到最后一个
Node *last=head;
if(last)//要先判断last是不是null再来进行下面的循环(因为如果从刚一开始last等于head,而head刚开始就是null,就直接结束了)
{
while(last->next) //看last指向的next是否为NULL
{
last=last->next;//如果last指向的next不是NULL,则让last不断指向下一个结点的next以判断出最后一个结点是哪个
}
//attach
last->next=p; //每一次循环都会指向这一次循环输入的结点,所以到最后一次循环的时候就会得到最后一个结点
}
else{
head=p;
}
}
}while(number!=-1);
return 0;
}
寻找最后一个结点部分
- 先让last从最开始的head整体开始
- 判断last所指向的next是否为NULL(因为next会指向下一个结点的value部分,所以如果为NULL的话就说明后面没有结点了)
- 在循环里面让last不断指向下一个结点的next部分以判断是否为最后一个结点