链接列表数据编辑删除整个列表

Linked list data edit deletes entire list

我的 class 正在寻求一个能够插入项目(此任务正在运行)并向他们提供评估的程序。问题是当我尝试给出评价时,程序只是删除了整个列表,我不知道为什么。这是评估函数:

No * evaluate(No * head){
    int projectID;

    cout<<"What is the ID?\n";
    cin >> projectID;

    while (head != NULL)
    {
        if (head->ID == projectID){
            int evaluation;
            cout<<"Please insert the evaluation \n";
            cin >> evaluation;
            head->evaluation = evaluation;
        }
        head = head->next;
    }

    return head;
}

这是我的结构:

typedef struct dados {
    int ID;
    int evaluation;
    struct dados *next; //pointer to next node
}No;

要调用我使用的函数:

int main(){
    No * ll = NULL;

    while (true){
        int ID;
        cout << "Please insert the ID \n";
        cin >> ID;

        ll = insertFront(id);
        ll = evaluate(head);
    }
}

你的问题:

问题是您在评估函数中执行 while 循环,直到 head 达到 NULL:

while (head != NULL)

然后,您 return 在退出 while 循环后从您的评估函数(因此 head 现在为 NULL)并且您 return head:

   return head;   // <== will always return NULL 

最后你在 main 的列表指针中设置了它:

    ll = evaluate(head);  // ll will be null

解决方法:

我不完全清楚 evaluate() 应该 return 指向列表的指针,还是指向找到的节点的指针。

如果是找到的节点,最简单的方法是在更新节点后立即从函数中 return:

   ... 
   if (head->ID == projectID){
      ... (as before) 
      return head;   <<=== add this line 
   }

如果它在列表的开头,那么你只需要将 head 保存在一个临时变量中,在你的函数的开头,并且 return 这个临时变量而不是 head

No * evaluate(No * head)
{
    No *tmp = head;   // no new !  It's a pointer, just take the value of the head
    ...  // as before
    while (tmp != NULL)
    {
        if (tmp->ID == projectID){
             int evaluation;
             cout<<"Please insert the evaluation\n";
             cin >> evaluation;
             tmp->evaluation = evaluation;
             return head;  // We return the full list (head) 
        }
        tmp = tmp->next;
    }
    cout <<"Project not found\n";
    return head;
}