我们必须使用以下列表声明:
typedef struct node {
int val;
struct node* next;
} node;
并写下这些功能:
1)node* add(int val, node* list)
在给定列表的开头插入一个新节点并返回它的指针
2)print(node* list)
打印列表中的元素
3)delete(node* list)
释放给定列表的所有元素
我不确定我是否正确使用了内存,但我写的代码给出了一个奇怪的输出:/
有人可以帮我吗 ?感谢
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int val;
struct node* next;
} node;
node* aux;
node* add(int n, node* list){
aux = malloc(sizeof(node));
if(list==NULL){
aux->val=n;
aux->next=NULL;
}
else{
aux->val=n;
aux->next=list;
}
return aux;
}
void print(node* list){
printf("[");
while(list != NULL){
if(list->next!=NULL)printf("%d, ",list->elem);
else printf("%d",list->elem);
list = list->next;
}
printf("]\n");
}
void delete(node* list){
list=NULL;
//printf(list); prints the expected output: []
}
/*EDIT: Correct function delete
void delete(node* list){
while( list != null){
node* temp = list->next;
free(list);
list=temp;
}
}
*/
int main(){
node* x = add(5, add(3, add(2, add(7, add(4, add(1, add(6, NULL)))))));
print(x);
delete(x);
print(x); //still prints the initial list
return(0);
}
答案 0 :(得分:2)
在
void delete(node* list){
list=NULL;
//printf(list); prints the expected output: []
}
您只将局部变量(即:参数)list
设置为空,这不会影响来自外部世界的x
。
首先,你应该:
void delete(node** list){
*list=NULL;
}
将x
从main设置为NULL ...但是这不会释放您的列表,内存仍然存在且已分配(内存泄漏)。你需要遍历列表并释放所有元素......这是你的作业:)
Offtopic:是的,我知道这是C
...但是,当使用delete
编译器编译时,调用函数C++
会遇到麻烦...告诉这个给老师delete
是保留的关键字。
答案 1 :(得分:0)
您的delete
函数有两个问题。首先,您的list = NULL
作业在函数外部无效。其次,该功能不能正确释放内存。它应该沿着列表向下移动并释放每个节点。