我在head = NULL行中遇到分段错误错误

时间:2019-05-15 09:23:57

标签: c++ linked-list singly-linked-list

我不明白为什么在head = NULL行中出现错误,我只是将头指向NULL

我也尝试过为head创建一个新节点,然后指向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;


}

}

我希望每当head = NULL行运行时,以前的链表都应该删除,并且我应该能够从头开始在链表中输入元素

1 个答案:

答案 0 :(得分:0)

首先:为此,C ++喜欢“ nullptr”(自C ++ 11起),而不是“ NULL”。
=>例如https://en.cppreference.com/w/cpp/types/NULLhttps://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更有趣,但是您将添加一个外部库

然后 :(在我的PC上)Segfault发生在if(temp-> next-> datanext-> next-> data)中,我猜您永远无法确定temp-> next-> next->数据存在...即使temp-> next-> data =>可能也不存在,如果temp-> next指向NULL(或nullptr),则它不是要取消引用的节点的有效实例 尝试: `

    #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;


}

}

`