C - 解除分配整数列表

时间:2014-03-31 19:29:26

标签: c list struct malloc

我们必须使用以下列表声明:

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);
}

2 个答案:

答案 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作业在函数外部无效。其次,该功能不能正确释放内存。它应该沿着列表向下移动并释放每个节点。