[英]Linked list program error in C
这是我的代码,它删除了最后一个列表项。我试图实现链表概念。
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?” 这是Segmentation Fault的错误信号。 现在,如果您想知道是什么原因造成的,那是您的void del(list** head,int da,int n)
函数在da < n
时导致未定义的行为,因为它会导致逻辑错误,从而导致无限循环:
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--;
}
如果您尝试从链表的后面删除 n 个元素,则有一些解决方案:
迭代到链表的尾部或当list->next == null
然后向后迭代每次迭代删除正在传递的节点,直到删除了n 个节点
另一种方法是使用一个类linked link
来存储头节点、尾节点和链表的大小。 然后从列表的尾部迭代删除n O(N) 个节点或迭代到长度 - n然后开始删除直到到达尾部。
我认为当您使用太大的n1
值调用 delete 时,您可能会遇到段错误。 在这种情况下你的循环:
while(n1) {
l1 = l1->next;
n1--;
}
会走得太远并访问*l1
其中l1 == NULL
。 我没有完全按照您的del
函数应该做什么,但这就是您的段错误的来源。 如果您从 main 中删除对del
的调用,则不会出现此类问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.