在linklist前添加节点

时间:2015-11-21 00:22:10

标签: 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 = 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中添加节点时,更改会反映在我通过参数传递的linkst指针中。但如果我在insertFrontNode中添加节点infront,则更改不会反映在linklist指针中。

为什么呢?有什么区别?

2 个答案:

答案 0 :(得分:1)

您可能会发现在列表周围添加列表(slist,单链表)结构会有所帮助(并使两者都添加到头部并添加尾部O(1)操作)。

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;
}

答案 1 :(得分:1)

你做得很好。你正在修改链表的头部,但是没有将它更新到你的外部世界。因此,当你调用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;
}

上面的代码,不仅添加前面的节点,还更新头指针,使显示功能获得新的更新头指针。