【问题标题】:can't delete the head node of my linked list无法删除我的链表的头节点
【发布时间】:2021-12-31 22:20:12
【问题描述】:

我正在尝试为 mini SQL 语言创建一种简单的编译器,当我执行算法时,有一个步骤需要调用函数来删除链表的头节点(包含词法语言单位)并将头部分配给第二个节点。在函数内部,代码似乎工作得很好(当我打印列表时,头部现在是第二个节点)。但是原始列表的变化很奇怪,因为第一个头仍然存在,但是具有不同的值,例如 12321104(=p)。所以问题出在哪里 这是我的链表的结构:

typedef struct U_Lexicale {
    char* Nom_UL; 
    int Type_UL; 
    int Ligne_UL;
    struct U_Lexicale* suivant;
} ElementUL;

void suppression(ElementUL* liste) {
    if (liste == NULL) {
        exit(EXIT_FAILURE);
    }

    if (liste != NULL) {
        ElementUL* tmp = liste;
        liste = liste->suivant;
        free(tmp);

        afficherListeUL(liste);
    }
}

suppression(copieAnalyseLex);

【问题讨论】:

  • 奇怪的是,你使用U_Lexicale 作为结构名称,使用ElementUL 作为类型定义。在两个地方使用相同的名称以避免混淆。
  • 样式说明:你不需要第二个if。如果liste 是NULL,程序将退出,因此将无法执行其余的功能。如果这没有发生,那么我们已经知道 liste 不是NULL。
  • 如果你不退出,else 会更有意义。

标签: c function pointers linked-list codeblocks


【解决方案1】:

您修改了liste,但没有修改copieAnalyseLex 以反映该更改。

#include <assert.h>

void suppression(ElementUL** liste_p)
{
    assert( *liste_p != NULL );

    ElementUL* tmp = *liste_p;
    *liste_p = (*liste_p)->suivant;
    free(tmp);
}

suppression(&copieAnalyseLex);
afficherListeUL(copieAnalyseLex);

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多