当前位置: 首页 > 知识库问答 >
问题:

(C基础)LinkedList:在插入方法之后删除本地元素

谢墨竹
2023-03-14

我需要用C语言写一个LinkedList,我在文件中定义了一个构造为结构元素{int value;结构元素*Next;};我还定义了一个head元素。这两个变量都不是本地的,它们是贯穿整个运行时的变量。当我尝试使用外部的int-value将元素插入LinkedList时,我需要在这个int周围包装一个元素。我通过创建一个局部变量struct元素e={value; 0};来做到这一点。如果head为空,我将其设为head,否则我将使用for循环追加它。

我想的问题是,类型为struct element的局部变量e在终止该函数时被删除。因此,如果我的头指向e,它将继续指向未分配的内存点,因为局部变量e不会在函数调用之后继续存在。

提前谢谢!

共有2个答案

麻烨
2023-03-14

您必须使用struct元素类型的列表的动态分配项。

p_element = (struct element*)malloc(sizeof(struct element));
// check if successfully allocated
// initialize element fields: p_element->value = ...
p_element->next = NULL; // always terminator
if (!gp_head_element)
    // initialize head
    gp_head_element = p_element;
else {
    //  search for the end of list and append
}  
潘安邦
2023-03-14

这是因为struct元素e={value;0} 在堆栈上分配元素。当函数作用域终止时,堆栈将自动解除分配(删除)。活动作用域的寻址堆栈内存是完全有效的,但已终止作用域的寻址堆栈内存是未定义的行为。

您需要通过malloc(sizeof(struct-element))在堆上分配它使其在函数作用域中持久化。

struct element *e = calloc(1, sizeof(struct element));
e->value = value;

return e;

注意:calloc分配清零内存,malloc分配未定义内容的内存。

 类似资料:
  • 方法是一组在一起执行任务的语句。每个 C# 程序都至少有一个含有方法的类,名为 Main。 若要使用方法,您需要: 定义一个方法 调用方法 在 C# 中定义方法 当你定义一个方法时,你基本上要声明其结构的组成元素。在 C# 中定义方法的语法如下所示: <Access Specifier> <Return Type> <Method Name>(Parameter List) { Method

  • C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互作用的对象组成。一个对象采取的动作称为方法。 相同种类的对象通常具有相同的属性,或者说,是在相同的类中。 例如,以 Rectangle(矩形)对象为例。它具有 length 和 width 属性。 根据设计,它可能需要接受这些属性值、计算面积和显示细节的方法。 让我们来看看一个 Rectangle(矩形)类的实现,并借此讨论

  • 本文向大家介绍js中数组插入、删除元素操作的方法,包括了js中数组插入、删除元素操作的方法的使用技巧和注意事项,需要的朋友参考一下 实例如下: 通过上面的函数,可以处理上移和下移的动作 定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。 注释:该方法会改变原始数组。 语法 参数 描述 index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置

  • 问题内容: 我的样本代码 执行前要演示 执行后的demo.txt 我也尝试使用setLength来更改文件的长度,然后再添加新文本。但是仍然从输出文件中修剪了一些文本。任何帮助将不胜感激 谢谢马修 问题答案: 随机访问文件的行为就像存储在文件系统中的大字节数组一样。 实际上,在写操作的情况下它并不关心移动数组元素(仅 指针 是先进的)。这样的操作将覆盖现有值: 输出操作从文件指针开始写入字节,然后

  • 问题内容: 我想使用一个开关在网页上放置段落标签。 我使用after伪元素: 现在,我需要从页面中删除此CSS代码。 如何轻松做到这一点? 我要补充一点: jQuery已在页面上使用 而且我不想包含或删除包含CSS的文件。 问题答案: p:after { content: none; } none 是将内容(如果指定)设置为 空 的官方值。

  • 我有一个由Access DB使用ResultSet&填充的JTable。我有一个方法可以正确地从数据库中删除记录,但在刷新表模型的当前视图时遇到了困难。我看过类似的帖子,并尝试使用和,但没有成功。我还注意到其他帖子提到了的使用,因为它有add/remove行方法,但我使用的代码来自我去年使用的Java教科书(教授从未达到这一点,所以我试图自己学习)... 以下是定制JFrame的类: 下面是Abs