#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node{
DataType data;
struct Node *link;
}LinkList;
LinkList *Create_List(){
LinkList *head,*p,*q;
int x,flag=1;
head=(LinkList*)malloc(sizeof(LinkList));//为头结点分配存储空间
head->link=NULL;
q=head;
while(flag)
{
scanf("%d",&x);
if(x!=-1)
{
p=(LinkList*)malloc(sizeof(LinkList));
p->data=x;
q->link=p;
q=p;
}
else {
flag=0;
q->link=NULL;
}
}
return head;
}
main(void){
LinkList *t;
t=Create_List();
while(t!=NULL)
{
printf("%d\n",t->data);
t=t->link;
}
}
输入的数据前多了一串数字
因为你Create_List函数创建链表的时候,第一个节点没有赋值,是一个随机数,但是在你遍历链表的时候,显示了第一个节点的值,所以就多出来了这个数.
在t=Create_List();下面添加一句:
t=t->link;
因为头结点head的data没有初始化,所以输出是不确定的数字。
你这种链表方式使用了哨兵链表,头节点保持不变,但本身的数据是没有意义的,所以输出或链表处理时,都是从头结点的next开始处理,所以你从头结点的link开始进行处理
使用哨兵的好处,在插入排序和归并排序中,使用一个值为无穷大或者负无穷大的哨兵元素,能降低代码复杂性,提高程序运行效率。