C++ 如何使用structs制作链表?

C++ 如何使用structs制作链表?,c++,struct,linked-list,C++,Struct,Linked List,我已经看过一些关于链表的主题,我已经读了足够多的书来收集一般的方法,但是我想确保我没有错误地解释我收集的信息 假设我有: struct element { int val; element *next; }; 元素*下一个是指向元素的指针,该指针将用于将元素连接在一起以形成链表 我还发现,你需要某种形式的“捆绑”,这样你就不会丢失你的清单。我的教授把它描述为一条气球的轨迹,如果你没有一个“系带”,你的列表可能会丢失 因此,我首先创建“系紧”指针: 这就是我迷路

我已经看过一些关于链表的主题,我已经读了足够多的书来收集一般的方法,但是我想确保我没有错误地解释我收集的信息

假设我有:

struct element 
{
    int       val;
    element   *next;
};
元素*下一个是指向元素的指针,该指针将用于将元素连接在一起以形成链表

我还发现,你需要某种形式的“捆绑”,这样你就不会丢失你的清单。我的教授把它描述为一条气球的轨迹,如果你没有一个“系带”,你的列表可能会丢失

因此,我首先创建“系紧”指针:

这就是我迷路的地方。。。如何添加到链接列表的标题中?排序在这一点上并不重要,我只需要从一个无序的列表开始,稍后我会变得更复杂

像这样的

element addMe;
addMe -> val = 100;

first -> next = *addMe;
是这样吗

我将如何向非空列表添加内容

谢谢你的时间

编辑:这不是家庭作业。我们已经检查了链表,并对它们做了一项作业。我的作业成绩不是很好,所以在下一次作业之前,我正在努力加强我的理解。我们将再次使用链表

Edit2:谢谢


我不知道这是否会被视为“家庭作业”。我个人不这么认为,因为我不会使用我在这里发布的代码。

如果你想添加到列表的开头

struct element *el = (element *) malloc(sizeof(struct element));
el->val = 100;
el->next = first;
现在el是第一个元素,第一个元素是第二个元素

在您的示例中,您将使用新元素覆盖第一个元素和下一个元素。您可以剪切列表并插入新元素作为第二个元素。第一个元素之后的所有内容现在都不在列表中(这也是一个列表,但您无法访问它,因为您重写了指向第三个元素的指针)

要添加到列表的末尾,请迭代

struct element *e;

e = first;
while (e->next !=0)
  e = e->next;

// here e is the last element. Allocate a new one and point e->next to it. And set this new one next to 0.

对于单链接列表,添加新元素的有效方法是将它们放在列表的开头。对于您的设计,这将是:

element newHead;
newHead.next = &list;
您会注意到,
newHead
现在是第一个元素,
list
不再代表整个列表。这导致了一种更具功能性的编程风格,即您一直在创建新列表(请参见:Lisp中的
cons
函数)

C++等程序语言一般使用一些包装结构,如:

struct list
{
    element * first;
    void prepend(element * elt)
    {
        elt->next = first;
        first = elt;
    }
}
因此,列表前缀表示为更改现有列表,而不是创建新列表


有了这样一个辅助结构,跟踪列表大小并为快速追加保留指向最后一个元素的指针也很繁琐。这两种方法都需要为每个列表操作提供一些额外的指令。

您通常会存储指向第一个节点的指针:

element* first = &first_node; // this "ties" it off

first->val = 5; // set first node value to 5
first->next;    // pointer to next node
如果列表为空,则应将first设置为
NULL


此外,列表中的最后一个节点应将
next
设置为NULL。

您必须有第一个指针或头指针或任何您可以调用的指针。当您的链表为空时,其指针为空。但当您将第一个元素添加到链表时,也将该元素节点地址添加到hear/first指针。从第二个节点开始,通过更改head/first,然后将当前head添加到新head的next,将新节点地址附加到列表的末尾(下一个指针为NULL的节点)或星形

我不知道这样的理论是否有用。只需遵循示例或编写自己的代码即可。如果你遇到了错误,就把它贴在上面。我猜想所有的C或C++书籍都可以使用链表、队列、堆栈等。 或在SO中搜索链接列表


这可以作为一个开始:

这是家庭作业吗?第二,你应该先拿起一本书,学习C++的基础知识,特别是指针如何工作,以及指针使用的语法,然后再转到更复杂的数据结构。除非这是作业,不要翻滚你自己的链表。改用
std::list
first->next=*addMenew
ed
addMe
时,code>是非常危险的。一旦你走出你声明的
addMe
的范围,你就会得到一个指向潜在胡言乱语的指针。“除非这是家庭作业,否则不要滚动你自己的链表,而是使用std::list。”我总是发现创建你自己的数据结构是学习它们的最佳方式,这些指针让我感到困惑。我已经在java中做了链表。@邓肯- OP使用C++,所以不需要使用<代码> MalOC ,<代码>新< /代码>有什么不对吗?
element* first = &first_node; // this "ties" it off

first->val = 5; // set first node value to 5
first->next;    // pointer to next node