csdn_mobile 2022-08-21 10:29 采纳率: 69.2%
浏览 51
已结题

c语言单链表删除功能问题

最近在学习单链表的操作,增删查改这些,自己改善了一下代码,感觉其他的都没问题,就是删除函数这里有问题。我单独剔出来了

#include<stdio.h>
#include<stdlib.h> 
typedef struct link{
 int value;
 struct link *next;
}Link;
Link* init_list(void);//初始化 
void display(Link *p);//链表输出
Link* del(Link *p,int location);//删除元素

int main()
{
 int cut;
 Link *q=init_list();
 printf("初始化链表为\n");
 display(q);
 printf("请输入要删除的数的位置:\n");
 scanf("%d",&cut); 
 del(q,cut);
 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;
}

/****************************************/
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;
}
/****************************************/

void display(Link *p)
{
 Link* temp=p;
 while(temp->next!=NULL)
 {
  temp=temp->next;
  printf("%d ",temp->value);
 }
 printf("\n");
}

能帮忙看看该怎么改正吗

  • 写回答

3条回答 默认 最新

  • 摁回车的大雷 2022-08-21 11:03
    关注

    题主你好:

    /*******************61*********************/
    Link* del(Link *p,int location)
    {
       if(temp->next==NULL)            //if判断放这里,不应该放在for循环里 表示对删除操作做合法性检查
            {                                          // if(temp->next==NULL)  如果链表是空的,则删除操作不合法,后面没必要执行了,直接返回
                printf("删除位置无效!\n");    
                return p;
            }
        int i;
        Link *temp=p;
        Link *del=NULL;
        for(i=1;i<location;i++)    {
            temp=temp->next;            //你说上面改成if (temp->next->next==NULL)就可以了只是巧合。因为如果你把原来的 if(temp->next==NULL) 放在这里
        }                                            //随着for循环的进行,temp在往后走,如果删除的是最后一个位置,会出现temp->next==NULL为真,就会出错返回
            del=temp->next;               //改成if (temp->next->next==NULL),删倒第二个结点也会为真。所以合法性检查应该放前面
            temp->next=temp->next->next;
            free(del);
            return p;
    }
    /******************78**********************/
    

    有帮助请点一下采纳谢谢,可以参考我写的单链表的文章,有图解
    https://blog.csdn.net/qq_41796226/article/details/125980808?spm=1001.2014.3001.5502

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?