如何使用结构创建链表?

时间:2011-10-10 21:32:52

标签: c++ struct linked-list

我已经看过一些关于链接列表的主题,而且我已经阅读了足够多的内容来收集如何做到这一点,但我想确保我没有错误地解释我收集的信息。

让我说我有:

struct element 
{
    int       val;
    element   *next;
};

元素* next是指向元素的指针,该元素将用于将元素连接在一起以形成链接列表。

我也认为你需要有某种“束缚”,这样你就不会丢失你的清单。我的教授把它描述为气球的痕迹,如果你没有“束缚”,你的清单可能会丢失。

所以我开始创建“tie off”指针:

element first;
first -> *next = 0; // or null

这是我迷路的地方......我如何添加到链表的头部?在这一点上订购它并不重要,我只需要从无序列表开始,稍后我会变得更复杂。

这样的东西?

element addMe;
addMe -> val = 100;

first -> next = *addMe;

是吗?

如何在非空列表中添加内容?

感谢您的时间!

编辑:这不是作业。我们已经查看了链接列表,并与它们进行了分配。我没有在作业上得到很好的成绩,所以我想在下一个作业之前加强我的理解。我们再次使用链接列表。

Edit2:谢谢!

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

4 个答案:

答案 0 :(得分:4)

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

element newHead;
newHead.next = &list;

您会注意到newHead现在是第一个元素,list不再代表整个列表。这导致了一种更具功能性的编程风格,您可以随时创建新的列表(请参阅:Lisp中的cons函数)。

像C ++这样的过程语言通常使用一些这样的包装器结构:

struct list
{
    element * first;
    void prepend(element * elt)
    {
        elt->next = first;
        first = elt;
    }
}

因此列表前缀表示为更改现有列表而不是创建新列表。

使用这样的辅助结构,跟踪列表大小也很简单,并保持指向最后一个元素的指针以便快速追加。这些都是以每个列表操作的一些额外指令为代价的。

答案 1 :(得分:0)

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

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

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

如果您的列表为空,则应首先将其设置为NULL

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

答案 2 :(得分:0)

你必须拥有第一个指针或头指针或任何你可能称之为的指针。当链表为空时,它的指针为NULL。但是当您将第一个元素添加到链接列表时,也会将元素节点地址添加到listen / first指针。并且从第二个节点开始,将新节点地址附加到列表的末尾(下一个指针为NULL的节点)或者通过改变head / first然后将当前头添加到新的头部接下来的星号。

我不知道这种理论是否有所帮助。只需按照示例或编写自己的代码即可。如果你在SO上遇到错误发布。我猜所有c或c ++书籍都提供链表,队列,堆栈等。

或在SO中搜索链接列表。

这可能是一个开始:Simple C++ Linked List

答案 3 :(得分:-1)

如果要添加到列表的头部

struct element *el = (element *) malloc(sizeof(struct element));
el->val = 100;
el->next = first;

现在el是第一个元素,第一个是第二个元素。

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

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

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.