指针在链表c实现中保持为null

时间:2014-04-20 15:27:38

标签: c null singly-linked-list

很抱歉打扰你们,但我很难理解为什么我的链表实现保持为空。我试图将元素附加到列表的开头。自从我用C语言编程以来已经很长时间了,经过几个小时的检查后我根本无法发现错误。是因为我将e分配给列表然后释放e ??

#include <stdio.h>
#include <stdlib.h>
struct element{
  struct element *next;
  int i;
};
typedef struct element element;

void add(element *list, int n){
  element *e;
  e = malloc(sizeof(element));
  e->i = n;
  e->next = list;
  list = e;
  free(e);

}

void display(element *list){
  element *p;
  p = list;
  while(p!=NULL){
    printf(" %d\n",p->i );
    p=p->next;
  }

}

int main(void){
  element *list,*tail,*e, *p;
  //list = (element *)malloc(sizeof(element));
  //list->next = 0;
  list=NULL;
  add(list, 1);
  add(list,2);  
  add(list, 3); 
  display(list);
  //printf("%d\n",list->next);
  free(list);

  return 0;
}

好的,感谢气泡提示额外的间接水平。我是这样的菜鸟......为什么我只需要一级间接将元素添加到列表的末尾,如下所示?

#include <stdio.h>
#include <stdlib.h>
struct element{
  struct element *next;
  int i;
};
typedef struct element element;

void addB(element **list,int n){
    element *e = malloc(sizeof(element));
    e->i = n;
    e->next = *list;
    *list = e;
    //printf("%d\n", list->i);
}

void addE(element *list, int n){
  element *e = malloc(sizeof(element));
  e->i = n;
  e->next = NULL;
  element *p;
  p = list;
  if(!(list)){
    list = e;
  }else{
      while(p->next){
        p=p->next;
      }
      p->next = e;
  }

}

void display(element *list){
  element *p;
  p = list;
  while(p!=NULL){
    printf(" %d\n",p->i );
    p=p->next;
  }

}

void freelist(element *list){
  if(!(list->next)){
    free(list);
  }else{
    freelist(list->next);
  }

}

int main(void){
  element *list;
  list = NULL;
  addB(&list,1);
  addB(&list,2);
  addB(&list,3);
  addE(list,4);
  display(list);
  freelist(list);

  return 0;
}

2 个答案:

答案 0 :(得分:1)

您正在以创建它的相同例程释放e。相反,你需要删除该免费。为了释放整个列表,您需要一个更具实质性的例程来遍历列表,使用add例程释放malloc所使用的每个元素。

答案 1 :(得分:1)

问题是你正在释放“e”。 即使在将e分配给列表后,e仍然指向相同的存储位置。释放e将简单地将分配的内存返回到空闲堆的一部分。声明list = e也不起作用,因为您正在更改列表的本地副本。修改list变量的值,您必须定义添加函数,如

void add(element **list, int n){
  element *e;
  e = malloc(sizeof(element));
  e->i = n;
  e->next = *list;
  *list = e;

}


int main(void){
  element *list,*tail,*e, *p;
  //list = (element *)malloc(sizeof(element));
  //list->next = 0;
  list=NULL;
  add(&list, 1);
  add(&list,2);  
  add(&list, 3); 
  display(list);
  //printf("%d\n",list->next);
  free(list); //Should be replaced with a loop.

  return 0;
}

释放列表的方式只会释放它的最后一个节点。您必须编写一个循环来释放完整列表。