繁体   English   中英

如何正确地将链表结构封装在 C 中的另一个结构中?

[英]How to properly encapsulate a linked list struct in another struct in C?

我正在尝试创建一个抽象数据类型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 )。 这些函数接受HiddenHeaders类型的参数,但在函数体中,这个参数被解包到ListStructure ,然后对该底层链表(或任何其他结构)的内容执行操作

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

ListStructure *adt_el = abstract->ptr_to_list;

Enqueue()函数的开头—— abstract等于NULL ,这会导致非法内存访问,从而导致分段错误。

最好在使用指针之前检查指针是否为NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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