Chèn vào đầu danh sách liên kết không được

Bài code yêu cầu chèn 1 Node mới có giá trị y vào trước Node có giá trị x. Nếu trong danh sách không có giá trị nào bằng x thì chèn Node có giá trị y vào đầu danh sách.

Đây là bài em code. Khi chèn node vào vị trí bất kì không phải đầu thì hoàn toàn bình thường ko vấn đề gì. Nhưng khi chèn vào đầu danh sách thì lại không chèn được. Mọi người giúp e xem được không ạ?

struct Node
{
    int value;
    Node* next;
};

bool is_inNode (Node* head, int x)
{
    for (Node* p = head; p != NULL; p = p->next)
    {
        if (p->value == x)
        return true;
    }
    return false;
}
Node* insertBefore(Node* head, int x, int y){

     Node* newNode = new Node;
     newNode->value = y;
     newNode->next = NULL;

    Node* before = NULL;

    if (!is_inNode(head, x))
    {
        newNode->next = head;
        head = newNode;
        return head;
    }
   
       for (Node* p = head; p != NULL; p = p->next)
        {
            if (p == head)
            {
                if (p->value == x)
                {
                    newNode->next = head;
                    head = newNode;
                }
            }
            else
            {
                if (p->value == x)
                {
                    before->next = newNode;
                    newNode->next = p;
                }
            }
            before = p;
        }
    return head;

Tức là đoạn này chạy không đúng rồi:

Nhưng nó chạy đúng chứ.
Lý do là bạn gọi hàm bị sai. Bạn có gán giá trị trả về khi gọi hàm insertBefore() không? Như này:

Node* head;
// ...
head = insertBefore(head, 12, 0);
4 Likes
  • hàm is_inNode(head, x) mình đã kiểm tra rồi không có vấn đề gì.

  • trong hàm main mình có sử dụng là

       insertBefore(head, 2, 10);
       print(head);    // in ra đúng yêu cầu
       insertBefore(head, 6, 7);
       print(head);   // in ra danh sách cũ mà không có giá trị mới
    

còn đây là hàm print() của mình

    void print(Node* head)
  {
          for (Node * p = head; p != NULL; p = p->next)
          {
                  cout << p->value << " ";
          }
  }

Vậy là phải rồi :slight_smile: bạn trả về nhưng không gán lại.

4 Likes

ừ. Mình cũng vừa sửa xong. Cảm ơn mọi người ạ.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?