C 使用';对于';在单链表中循环

C 使用';对于';在单链表中循环,c,singly-linked-list,C,Singly Linked List,这是我的完整程序: #include <stdio.h> #include <stdlib.h> #define kArraySize 50 #define kFirstElement 0 struct Name { char name[kArraySize + 1]; struct Name *nextName; } *gFirstNameNode, *gLastNameNode; char GetName(struct Name *current

这是我的完整程序:

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

#define kArraySize 50
#define kFirstElement 0

struct Name {
    char name[kArraySize + 1];
    struct Name *nextName;
} *gFirstNameNode, *gLastNameNode;

char GetName(struct Name *currentName);
void AddToList(struct Name *currentName);
void PrintList(struct Name *gFirst);
void FreeTheMemory(struct Name *gFirst);

int main(void) {
    struct Name *currentName;
    char character;
    int counter;
    gFirstNameNode = NULL;
    gLastNameNode = NULL;

    do {
        currentName = malloc(sizeof(struct Name));
        if (currentName == NULL) {
            printf("Out of Memory!\n");
            exit(0);
        } else {
            for (counter = 0; counter <= kArraySize; counter++)
                currentName->name[counter] = '\0';
        }
        character = GetName(currentName);
        if ((currentName->name[kFirstElement]) != '\0') {
            AddToList(currentName);
        }
    } while (character != '\r');

    PrintList(gFirstNameNode);
    printf("Freeing list memory");
    FreeTheMemory(gFirstNameNode);

    printf("\nFreeing Current Memory!\n");
    free(currentName);

    printf("Program Ended");
    return 0;
}

char GetName(struct Name *currentName) {
    char c;
    int counter = 0;
    printf("Enter a name (hit 'return' to exit):");
    for (counter = 0; (counter <= kArraySize) && ((c = getchar()) != '\n'); counter++) {
        currentName->name[counter] = c;
    }

    if (counter == 0) {
        return '\r';
    } else {
        currentName->name[counter + 1] = '\0';
        return '\0';
    }
}

void AddToList(struct Name *currentName) {
    if (gFirstNameNode == NULL) {
        gFirstNameNode = currentName;
    } else {
        gLastNameNode->nextName = currentName;
    }

    gLastNameNode = currentName;
    currentName->nextName = NULL;
}

void PrintList(struct Name *gFirst) {
    struct Name *currentPointer;

    if (gFirstNameNode == NULL) {
        printf("No names in list\n");
        printf("----------------\n");
    } else {
        for (currentPointer = gFirst; currentPointer != NULL; currentPointer = currentPointer->nextName) {
            printf("Name: %s\n", currentPointer->name);
        }
    }
}

void FreeTheMemory(struct Name *gFirst) {
    struct Name *currentPointer;

    for (currentPointer = gFirst; currentPointer != NULL; currentPointer = currentPointer->nextName) {
        free(currentPointer);
        printf(".");
    }
}

我不确定释放currentPointer是否真的释放了链表。换句话说,我想知道我的逻辑是否正确。我没有人要问,因此我非常感谢您的帮助。

您在执行此操作时遇到问题:

free(currentPointer);
其次是:

在释放下一个名称后,您不能遵从
currentPointer
来获取它

相反,您应该做如下操作:

currentPointer = gFirst;
while ( currentPointer ) {
    struct Name * next = currentPointer->nextName;
    free(currentPointer);
    currentPointer = next;
}

您在执行此操作时遇到问题:

free(currentPointer);
其次是:

在释放下一个名称后,您不能遵从
currentPointer
来获取它

相反,您应该做如下操作:

currentPointer = gFirst;
while ( currentPointer ) {
    struct Name * next = currentPointer->nextName;
    free(currentPointer);
    currentPointer = next;
}

GetName
中的
c
应定义为
int
,您应在while循环中检查
EOF
,而且
计数器上的测试应为
计数器
,设置
'\0'
应使用
currentName->name[计数器]='\0'完成
在释放下一个节点时,需要在列表中存储对下一个节点的临时引用,否则将在
GetName
中取消对已释放内存的引用
c
应定义为
int
,并且应在while循环中检查
EOF
,此外,
计数器
上的测试应为
计数器
,设置
'\0'
时应使用
currentName->name[counter]='\0'释放节点时,需要在列表中存储对下一个节点的临时引用,否则最终会取消对已释放内存的引用感谢您花时间回答问题。非常感谢。非常感谢您抽出时间回答这个问题。非常感谢。