#include <stdio.h>
#include <stdlib.h>
#define NULL 0
struct Node
{
int Data;
struct Node *next;
};
int N;//记录结点的个数
struct Node *Creat(struct Node *head);
void Print(struct Node *head);
int main()
{
struct Node *head;//创建一个头结点
head=NULL;//将头结点设置为不指向任何节点
head=Creat(head);//创建链表
Print(head); //输出链表
return 0;
}
struct Node *Creat(struct Node *head)
{
N=0;
struct Node *p1,*p2;//创建两个指向struct Node类型的指针 ,设定p1指向新开辟的结点,p2指向最后一个结点
p1=p2=(struct Node*)malloc(sizeof(struct Node));//给第一个结点开辟内存空间,这时候结点的个数为1,,所以让p1和p2都指向它
scanf("%d",&p1->Data);//输入第一个数据
while(p1->Data!=0)//如果该数据不等于0继续下面的操作,如果等于0表示链表输入结束
{
N++;//结点个数加1
if(N==1)head=p1;//如果n=1也就是说在第一个结点的时候,我们要把头指针也指向第一个结点
else
{
//如果n>1,比如n=2的时候,此时P2指向还是第一个结点,而p1指向新的结点,那我们要把它们串联起来形成一个链式,即p2的下个结点是p1新开的结点
p2->next=p1;
p2=p1;//改变指针位置,按照之前的设定,我们要把p2指向最后一个结点,也就是p1新开的结点
}
p1=(struct Node*)malloc(sizeof(struct Node));//创建一个新结点,让p1指向它
scanf("%d",&p1->Data); //输入数据
}
p2->next=NULL;//链表结束了要将最后一个结点的指针next设置为不指向任何节点
return head;//返回头结点,由头结点可以牵出一条链
}
void Print(struct Node *head)
{
struct Node *temp;
printf("Now,These %d records are:\n",N);
temp=head;
while(temp!=NULL)
{
printf("%d ",temp->Data);
temp=temp->next;
}
}
链表创建好了,那表头就不要动了
在创建链表时,最后一次循环中,P1里虽然存入了数据,但这个数据本身只作为链表结束的标志,所以不在链表之中