在C语言中如何正确地将一个链表结构体封装到另一个结构体中?

fnvucqvd  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(161)

我正在尝试创建一个抽象数据类型HiddenHeaders和相应的函数(IsEmptyEnqueue),其低级结构对于写main()的用户是透明的。HiddenHeaders *my_list的初始化实际上创建了链表struct listStructure,但是用户不应该意识到这一点-他们将仅通过HiddenHeaders类型的变量与struct listStructure交互,并且函数或底层链表中的任何改变将不需要main()中的任何改变。但是我的程序总是在函数被调用的时候出现SIGSEGV,分段错误,为什么呢?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

struct listStructure {
    int data;
    struct listStructure *nextPtr;
};

typedef struct listStructure ListStructure;

struct hiddenHeaders {
    ListStructure *ptr_to_list;
};

typedef struct hiddenHeaders HiddenHeaders ;

HiddenHeaders * Enqueue (HiddenHeaders *abstract, int user_input);
bool IsEmpty (HiddenHeaders *abstract);

int main () {
    HiddenHeaders *my_list;
    int input;

    my_list = NULL;
    printf ("Enter data item value to add  ");
    scanf ("%d", &input);
    my_list = Enqueue (my_list, input);

return 0;
}

bool IsEmpty(HiddenHeaders *abstract) {
    ListStructure *adt_el = abstract->ptr_to_list;
    bool isEmpty;
    if (adt_el == NULL) {
        return isEmpty=true; }
    else
        return isEmpty=false;
}

HiddenHeaders * Enqueue (HiddenHeaders *abstract, int user_input) {
    ListStructure *adt_el = abstract->ptr_to_list;
    HiddenHeaders *abstract_Ptr = abstract;

      if (!IsEmpty(abstract)) {
        while ((adt_el -> nextPtr) == NULL) {
            adt_el = adt_el -> nextPtr; }

        adt_el -> nextPtr = (ListStructure  *) malloc (sizeof (ListStructure));
        adt_el = adt_el -> nextPtr;
        adt_el -> nextPtr = NULL;
        adt_el -> data = user_input;

        return abstract_Ptr;
    }
    else {
        adt_el = (ListStructure  *) malloc (sizeof (ListStructure));
        adt_el -> nextPtr = NULL;
        adt_el -> data = user_input;

        return abstract;
    }
}

我尝试实现这一点的方法是首先创建一个链表结构体,将其定义为一个新类型(ListStructure),然后创建一个包含指向先前定义的链表的指针的新结构,最后将此新结构定义为类型函数接受HiddenHeaders类型的参数,但是在函数体中,该自变量被展开为ListStructure,然后对该底层链表(或其可能是的任何其它结构)的内容执行操作。

hiz5n14c

hiz5n14c1#

导致此具体分段错误的行是

ListStructure *adt_el = abstract->ptr_to_list;

Enqueue()函数的开头--abstract等于NULL,这会导致非法内存访问,从而导致分段错误。
最好在使用NULL之前检查它们的指针。

相关问题