将节点插入到链接列表只会转到开头或结尾

时间:2017-11-06 05:26:33

标签: c++ list insert

我对这段代码感到困惑。我希望在带有“James”的节点之后将名为“Joshua”的节点插入到我的链接列表中。但是,我错了,它只是根据“insert(”Joshua“,2)中的整数值将它添加到列表的开头或结尾;”

#include <string>
#include <iostream>
using namespace std;

struct Node
{
    string name;
    Node *link;
};
typedef Node* NodePtr;

NodePtr listPtr, tempPtr;

void insert(string name, int n)
{

    NodePtr temp1 = new Node();
    temp1->name = name;
    temp1->link = NULL;
    if(n == 1){
        temp1->link = listPtr;
        listPtr = temp1;
        return;
    }
    NodePtr temp2 = listPtr;
    for(int i = 0; i < n; i++){
        temp2 = temp2->link;
    }
    temp1->link = temp2->link;
    temp2->link = temp1;
}

void print()
{
    NodePtr temp = listPtr;
    while(temp != NULL)
    {
        cout << temp->name << endl;
        temp = temp->link;
    }
}

/*
 *
 */

int main(int argc, char** argv){
    listPtr = new Node;
    listPtr->name = "Emily";

    tempPtr = new Node;
    tempPtr->name = "James";
    listPtr->link = tempPtr;

    tempPtr->link = new Node;
    tempPtr = tempPtr->link;
    tempPtr->name = "Joules";
    tempPtr->link = NULL;

    print();
    insert("Joshua", 2);
    cout << endl;
    print();

    return 0;
}

1 个答案:

答案 0 :(得分:0)

for(int i = 0; i < n; i++){
    temp2 = temp2->link;
}

如果n=2并且您在链接列表中有3个元素,则在上面的循环结束时,您将位于最后一个节点。然后,下面将添加新节点

temp1->link = temp2->link;
temp2->link = temp1;

您希望循环1的时间更少。