2017-06-18 136 views
-1

我想在列表末尾添加一个节点,并且此代码可以处理此问题,但是当我添加节点时,它将删除第一个节点。第二个节点成为第一个,第二个节点成为第三个节点。问题是什么 ?在列表末尾添加节点

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

什么是最后一个指针应该代表什么?名单的头,还是尾巴?你的整体逻辑似乎是正确的,但如果你能澄清'临时'和'最后'应该做的事情会有所帮助。 –

+1

如果'temp'指向列表的头部,然后在'while'循环中修改它并且不恢复其以前的值,这就是您丢失了列表头部的原因。 –

+0

@GAURANGVYAS是它的头。我怎样才能恢复以前的价值? – Sava

回答

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仅在列表最初为空时插入元素才会更改。
注意 -

  • 给予适当的名称,以表示该 列表为不适当名称造成混乱的头部和尾部的变量。
  • 在插入新节点时,您没有将其指针指向NULL或任何合适的值(可能在稍后导致未定义的行为)的指针backnext。该部分包含在上面的代码中。
+0

谢谢,现在它工作正常。 – Sava

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指针。

+0

我们可以迭代这个答案,如果它可以帮助你。 –

+0

也谢谢你,这个例子也在工作 – Sava