爱冒险的duola 2022-05-14 23:28 采纳率: 50%
浏览 35
已结题

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

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

#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,如果还是有问题,可以私聊我

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月27日
  • 已采纳回答 5月19日
  • 创建了问题 5月14日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程