c-如何初始化具有多个变量的结构的链表



我在链表和结构之间的关系方面仍然存在问题。

看,我的objectif是创建一个列表,其中每个节点包含2个字符串。所以,我尝试了这样的方法:首先,我创建了一个结构,用我的2个字符表示一个元素;第二,我的列表的控制结构,它将指向我列表的开头。在我的.h中,它给出了这样的东西:

typedef struct s_def { char *first_word; char *second_word; struct s-def *next; }  t_def
typedef struct s_type { t_def *first; } t_list;

接下来,我尝试初始化我的列表。我做了一个这样工作的函数:

t_list *list;
t_def *words;
list = malloc(sizeof(*list));
words = malloc(sizeof(*words));
if (list == 0 || words == 0)
   return (NULL);
words = NULL;
words->next = NULL;
list->first = words;
return (list);

精度:我现在尝试制作一个空列表,这样用户以后可以添加一些元素。

这就是它的阻碍:当我运行程序时,它会给出典型的分段错误。但它看不出我做的东西出了什么问题!我在函数中写了一些东西来追溯这个过程:malloc工作正常,单词=NULL,但段错误似乎在行运行

words->next = NULL;

我做错了什么?为什么我不能在下一个单词处指定NULL值?

首先用分配的内存初始化word指针

words = malloc(sizeof(*words));

然后在3行之后,您再次将指针设置为NULL,从而创建内存泄漏

words = NULL;

然后尝试取消引用刚刚设置为NULL的指针:

words->next = NULL;

因此,只需删除words = NULL;

问题很可能是这部分:

words = NULL;
words->next = NULL;

在这里,将指针words重新分配为空指针,然后直接取消引用该空指针,导致未定义的行为。

当您将单词设置为NULL时,您就生成了一个NULL指针。试图在之后立即通过单词->next访问它实际上是在执行NULL->next,这将导致错误。您的代码看起来比简单链表实现所需的要复杂一些,您可以尝试以下方法:

typedef struct s_element
{
    char* firstWord;
    char* secondWord;
    s_element* next;
} t_element;

t_element* list = NULL;
t_element* addFront(t_element* list, char* word1, char* word2)
{
    t_element* next = list;
    list = malloc(sizeof(t_element));
    if (!list) return NULL;
    list->firstWord = word1;
    list->secondWord = word2;
    list->next = next;
    return list;
}

假设我没有犯任何严重的语法错误,这应该和链表一样清楚。请注意,它不需要检查列表是否为空,唯一的条件是malloc失败。

相关内容

  • 没有找到相关文章

最新更新