单链表的释放内存free(delete)的顺序

在单链表中我们在程序的最后加上一个释放内存的方法或者操作,这是一个很好的习惯。

但是在销毁过程当中,我遇到了一个问题,那就是释放的顺序应该是怎么样的,刚开始的时候我很思维习惯的用“数据输出”的方法,顺序的将内存释放了,但是出现了内存错误(泄露),百思不其解。

后来发现,原来是释放的顺序搞反了,如果顺序释放的话,释放了第一个节点,其后的节点都丢失了,因为其后的节点都是通过头结点来寻找的。

下面附上做实验时候的内存释放代码:如果有不对的地方,请大家纠正

void Destroy(AddressBook &ab)
{
	Student * temp;
	Student * del;
	del = ab.first->next;
	temp = ab.first ->next->next;
	while(temp)
	{
		free(del);
		del = temp;
		temp = temp->next;
	}
	free(del);
	free(ab.first);
	ab.length = 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过以下步骤构建一个双向循环单链表:1. 创建一个节点结构,其中包含一个指向前一个节点的指针和一个指向下一个节点的指针;2. 创建一个头节点,其中包含一个指向第一个节点的指针和一个指向最后一个节点的指针;3. 创建一个新节点,把它放在头节点后面;4. 把新节点的指针指向头节点;5. 把头节点的指针指向新节点;6. 重复步骤3-5,直到链表满足所需的长度。 ### 回答2: 双向循环单链表是一种数据结构,它与普通单链表不同之处在于其最后一个节点的下一个指针指向头节点,而头节点的前一个指针指向最后一个节点。在C语言中,可以通过定义一个包含两个指针的结构体来构建双向循环单链表。 首先,我们可以创建一个结构体来表示双向循环单链表的节点,该节点应包含两个指针,分别指向前一个节点和后一个节点。定义如下: ```c typedef struct Node { int data; struct Node* next; struct Node* prev; } Node; ``` 接下来,我们需要定义一些基本的操作函数来实现双向循环单链表的操作,例如创建节点、插入节点等。 首先是创建节点的函数,该函数接受一个整数值作为参数,并返回一个指向新节点的指针。该函数的实现如下: ```c Node* createNode(int value) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->next = NULL; newNode->prev = NULL; return newNode; } ``` 接下来是插入节点的函数,在双向循环单链表中插入节点需要考虑两种情况:插入头部和插入其他位置。具体实现如下: ```c void insertNode(Node** head, int value) { Node* newNode = createNode(value); if (*head == NULL) { // 如果链表为空,将新节点设为头节点 *head = newNode; newNode->next = newNode; newNode->prev = newNode; } else { // 链表不为空时,将新节点插入到链表尾部 Node* lastNode = (*head)->prev; newNode->next = *head; newNode->prev = lastNode; (*head)->prev = newNode; lastNode->next = newNode; } } ``` 以上是构建双向循环单链表的基本步骤,通过定义节点结构体以及相关的操作函数,我们可以在C语言中实现一个双向循环单链表。需要注意的是,在使用双向循环单链表时,要特别小心处理链表为空的情况以及节点的插入顺序,保证链表的连接正确性。 ### 回答3: 双向循环单链表是一种链表数据结构,每个节点除了保存数据还有指向前一个节点和后一个节点的指针。构建一个双向循环单链表可以按照以下步骤进行: 1. 定义节点结构体:创建一个结构体来表示链表的节点,包含数据和指向前一个节点和后一个节点的指针。 ```c struct Node { int data; struct Node* prev; struct Node* next; }; ``` 2. 定义链表操作函数:创建链表时需要定义一些操作函数来执行插入、删除等操作。 ```c struct Node* createNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if (newNode == NULL) { printf("内存分配失败!"); return NULL; } newNode->data = data; newNode->prev = NULL; newNode->next = NULL; return newNode; } void insertNode(struct Node** head, int data) { struct Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; newNode->next = newNode; newNode->prev = newNode; } else { newNode->next = *head; newNode->prev = (*head)->prev; (*head)->prev->next = newNode; (*head)->prev = newNode; } } void deleteNode(struct Node** head, int data) { if (*head == NULL) { printf("链表为空!"); return; } struct Node* current = *head; while (current->data != data) { current = current->next; if (current == *head) { printf("无法找到该节点!"); return; } } if (current == *head) { (*head)->prev->next = (*head)->next; (*head)->next->prev = (*head)->prev; *head = (*head)->next; free(current); } else { current->prev->next = current->next; current->next->prev = current->prev; free(current); } } void displayList(struct Node* head) { if (head == NULL) { printf("链表为空!"); return; } struct Node* current = head; do { printf("%d ", current->data); current = current->next; } while (current != head); } ``` 3. 主函数:使用上述操作函数可以创建双向循环单链表。 ```c int main() { struct Node* head = NULL; // 向链表中插入节点 insertNode(&head, 1); insertNode(&head, 2); insertNode(&head, 3); // 删除链表中的节点 deleteNode(&head, 2); // 显示链表中的数据 displayList(head); return 0; } ``` 上述代码中,我们首先定义了一个节点结构体,然后定义了创建节点、插入节点、删除节点和显示链表数据的相关函数。最后在主函数中创建了一个空链表,并使用上述函数进行插入、删除和显示操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值