我编写了可以创建链表,将元素插入到开头或结尾并显示它的代码。

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/

10-12 20:44