学习链表之前,我们要知道为什么要引入链表。
C语言中的数组使用之前,我们必须要定义数组的大小。但是当我们不知道数据个数(或者很大)时,定义数组大小就成了一个困扰,而且对于这么多数据的处理也会很麻烦。所以,定义“动态大小”,“单独操作几个元素”就成了此时一个方便的选择。
接下来我们来学习如何创建一个链表。
1.什么是结点
所谓节点,就是用于存放数据与指向下一节点的地址。
节点的代码实现:
struct node{
int data;
struct node *next;
};
2.用指针指向节点
创建节点后,我们要用第一个指针指向该节点,称为头指针,同时要初始化头指针。
struct node *head;
head=NULL;
3.向节点中输入数据并创建临时指针指向该节点
我们先创建临时指针并申请动态空间去指向一个节点,这样就可以通过指针向节点中输入数据了。
struct node *p,*q;
p=q=(struct node *)malloc(sizeof(struct node));//申请动态空间
scanf("%d",&(p->data));
待会会讲到指针q的作用。
4.判断是否为第一个节点
如果输入的是第一个(组)数据,那么应用头指针指向这个节点。
if(head==NULL)head=p;
否则,就将上一个指针的后继节点指向该节点。
如何实现呢?
这时,我们需要提前创建一个新指针用于存放上一指针的信息。即上面已经定义了的q指针。然后将上一指针(q)的后继节点指向当前节点(p)
else q->next=p;
5.指向当前节点并输入下一个(组)数据
连接上一节点的后继节点与当前节点后,我们需要将上一节点更新为当前节点。输入下一个(组)数据的方法与第三点的申请动态空间和向节点中输入数据相同。
q=p;
p=(struct node *)malloc(sizeof(struct node));
scanf("%d",&(p->data));
6.结束输入
数据输入完后,我们需要将最后一个数据的下一节点指向NULL。
q->next=NULL;
下面是完整的代码实现:
#include<stdio.h>
#include<malloc.h>
struct node{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*q;
head=NULL;
p=q=(struct node *)malloc(sizeof(struct node));
scanf("%d",&(p->data));
while(p->data!=)
{
if(head==NULL)head=p;
else q->next=p;
q=p;
p=(struct node *)malloc(sizeof(struct node));
scanf("%d",&(p->data));
}
q->next=NULL;
while(head)
{
printf("%d\n",head->data);
head=head->next;
}
return ;
}
谢谢观看,如有问题欢迎提出并指正。