所以我用c编写了这段代码,它执行基本的双重链表任务,如创建列表,在给定当前节点之后/之前插入节点,删除给定当前节点等,但是当我试图销毁列表时,我遇到了这个问题。发生的事情是,当我销毁列表时,它正确地释放所有节点(至少我认为从我在调试器观察中看到的是这样),但是当我检查头部和尾部指针是否指向NULL时,因为节点不再存在,头部指向NULL,但我的尾部仍然指向一些我不确定它是否是列表中未正确释放的节点或其他东西。
谁能告诉我发生了什么事?以下是相关代码;这个函数释放所有节点,从而销毁列表
void DListDestruct(DList* list) {
DListNode* tempHead = list->head;;
while (tempHead != NULL) {
tempHead = tempHead->next;
free(list->head);
list->head = tempHead;
}
if (list->tail == NULL) {
list->size = 0;
}
}
//Creation of the structs for the list
typedef struct DListNode_struct {
char *str;
int blankIndex;
int blankLength;
struct DListNode_struct *next;
struct DListNode_struct *prev;
} DListNode;
typedef struct DList_struct {
int size;
DListNode *head;
DListNode *tail;
} DList;
/* This creates a new list and initializes the head/tail */
void DListConstruct(DList* list) {
list->head = NULL;
list->tail = NULL;
list->size = 0;
}
/* inserts newNode after the given currNode */
void DListInsertAfter(DList* list, DListNode* currNode, DListNode* newNode) {
DListNode* sucNode = NULL;
if (list->head == NULL) {
list->head = newNode;
list->tail = newNode;
list->size = list->size++;
}
else if (currNode == list->tail) {
list->tail->next = newNode;
newNode->prev = list->tail;
list->tail = newNode;
list->size = list->size++;
}
else {
sucNode = currNode->next;
newNode->next = sucNode;
newNode->prev = currNode;
currNode->next = newNode;
sucNode->prev = newNode;
list->size = list->size++;
}
}
/* inserts newNode before the given currNode */
void DListInsertBefore(DList* list, DListNode* currNode, DListNode* newNode) {
DListNode* predNode;
if (list->head == NULL) {
list->head = newNode;
list->tail = newNode;
list->size = list->size++;
}
else if (currNode->prev != NULL) {
predNode = currNode->prev;
newNode->next = currNode;
newNode->prev = predNode;
currNode->prev = newNode;
predNode->next = newNode;
list->size = list->size++;
}
else if (currNode->prev == NULL) {
newNode->next = currNode;
currNode->prev = newNode;
list->head = newNode;
list->size = list->size++;
}
}
所以再次,为什么它是,当我销毁列表,使用DListDestroy函数(第一个在顶部),所有节点被释放,头部指针指向NULL,但尾部指针仍然指向什么?
提前感谢!
这是因为尾部仍然指向您释放的节点的地址,所以现在它指向一些垃圾。
头部指向"tempHead"所指向的位置,在循环结束时它指向null,因为在插入过程中,您在最后一个节点的下一个节点中放置了null。
综上所述,尾部指向最后一个节点的地址,这是垃圾。头指向最后一个节点的下一个,它是NULL。