C语言中的链表程序错误

C语言中的链表程序错误,c,linked-list,C,Linked List,这是我的代码,它从上一个列表中删除了列表项的数量。我试图实现链表的概念 void del(list** head,int da,int n) { //da-for no of elements to be list *l1; //deleted from end. int n1 = n-da; //n-for total no of elements in list if (n

这是我的代码,它从上一个列表中删除了列表项的数量。我试图实现链表的概念

void del(list** head,int da,int n) {  //da-for no of elements to be   
    list *l1;                         //deleted from end.
    int n1 = n-da;                    //n-for total no of elements in list 
    if (n1 == 0)
        *head = NULL;
    else {
        l1 = *head;
        n1 = n1-1;
        while(n1) {
            l1 = l1->next;
            n1--;
        }
        l1->next=NULL;
     }
}
包含此代码后,我得到SIGSEGV错误。这是什么意思?请帮我输入这个代码。因为我最近开始学习数据结构。我没有那么多编程经验,但我知道一些C语言的基础知识。

如果你的问题是“什么是SIGSEGV?”这是一个错误信号。现在,如果您想知道是什么导致了它,那么是您的
void del(list**head,int da,int n)
函数在
da
时导致了它,因为它导致了一个逻辑错误,导致了一个无限循环:

int n1 = n - da; // Assume n < da

...

while(n1) { // n would be 0< therefor: n1 will never equal 0 causing infinite loop
    l1 = l1->next;
    n1--;
}
int n1=n-da;//假设nnext;
n1-;
}
如果您试图从链表后面删除n个元素,有几种解决方案:

1.反向迭代 迭代到链表的尾部或当
list->next==null
时,然后在每次迭代后向后迭代,删除正在传递的节点,直到n个节点被删除

2.存储链接列表大小的父类
另一种方法是使用一个类
链接
,该类存储头节点、尾节点和链接列表的大小。然后从列表尾部迭代,删除n个(n)节点,或者迭代到长度-n,然后开始删除,直到到达尾部。

我认为,当调用delete时,如果对
n1
的值太大,可能会出现segfault。本例中的循环:

while(n1) {
  l1 = l1->next;
  n1--;
}

将走得太远,访问
*l1
,其中
l1==NULL
。我不知道你的
del
函数应该做什么,但这就是你的segfault的来源。如果从main中删除对
del
的调用,则不会出现此类问题。

请仔细检查您到底遇到了什么错误,并完整逐字地引用它。另外,请进行一些基本的调试,以尽可能缩小出现错误的范围。您的错误在函数
del
中。如果
da
n
是什么意思?是否应删除索引
da
n
中的元素?