我想在列表的末尾添加一个节点,这段代码可以处理这个,但是当我添加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";
}
}
答案 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
注意 -
back
和next
指针分配给NULL或任何合适的值,这可能会导致以后出现未定义的行为。该部分包含在上面的代码中。