繁体   English   中英

C中的链表程序错误

[英]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 个元素,则有一些解决方案:

1. 向后迭代

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

2. 父类存储链表的大小

另一种方法是使用一个类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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM