Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图';免费';C语言中的链表_C_List - Fatal编程技术网

试图';免费';C语言中的链表

试图';免费';C语言中的链表,c,list,C,List,我昨天开始了C编程,并尝试实现一个链表(非常基本) 到目前为止,除了释放一个列表外,一切都很顺利 首先,这是我的代码: #include <stdio.h> #include <stdlib.h> /* * Struct for elements of the linked list */ struct element { struct element* nextelement; int value; }; /* * Struct for a l

我昨天开始了C编程,并尝试实现一个链表(非常基本)

到目前为止,除了释放一个列表外,一切都很顺利

首先,这是我的代码:

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

/*
 * Struct for elements of the linked list
 */
struct element {
    struct element* nextelement;
    int value;
};

/*
 * Struct for a list itself
 */
struct liste {
    struct element* headelement;
};

/*
 * Function to create new elements
 */
struct element* createelement(int value) {
    struct element* dummyelement = malloc(sizeof(struct element));
    dummyelement->nextelement = NULL;
    dummyelement->value = value;
    return dummyelement;
}

/*
 * Function to create new (empty) lists
 */
struct liste* createlist() {
    struct liste* dummylist = malloc(sizeof(struct liste));
    dummylist->headelement = NULL;
    return dummylist;
}

/*
 * Add an element to a given list
 */
void addelement(struct liste* liste, int value) {

    struct element* dummyelement = createelement(value);
    if (liste->headelement == NULL) {
        liste->headelement = dummyelement;
    } else {
        struct element* iterelement = liste->headelement;
        while (iterelement->nextelement != NULL) {
            iterelement = iterelement->nextelement;
        }
        iterelement->nextelement = dummyelement;
    }

}

/*
 * Plot the elements of a given list
 */
void plotlist(struct liste* liste) {
    if (liste->headelement != NULL) {
        struct element* iterelement = liste->headelement;
        printf("%d\n", iterelement->value);
        while (iterelement->nextelement != NULL) {
            iterelement = iterelement->nextelement;
            printf("%d\n", iterelement->value);
        }
    } else {
        printf("Where is my head?\n");
    }
}

/*
 * This should completely remove the list, but it fails...
 */
void removelist(struct liste* liste) {
    if (liste->headelement != NULL) {
        struct element* iterelement = liste->headelement;
        struct element* nextelement = iterelement->nextelement;
        free(iterelement);
        while (nextelement != NULL) {
            iterelement = nextelement;
            nextelement = iterelement->nextelement;
            free(iterelement);
        }
    }

    free(liste);
}

int main(void) {

    /*
     * Creates a new list
     * Plots the (empty) list
     * Adds two elements to the list
     * Plots the list again
     * Removes the list
     * Last plot shouldn't really happen, but it does.
     */
    struct liste* mylist = createlist();
    printf("First plot.\n");
    plotlist(mylist);
    addelement(mylist, 1);
    addelement(mylist, 2);
    printf("Second plot.\n");
    plotlist(mylist);
    removelist(mylist);
    printf("Third plot.\n");
    plotlist(mylist);

    return 0;

}

很明显,33岁是我的问题。我真的不知道这是怎么输出的。。。此外,我不知道为什么我的“removelist”不能正常工作。我正在释放我用“malloc”分配的所有东西。我做错了什么?

您没有在
plotlist
内检查您的列表是否确实存在。您可以直接尝试访问
标题元素
。最好做到以下几点:

void plotlist(struct liste* liste) {
    if(liste == NULL){
        printf("This list does not even exist.\n");
    }
    else if (liste->headelement != NULL) {
        // ...
    } else {
        printf("Where is my head?\n");
    }
}
由于
removelist
同样也释放了列表结构,因此最好将指针设置为main中的
NULL
。否则,在访问释放的内存时会出现未定义的行为

int main(void) {
    // ...
    removelist(mylist);
    mylist = NULL;
    printf("Third plot.\n");
    plotlist(mylist);

    return 0;

}

欢迎来到堆栈溢出!听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:。请记住,
removelist
将清除整个列表(或其应该清除的列表)。最重要的是释放您传入的指针指向的内存。因此,当您使用同一指针调用
plotlist
时,您使用的是一个悬空指针<代码>如果(liste->headelement!=NULL){不会保护您免受此影响。因此在
removelist
结束时,只需将
liste->headelement
设置为NULL,而不释放它。不过,您以后仍需要释放它。
int main(void) {
    // ...
    removelist(mylist);
    mylist = NULL;
    printf("Third plot.\n");
    plotlist(mylist);

    return 0;

}