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=*addMe当您没有new
edaddMe
时,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