Я получаю ошибку ошибки сегментации в заголовке строки = NULL - PullRequest
0 голосов
/ 15 мая 2019

Я не понял, почему я получаю ошибку в заголовке строки = NULL Я просто указываю головой в направлении NULL

Я также попытался создать новый узел для головы и затем указать в направлении NULL, но все равно это нене работает

Здесь показан код

#include <bits/stdc++.h>

using namespace std;
struct node
{
  int data;
  node *next;
};

 node *head=NULL;
 node *tail=NULL;


 void createnode(int value)
  {
  node *temp=new node;
  temp->data=value;
  temp->next=NULL;
  if(head==NULL)
  {
    head=temp;
    tail=temp;
    temp=NULL;
  }
  else
  { 
    tail->next=temp;
    tail=temp;
  }
}
void deletek(int n,int k)
{
    if(head==NULL)
    return;
    node *temp;
    temp=head;
    while(temp->data<temp->next->data)
    {
        head=temp->next;
        temp=temp->next;
        k--;
    }
    while(temp!=NULL&&k!=0)
    {
        if(temp->next->data<temp->next->next->data)
        {
            temp->next=temp->next->next;
            k--;
        }
        temp=temp->next;
    }
}
void display()
{
    node *temp=head;
    while(temp!=NULL)
    {
        cout<<temp->data<<" ";
        temp=temp->next;
    }
    cout<<endl;

}

int main() {
int t;
cin>>t;
int n,k;

for(int i=0;i<t;i++)
{
    cin>>n>>k;
    int arr[n];

    for(int j=0;j<n;j++)
    {
        cin>>arr[j];
        createnode(arr[j]);
    }
    deletek(n,k);

    display();
    head=NULL;


}

}

Я ожидаю, что всякий раз, когда запускается строка = NULL, предыдущий связанный список должен удаляться, и я должен иметь возможностьвводить элементы в связанный список с начала

1 Ответ

0 голосов
/ 15 мая 2019

Прежде всего: C ++ для этого нравится «nullptr» (начиная с C ++ 11) вместо «NULL».=> например https://en.cppreference.com/w/cpp/types/NULL против https://en.cppreference.com/w/cpp/language/nullptrВторое: точный вывод компилятора может помочь.В-третьих: список не будет удален, если вы выбросите адрес его местонахождения.может быть, вам лучше создать класс и / или добавить деструктор для вашего узла.Если вы хотите реализовать LL самостоятельноИли посмотрите на std :: list -> https://en.cppreference.com/w/cpp/container/list. Я использую это довольно часто.Или, если вы хотите добавить буст-зависимость: https://www.boost.org/doc/libs/1_35_0/doc/html/intrusive/list.html более необычно, но вы добавите внешнюю библиотеку Тогда : Segfault (на моем ПК) происходит, если (temp-> next-> datanext-> next-> data) я думаю, вы никогда не узнаете, если temp-> next-> next-> dataсуществует ... возможно, даже если temp-> next-> data =>, если temp-> next указывает на NULL (или nullptr), это не допустимый экземпляр узла для разыменования try: `

    #include <bits/stdc++.h>
    #define HERE() printf("HERE: %d\n", __LINE__)
    using namespace std;
    struct node
    {
      int data;
      node *next;
    };

     node *head=NULL;
     node *tail=NULL;


     void createnode(int value)
      {
      node *temp=new node;
      temp->data=value;
  temp->next=NULL;
  if(head==NULL)
  {
    head=temp;
    tail=temp;
    temp=NULL;
  }
  else
  {
    tail->next=temp;
    tail=temp;
  }
}
void deletek(int n,int k)
{
    if(head==NULL)
    return;
    node *temp;
    temp=head;

    while(temp->data<temp->next->data)
    {
        head=temp->next;
        temp=temp->next;
        k--;
    }
HERE();
    while(temp!=NULL&&k!=0)
    {
HERE();
int d1 = temp->next->data;
HERE();
int d2 = temp->next->next->data;
        if(temp->next->data < temp->next->next->data)
        {
            temp->next=temp->next->next;
            k--;
        }
        temp=temp->next;
    }
}
void display()
{
    node *temp=head;
    while(temp!=NULL)
    {
        cout<<temp->data<<" ";
        temp=temp->next;
    }
    cout<<endl;

}

int main() {
int t;
cout << "input t:" << endl;
cin>>t;
int n,k;

for(int i=0;i<t;i++)
{
        cout << "input n/k" << endl;
    cin>>n>>k;
    int arr[n];

    for(int j=0;j<n;j++)
    {
        cout << "input arr[" << j <<"]" << endl;
        cin>>arr[j];
        createnode(arr[j]);
    }
    deletek(n,k);

    display();
    head=NULL;


}

}

`

...