我不明白为什么在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行运行时,以前的链表都应该删除,并且我应该能够从头开始在链表中输入元素
答案 0 :(得分:0)
首先:为此,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更有趣,但是您将添加一个外部库
然后 :(在我的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;
}
}
`