很抱歉打扰你们,但是我很难理解为什么我的链表实现仍然为空。 我正在尝试将元素追加到列表的开头。 自从我用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;
}

===============>>#1 票数:1

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

===============>>#2 票数:1

问题是您要释放“ 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;
}

您释放列表的方式将仅释放列表的最后一个节点。 您将必须编写循环以释放完整列表。

  ask by ramziabbyad translate from so

未解决问题?本站智能推荐:

2回复

为什么在C中通过单链接列表进行迭代时NULL指针检查不起作用?

我正在尝试从堆打印。 如果遇到NULL指针,则应该输出NULL。 否则,打印它的价值。 样本输出: 但是我的代码因解引用NULL指针而不断崩溃。 这是我编写的要测试的代码:
1回复

LinkedList的Java实现输出null

我在这里遇到了麻烦,我正在实现自己的Linked List类,该类可以完成您所期望的工作,它将元素添加到列表中并使用ToString方法输出它们。 由于某种原因,它可以将元素很好地添加到列表中,但是当需要输出列表时,它会在前面添加一个null元素,而忽略最后一个元素的打印。 这是我的主要课程
1回复

C中的指针和链表

我在C中开始学习指针和链表,但我有一个问题: 为什么输出: 我期望这样:在函数中,head为NULL在main中,head为NULL 这是我第一次使用C语言指针,无法理解我的错误
1回复

C链表removeLast使用指针

我正在学习如何在c中创建链表,但遇到了一个无法解决的问题。 我的链表的removeLast(link * ptr)方法遇到问题,我相信它与指针的使用有关,但是我真的不明白为什么程序无法从列表中删除倒数第二个元素,不知何故我的名单被销毁了。 这是我的代码: 这是我的输出: 感谢
1回复

通过C中的链表实现队列

我正在使用链接列表实现队列,但是在insert()函数中遇到了问题。 我只能插入一个数据,每当我插入另一个数据,然后再插入以前的数据时,无论我第一次插入什么。
2回复

冒泡排序链表,交换指针。 C

我正在尝试使用冒泡排序交换单个链接列表的两个指针。 我做了比较功能,它的工作很好。 在交换功能中,交换工作正常,我设法在节点和node->next之间进行交换,尽管链表“丢失”了节点的信息(在交换之后),所以第一个节点在链表是node->next 。 我正在使用一个通用函数来进
4回复

在C中优雅实现循环单链表?

经历了经典的数据结构并停止在链表上。只是实现了一个循环的单链表,但我印象深刻的是这个列表可以用更优雅的方式表达,特别是remove_node函数。 牢记效率和代码可读性,任何人都可以为单链循环列表提供更简洁有效的解决方案吗?
1回复

C中的链表实现,运行时错误

编译代码时没有错误,但是两次输入后,程序在运行时崩溃。 也许有一些我无法找出的逻辑错误。 我正在尝试在链接列表的末尾插入节点,同时仅保持头位置。
2回复

Head在单链列表中保持与尾指针相同的值

我正在尝试创建一个包含两个参数的节点的单链接列表。 每当我使用尾指针将另一个节点排入队列时,头指针都会采用与新节点相同的值。 我确定指针指向相同的内存位置或相似的位置,但是我不确定如何解决此问题。 我想使用此功能创建一个单链表,其头节点指向列表中的第一个元素,尾节点指向列表中的最