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'代码>释放节点时,需要在列表中存储对下一个节点的临时引用,否则最终会取消对已释放内存的引用感谢您花时间回答问题。非常感谢。非常感谢您抽出时间回答这个问题。非常感谢。