簡體   English   中英

指針在鏈表c實現中保持為空

[英]pointer stays null in linked list c implementation

很抱歉打擾你們,但是我很難理解為什么我的鏈表實現仍然為空。 我正在嘗試將元素追加到列表的開頭。 自從我用C語言編程以來已經有很長時間了,經過數小時的檢查,我根本無法發現bug。 是因為我將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;
}

您將在創建它的相同例程中釋放e。 相反,您需要免費刪除它。 為了釋放整個列表,您將需要一個遍歷列表的更實質性的例程,以釋放使用add例程malloc的每個元素。

問題是您要釋放“ e”。 即使在將e分配給列表之后,e仍指向相同的存儲位置。 釋放e只會使分配的內存回到空閑堆的一部分。 同樣,語句list = e不會有任何效果,因為您正在更改list的本地副本。 修改list變量的值,您將需要定義add函數,例如

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

您釋放列表的方式將僅釋放列表的最后一個節點。 您將必須編寫循環以釋放完整列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM