16.666666666666666666666666666%
2022-05-14 23:28
采纳率: 0%
浏览 14

关于单链表,用户输入一个数在链表中查找,进行删除后输出单链表

删除前面的数,输出来的列表还是正常的。但是每次删除最后一个数,输出来的列表就少了第一个数,这是为啥啊?

#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;
}
运行结果及报错内容

img

img

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

  • 心随而动 2022-05-15 00:07

    打印函数有问题,你的while循环中的条件有问题,而且你打印的是头结点的下一个,建议你把while循环中的条件改为p!=NULL,然后输出改为p->data,如果还是有问题,可以私聊我

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题