当我使用双向链表中的最后一个指针时代码崩溃

Posted

技术标签:

【中文标题】当我使用双向链表中的最后一个指针时代码崩溃【英文标题】:code crashes when i use the last pointer in doubly linked list 【发布时间】:2022-01-18 11:41:45 【问题描述】:

所以我为双向链表编写了一些代码,并在制作一个用于在末尾添加节点的函数时,我想为最后一个节点创建一个指针,但是当我执行它以最后添加时它崩溃了,但是在前端添加它工作正常。一切看起来都很好,甚至没有显示任何错误,只是崩溃了。

#include <stdio.h>
#include <stdlib.h>
struct node

    int data;
    struct node *lptr;
    struct node *rptr;
;
typedef struct node *Node;

Node pos(Node first, Node last)

    Node new;
    new = (Node)malloc(sizeof(struct node));
    new->lptr = NULL;
    new->rptr = NULL;
    printf("Enter data: ");
    scanf("%d", &new->data);
    if (first == NULL)
    
        first = new;
        last = new;
    
    else
    
        int p;
        printf("1) First\n2) Last\n");
        scanf("%d", &p);
        switch (p)
        
        case 1:
            first->lptr = new;
            new->rptr = first;
            first = new;
            break;
        case 2:
            last->rptr = new;
            new->lptr = last;
            last = new;
            break;

        default:
            break;
        
    

    return first;

void dis(Node first)

    Node p;
    int c = 1;
    if (first == NULL)
    
        printf("Empty");
    
    else
       p=first;
        while (p != NULL)
        
            printf("%dst element is %d\n", c, p->data);
            c++;
            p = p->rptr;
        
    

int main()

    int ch;
    Node first, last, t;

    first = NULL;
    last = NULL;
    for (;;)
    
        printf("Insert: \n");
        scanf("%d", &ch);
        switch (ch)
        

        case 1:
            first = pos(first, last);
            break;
        case 2:
            dis(first);
            break;
        default:
            printf("invalid");
            exit(0);
        
    
    return 0;

认为问题出在这部分;

case 2:
            last->rptr = new;
            new->lptr = last;
            last = new;
            break;

【问题讨论】:

不相关的,在 typedef 中隐藏指针类型作为语言或数据结构课程学习时,实际上是您可以做的最无“帮助”的事情。它所做的只是混淆代码,而这正是您想要的,尤其是现在。关于您的代码,请查看dis 中的while 循环,并问自己当else 子句被触发时,p 中的值是多少?提示:没有定义的值。您从未将p 初始化为任何内容,因此您的代码会调用未定义的行为。看到之后我停止了阅读。加快警告并将其视为错误。 show any error but just crashes.你试过valgrind还是用gdb一步步检查? 不知道这是否是问题所在,但此代码存在的问题是 ***.com/questions/13431108/… 与 firstpos 中的 last 相关。您可以通过返回并分配新值来解决 first 的问题,但不适用于 last 【参考方案1】:

问题在于函数pos 没有改变main 中声明的指针last。它更改了它的局部变量(参数)last,该变量由main 中声明的指针last 的值的副本初始化。但是main中声明的指针last保持不变。

您应该再声明一个结构,例如

struct List

    struct node *first;
    struct node *last;
;

并使用这个结构作为函数的参数。

//...

int pos( struct List *list );

int main( void )

    struct List list =  .first = NULL, .last = NULL ;

    pos( &list );
    //...

此外,最好将函数拆分为两个函数。第一个将数据添加到列表的开头,第二个将数据添加到列表的尾部。

例如

int push_front( struct List *list, int data );
int push_back( struct List *list, int data );

【讨论】:

以上是关于当我使用双向链表中的最后一个指针时代码崩溃的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试从双向链表中删除最后一个元素时,为啥会收到“信号 SIGSEGV,分段错误”?

双向链表

二叉搜索树与双向链表

二叉搜索树与双向链表

二叉搜索树与双向链表(Python and C++版本)

使用 scala 实现双向链表