在列表末尾添加节点

时间:2017-06-18 13:34:55

标签: c++ pointers linked-list nodes

我想在列表的末尾添加一个节点,这段代码可以处理这个,但是当我添加3个 rd 节点时,它会删除第一个节点。第二个节点成为第一个,第三个节点成为第二个节点。有什么问题?

struct Clothes
    {
        int item_id;
        string name_of_clothing;
        Clothes * next;
        Clothes * back;
    }*new_item, *temp, *last, *list;


int add_clothing() {
    string name_of_clothing, item_id;
    cout << "Enter ID\t: ";
    cin >> item_id;
    cout << "Enter Name of item\t: ";
    cin >> name_of_clothing;
    string new_item[2] = { item_id, name_of_clothing};
    add_New_item(new_item[0], new_item[1]);
    system("PAUSE");
    palce_and_order_menu();
    return 0;
}
void  add_New_item(string item_id, string name_of_clothing)
{
    new_item = new Clothes();
    new_item->item_id = std::stoi(item_id);
    new_item->name_of_clothing = name_of_clothing;
    if (temp == NULL)
    {
        temp = last = new_item;
        cout << "\n>Element inserted in empty list\n";
    }


    else
          {
             while (temp->next != NULL){
                    temp = temp->next;          
             }
             last->next = new_item;
             new_item->back = last;
             last = new_item;
             cout << "\n>Element inserted \n";
        }
}

2 个答案:

答案 0 :(得分:2)

我认为插入新节点的一般逻辑应如下所示:

while (temp->next != NULL) {
    temp = temp->next;          
}
temp->next = new_item;
new_item->back = temp;
// last = new_item
cout << "\n>Element inserted \n";

我不清楚last代表什么。假设你只有一个HEAD指针,那么使用while循环向下走到列表是有意义的,直到到达最后一个节点,然后在那里添加新项目。大多数情况下,这不会改变列表的HEAD指针。

答案 1 :(得分:2)

根据您对我的评论的回复以及有关您的列表实施的有限信息。我建议如下 -
因为,您要跟踪列表的头部(通过temp)和尾部(通过last)并在最后完成插入,所以插入新节点的功能应该类似于 -

void  add_New_item(string item_id, string name_of_clothing)
{
    new_item = new Clothes();
    new_item->item_id = std::stoi(item_id);
    new_item->name_of_clothing = name_of_clothing;
    new_item->back=NULL;
    new_item->next=NULL;
    if (temp == NULL)
    {
        temp = last = new_item;
        cout << "\n>Element inserted in empty list\n";
    }


    else
          {

             last->next = new_item;
             new_item->back = last;
             last = new_item;
             cout << "\n>Element inserted \n";
        }
}

您需要仅更改last指针,因为插入在最后完成。仅当列表最初为空并且然后插入元素时才更改temp 注意 -

  • 给表示头部和尾部的变量赋予适当的名称 列出不正确的名字会导致混淆。
  • 插入新节点时,您没有将其backnext指针分配给NULL或任何合适的值,这可能会导致以后出现未定义的行为。该部分包含在上面的代码中。