csdn_mobile 2022-08-20 22:01 采纳率: 69.2%
浏览 46
已结题

c语言单链表调试时出问题

最近在学单链表的基本操作,增删查改这些。这两天自己改了改完善了一下

#include<stdio.h>
#include<stdlib.h> 
typedef struct link{
 int value;
 struct link *next;
}Link;
Link* init_list(void);//初始化 
void display(Link *p);//链表输出 
int search(Link *p,int value);//查找某元素
Link* insert(Link *p,int value,int location);//增加元素(插入) 
Link* del(Link *p,int location);//删除元素 
Link* replace(Link *p,int location,int value);//替换元素 
/*******************************************/
int main()
{
 int object,address=0;
 int data,add;
 int cut;
 int place,new_data;
 Link *q=init_list();
 printf("初始化链表为\n");
 display(q);
 printf("请输入你要查找的元素\n");
 scanf("%d",&object);
 address=search(q,object);
 if(address!=-1)
 {
     printf("该数在第%d号位。\n",address);
 }
 else
 {
     printf("未找到该数!\n");
 }
 printf("请输入插入数据的位置\n");
 scanf("%d",&add);
 printf("请输入要插入的数据\n");
 scanf("%d",&data);
 insert(q,data,add);
 display(q);
 printf("请输入要删除的数的位置:\n");
 scanf("%d",&cut); 
 del(q,cut);
 display(q);
 printf("请输入要替换的数据的位置\n");
 scanf("%d",&place);
 printf("请输入新的数据\n");
 scanf("%d",&new_data);
 replace(q,place,new_data);
 display(q);
 return 0;
}
/******************************************/ 
Link* init_list(void)
{

 re_input:
;
 int x=0;
 int mask=0,count=0;
 Link* head=NULL;
 Link *p=(Link*)malloc(sizeof(Link*));
 head=p;
 printf("请输入数据(输入-1结束)\n");
 do
 {
  mask=scanf("%d",&x);
  if(x!=-1&&mask!=0)
  {
  Link *a=(Link*)malloc(sizeof(Link*));
  a->value=x;
  a->next=NULL;
  head->next=a;
  head=head->next;
  count++;
  }
  else if(x==-1&&count!=0){
   break;
  }
  else 
  {
   printf("输入中含有非法字符,请重新输入!\n");
   fflush(stdin);
   goto re_input;
  }
 }while(x!=-1);
  return p;
}
/************************************************/
int search(Link *p,int value)
{
    int i=1;
    Link *temp=p;
    while(temp->next!=NULL){
        temp=temp->next;
        if(temp->value==value){
            return i;
        }
        i++;
    }
    return -1;
}
/************************************************/
Link* insert(Link *p,int value,int location)
{
    int i;
    Link *temp=p;
    for(i=1;i<location;i++){
        if(temp->next==NULL)
        {
            printf("插入位置无效!\n");
            return p;
        }
        temp=temp->next;
    }
    Link *b=NULL;
    b=(Link*)malloc(sizeof(Link*));
    b->value=value;
    b->next=temp->next;
    temp->next=b;
    return p;                                                                                             
}
/****************************************/
Link* del(Link *p,int location)
{
    int i;
    Link *temp=p;
    Link *del=NULL;
    for(i=1;i<location;i++)    {
        if(temp->next==NULL)
        {
            printf("删除位置无效!\n");
            return p;
        }
        temp=temp->next;
    }
        del=temp->next;
        temp->next=temp->next->next;
        free(del);
        return p;
}
/****************************************/
Link* replace(Link *p,int location,int value)
{
    int i;
    Link *displace=NULL;
    Link *temp=p;
    for(i=1;i<location;i++){
        if(temp->next==NULL)
        {
            printf("替换的位置无效!\n");
            return p;
        }
        temp=temp->next;
    }
    Link *c=(Link*)malloc(sizeof(Link*));
    c->value=value;
    displace=temp->next; 
    c->next=temp->next->next;
    temp->next=c;//这行与上一行顺序不能乱 
    free(displace);
    return p;
}
/******************************************/
void display(Link *p)
{
 Link* temp=p;
 while(temp->next!=NULL)
 {
  temp=temp->next;
  printf("%d ",temp->value);
 }
 printf("\n");
}

编译运行都没问题,但是调试的时候,在del函数中,到free(del);这一行的时候,继续单步执行就会报错
Thread 1 received signal SIGTRAP,Trace/breakpoint trap.

img

查了一下网上看不懂,感觉这是不是涉及到高级一点的领域了?

求能不能简单的说一下这个错误出现的原因及解决。

  • 写回答

1条回答 默认 最新

  • 浪客 2022-08-20 23:58
    关注

    del的for里,最后一个temp=temp->next;没有判断NULL,因此del有可能是NULL,free出错。

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

报告相同问题?

问题事件

  • 系统已结题 8月29日
  • 已采纳回答 8月21日
  • 创建了问题 8月20日

悬赏问题

  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示