Удаление узла только по его адресу, но он также удаляет другое значение и как предотвратить утечку памяти - PullRequest
1 голос
/ 10 июля 2020

Я сделал код удаления узла только по его адресу, и функция deleteNode удаляет узел в этой позиции, но удаляет больше значений, и я не могу удалить последний узел.

#include<bits/stdc++.h>
using namespace std;

struct Node {                                   //node defination
  int data;
  struct Node *next;
  Node(int x) {
    data = x;
    next = NULL;
  }
}*head;

Node *findNode(Node* head, int search_for)     //find the node that will delete
{
    Node* current = head;
    while (current != NULL)
    {
        if (current->data == search_for)
            break;
        current = current->next;
    }
    return current;
}


void insert()                                 //insert the values in node
{
    int n,i,value;
    Node *temp;
    scanf("%d",&n);

    for(i=0; i<n; i++)
    {
        scanf("%d",&value);
        if(i==0)
        {
            head=new Node(value);
            temp=head;
            continue;
        }
        else
        {
            temp->next= new Node(value);
            temp=temp->next;
            temp->next=NULL;
        }
    }
}

void printList(Node *node)                   //print the value in node
{
    while (node != NULL)
    {
        printf("%d ", node->data);
        node = node->next;
    }
    cout << endl;
}
void deleteNode(Node *node_ptr);

int main(void)                              //main starts from here
{

    int k,n,value;

    {
        insert();
        scanf("%d",&k);
        Node *del = findNode(head, k);
        if (del != NULL && del->next != NULL)
        {
            deleteNode(del);
        }
        printList(head);
    }
    return(0);
}
void deleteNode(Node *pos)                  //delete node function
{
   struct Node *temp;
   while(temp->next!=0)
   {
       temp=pos->next;
       pos->data=temp->data;
       pos->next=temp->next;
       pos=temp;
   }
 }

Ввод

5 (размер связанного списка)

1 2 3 4 5 (элементы списка)

2 (позиция для удаления)

Ожидаемый выход

1 3 4 5

Токовый выход

1 3 5

1 Ответ

0 голосов
/ 10 июля 2020

Создайте деструктор:

struct Node {                                   //node defination
  int data;
  struct Node *next;
  Node(int x) {
    data = x;
    next = NULL;
  }
  ~Node() {    // destructor
    if (next)
      delete next;
  }
}*head;

Таким образом, при удалении все узлы будут удалены.

Функция deleteNode не должна перемещаться по списку:

void deleteNode(Node *pos)                  //delete node function
{
   struct Node *temp;

   if(pos->next != 0)
   {
       temp = pos->next;
       pos->data = temp->data;
       pos->next = temp->next;
       temp->next = nullptr;  // <- set next to null to avoid next nodes deletion
       delete temp;  // and delete
   }
}

А в main просто удалите голову:

if (head)
    delete head;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...