C++ 在链接列表前面添加节点

C++ 在链接列表前面添加节点,c++,data-structures,C++,Data Structures,我已经实现了如下链接列表: struct node { int data; node* next; }; void initNode(node* head, int data) { head->data = data; head->next = NULL; } void addNode(node* linkList, int data) { node* newnode = new node; newnode->data = d

我已经实现了如下链接列表:

struct node
{
    int data;
    node* next;
};

void initNode(node* head, int data)
{
    head->data = data;
    head->next = NULL;
}

void addNode(node* linkList, int data)
{
    node* newnode = new node;
    newnode->data = data;
    newnode->next = NULL;

    while (linkList)
    {
        if (linkList->next == NULL)
        {
            linkList->next = newnode;
            return;
        }
        linkList = linkList->next;
    }
}

void insertFrontNode(node* linkList, int data)
{
    node* newnode = new node;
    newnode->data = data;
    newnode->next = linkList;
    linkList = newnode;
}

void DisplayLinkList(struct node* linkList)
{
    int i = 1;
    while (linkList)
    {
        cout << "Linklist(" << i << ") " << linkList->data << endl;
        linkList = linkList->next;
        i++;
    }
}


int main()
{
    node* linkList  =new node;
    initNode(linkList, 5);
    addNode(linkList, 10);
    addNode(linkList, 30);
    insertFrontNode(linkList, 12);  
    DisplayLinkList(linkList);


    cin.get();
    return 0;
}
我的问题是,当我在initNode中初始化linklist或在addNode中添加node时,更改会反映在我通过参数传递的linkst指针中。但是,如果我在insertFrontNode中添加前面的节点,更改不会反映在链接列表指针中


为什么??区别是什么?

您可能会发现,在列表周围添加一个列表列表、单链链表结构将有助于执行“头添加”和“尾添加”操作

struct node
{
    int data;
    node* next;
};

struct slist
{
    node* head;
    node* tail;
};

void addHead(slist* linkList, int data)
{
    //new list node
    node* newnode = new node;
    newnode->data = data;
    newnode->next = NULL;

    newnode->next = linkList->head;
    linklist->head = newnode->next;
}

void addTail(slist* list, int data)
{
    //new list node
    node* newnode = new node;
    newnode->data = data;
    newnode->next = NULL;

    if( list->tail ) {
        list->tail->next = newnode;
    }
    list->tail = newnode;
}

void DisplayLinkList(struct slist* linkList)
{
    int i = 1;
    node* link = linklist->head;
    while (link)
    {
        cout << "Linklist(" << i << ") " << link->data << endl;
        link = link->next;
        i++;
    }
}

int main()
{
    slist* linkList=new slist;
    addTail(linkList, 5);
    addTail(linkList, 10);
    addTail(linkList, 30);
    addHead(linkList, 12);  
    DisplayLinkList(linkList);
    return 0;
}

您做得很好。您正在修改链接列表的标题,但没有将其更新到外部世界。因此,当您调用DisplayLinkList时,会使用旧的标题指针调用它,这就是更改没有反映的原因。检查以下代码:

void insertFrontNode(node** linkList, int data)
{
    node* newnode = new node;
    newnode->data = data;
    newnode->next = *linkList;
    *linkList = newnode;
}

int main()
{
    node* linkList = new node;
    initNode(linkList, 5);
    addNode(linkList, 10);
    addNode(linkList, 30);
    insertFrontNode(&linkList, 12);
    DisplayLinkList(linkList);


    cin.get();
    return 0;
}

在上面的代码中,不仅在前面添加节点,还更新头指针,以便显示函数获得新的更新头指针。

不同之处在于,在insertFrontNode中执行的更改本质上不会反映在列表的原始头节点中。整个问题是,列表将有一个新的头节点,但是您不提供新的头节点指针返回给调用方的方法。您应该添加C++ TAG。C++不一定。但是在C中,所有引用节点都应该是结构节点,以避免引发错误未知类型名称NOD.所发布的代码包含关键字CIN和新的和CUT和EnDL,这些代码只在C++中被识别,所以请删除“C”标签并添加“C++ TAGIN C”,参数通过值传递,因此,更改参数对调用方的变量没有影响。需要传递参数的地址,并且由于参数已经是指针,因此在函数参数列表中的被调用函数use**中。在C++中,通过引用传递参数,而不是通过“谢谢”的地址来传递参数。但是,我也不会在addNode函数中返回linklist。但在主要情况下,当我调用addNode时,我会在链接列表中添加新节点。那么为什么它没有进入insertFrontNode呢因为您没有在addNode中修改链接列表的标题,所以它起了作用。。