//单链表的创建
//尾插法
#include<stdio.h>
#include<stdlib.h>//malloc函数要用到该库
struct node //创建一个结构体用来表示链表的结点类型
{
/* 链表第一个是整型data,用来存储具体数值
链表第二个是一个指针,用来存储下一个结点的地址。
因为下一个结点的类型也是struct node,
所以这个指针的类型也必须是"struct node *"类型的指针。*/
int data;
struct node *next;
};
int main()
{
int n;
scanf("%d", &n);
/* 首先需要一个头指针head指向链表的最开始。
当链表还没有建立的时候头指针head为空。 */
struct node *head;
head = NULL;
int a;
scanf("%d", &a);
struct node *p;//临时指针
struct node *q, *t;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a);
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
p=(struct node *)malloc(sizeof(struct node));
p->data = a;//将数据存储到当前结点的data域中
p->next = NULL;//设置当前结点的后继指针指向空(因为是最后一个结点)
if(head==NULL)
{
//如果这是第一个创建的结点,则将头指针指向这个结点
head = p;
}
else
{
//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
q->next = p;
}
q = p;//指针q也指向当前结点
}
//输出链表中的所有数
t = head;
while (t != NULL)
{
printf("%d ", t->data);
t = t->next; //继续下一个结点
}
return 0;
}
附注:
q
−
>
n
e
x
t
=
p
q->next = p
q−>next=p 和
q
=
p
q = p
q=p 可以这么理解:
q
−
>
n
e
x
t
=
p
q->next = p
q−>next=p 意味着地址为p的结点被连接到地址为q的结点的后面;
q
=
p
q = p
q=p 指更新地址q(将p地址赋给q),此时在上一行代码的作用下相当于q后移一位来到先前p的位置,也就是末位,等待下一个新结点的创建