我编写了可以创建链表,将元素插入到开头或结尾并显示它的代码。
struct ListElem
{
int info;
ListElem * next;
};
// shortcut for list = pointer to a list element
typedef ListElem * List;
// empty list is a Null Pointer
const List emptyList = 0;
void printList(List lst) {
for (; lst!= 0; lst = lst->next) {
cout << lst->info << endl;
}
}
void insertElem(List& lst, int info) {
ListElem *ptrElem = new ListElem;
ptrElem->info = info;
ptrElem->next = lst;
lst = ptrElem;
}
void insertLast(List& lst, int info) {
ListElem *ptrElem = new ListElem;
ptrElem->info = info;
ptrElem->next = NULL;
if (lst == emptyList) {
insertElem(lst, info);
return;
}
else {
while (lst ->next) {
lst = lst->next;
}
lst->next = ptrElem;
}
}
我在main上尝试了insertLast函数:
int main()
{
// fill List with values 1 to 10
List list1 = emptyList;
for (int value = 1; value <= 10; value++)
{
//insertElem( list1, value );
insertLast(list1, value);
}
//print list
printList(list1); // should provide sequence 1 2 3 ... 10
但是出于某种原因,printList仅显示9和10,而不是1,2,3,..,10。仅在insertLast中会发生此问题。 insertElem似乎工作正常。
最佳答案
问题是在insertLast()
中,您通过引用传递了list参数。也就是说,对列表所做的每个更改都将在函数外部可见。在这些行-while (lst ->next) {lst = lst->next;}
上,您更改列表引用,因此列表的第一个节点随每次添加而被修改。
解决方案是采用一个辅助迭代器节点,以迭代您的列表,或按值传递您的List,像现在一样更改列表,然后返回修改后的副本。
下面是insertLast()
方法,将其重写以使用辅助节点迭代列表:
void insertLast(List& lst, int info) {
ListElem *ptrElem = new ListElem;
ListElem *aux = lst;
ptrElem->info = info;
ptrElem->next = NULL;
if (lst == emptyList) {
insertElem(lst, info);
return;
}
else {
while (aux ->next) {
aux = aux->next;
}
aux->next = ptrElem;
}
}
关于c++ - 最后插入C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51908909/