删除前面的数,输出来的列表还是正常的。但是每次删除最后一个数,输出来的列表就少了第一个数,这是为啥啊?
#include <stdio.h>
#include <stdlib.h>
#define M 100
//定义一个链表
typedef struct node
{
int data;
struct node *next;
}Linklist;
//建立链表
Linklist *Create_link1()
{
int x;
int n=0;//令链表初始长度为0
Linklist *h,*p,*t;//h,t分别表示头结点和尾结点
h=(Linklist *)malloc(sizeof(Linklist));//给头结点分配内存,生成头结点
h->next=NULL;
t=h;
printf("请输入数据直到输入0结束:\n");
scanf("%d",&x);
while(x!=0)
{
p=(Linklist *)malloc(sizeof(Linklist));//给头结点分配内存,生成头结点
p->data=x;//为新结点数据域赋值
t->next=p;
t=p;
t->next=NULL;
scanf("%d",&x);
n++;
}
h->data=n;
t->next=NULL;
return h;
}
//查找算法(按值查找)
int Search_link1(Linklist *head,int key)
{
Linklist *p;
p=head->next;//指针指向首结点
int j=1;//计数器
while(p&&p->data!=key)
{
p=p->next;//取下一个结点 继续寻找
j++;//计数+1
}
if(p) return j;
else
{
return 0;
}
}
//删除算法(对用户输入的数进行删除)
Linklist *Delete_link1(Linklist *head,int key)
{
Linklist *p1,*p2;
if(head->data==key)
{
p2=head;
head=head->next;
free(p2);
}
p1=head;
p2=head->next;
while(p2!=NULL)
{
if(p2->data==key)
{
p1->next=p2->next;
free(p2);
p2=p1->next;
}
else
{
p1=p2;
p2=p2->next;
}
}
return head;
}
void display(Linklist *h)
{
Linklist *p=h;
printf("\n");
while(p->next)//p!=NULL
{
printf("%3d",p->next->data);
p=p->next;//指针后移一位
}
printf("\n");
}
int main()
{
Linklist *head;
int key;
head=Create_link1();//初始化单链表
//输出
printf("输出单链表:\n");
printf("一共有%d个元素:",head->data);
display(head);
printf("\n");
//查找
printf("请输入要查询的数:");
scanf("%d",&key);
printf("查找成功!");
printf("您要找的值为%d,序号为%d\n",key,Search_link1(head,key));
printf("\n");
//删除
printf("请输入要删除的数:");
scanf("%d",&key);
//调用查找函数来判断输入的数是否存在于链表中
if(Search_link1(head,key))//如果输入的数存在于链表中,则进行删除并输出删除后的单链表
{
head=Delete_link1(head,key);
printf("删除成功!");
printf("删除后的单链表为:");
display(head);
}
else//不存在则输出找不到输入的数
{
printf("删除失败!");
printf("该值不存在于link1中!");
}
return 0;
}