我想在列表的末尾添加一个节点,这段代码可以处理这个问题,但是当我添加第 3 个节点时,它会删除第一个节点。第二个节点成为第一个节点,第三个节点成为第二个节点。问题出在哪里?
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 IDt: ";
cin >> item_id;
cout << "Enter Name of itemt: ";
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 listn";
}
else
{
while (temp->next != NULL){
temp = temp->next;
}
last->next = new_item;
new_item->back = last;
last = new_item;
cout << "n>Element inserted n";
}
}
基于您对我的评论的回复以及有关您的列表实现的有限信息。我会提出以下建议——
由于您同时跟踪列表的头部(通过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 listn";
}
else
{
last->next = new_item;
new_item->back = last;
last = new_item;
cout << "n>Element inserted n";
}
}
您只需更改last
指针,因为插入是在最后完成的。 仅当列表最初为空,然后插入元素时,才会更改temp
。
注意 -
- 为表示列为不正确的名称会引起混淆。
- 插入新节点时,您没有为其
back
分配,next
指针指向 NULL 或任何合适的值,这可能会导致以后出现未定义的行为。该部分包含在上面的代码中。
我认为您插入新节点的一般逻辑应如下所示:
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 指针。