我已经看过一些关于链接列表的主题,而且我已经阅读了足够多的内容来收集如何做到这一点,但我想确保我没有错误地解释我收集的信息。
让我说我有:
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:谢谢!
我不知道这是否会被视为“家庭作业”。我个人认为不是这样,考虑到我不会使用我在这里发布的代码。
答案 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.