C++ 分段故障排除未排序链表中的重复元素 #包括 #包括 使用名称空间std; 结构节点{ int数据; 结构节点*下一步; }; 结构节点*头部; 无效遍历链接列表(结构节点*ptr){ 如果(ptr==NULL){coutdata==qtr->data){ //表示重复节点 上一步->下一步=qtr->下一步; 自由(qtr); qtr=prev->next; } 否则{ prev=qtr; qtr=qtr->next; } } } cout
此条件C++ 分段故障排除未排序链表中的重复元素 #包括 #包括 使用名称空间std; 结构节点{ int数据; 结构节点*下一步; }; 结构节点*头部; 无效遍历链接列表(结构节点*ptr){ 如果(ptr==NULL){coutdata==qtr->data){ //表示重复节点 上一步->下一步=qtr->下一步; 自由(qtr); qtr=prev->next; } 否则{ prev=qtr; qtr=qtr->next; } } } cout,c++,pointers,linked-list,segmentation-fault,C++,Pointers,Linked List,Segmentation Fault,此条件ptr->next=for循环中的NULL有问题 #include<iostream> #include<stdlib.h> using namespace std; struct node{ int data; struct node* next; }; struct node* head; void traversalLinkedList(struct node* ptr){ if(ptr==NULL) {cout<&l
ptr->next=for循环中的NULL
有问题
#include<iostream>
#include<stdlib.h>
using namespace std;
struct node{
int data;
struct node* next;
};
struct node* head;
void traversalLinkedList(struct node* ptr){
if(ptr==NULL) {cout<<"null hain bhai"<<endl; return;}
while(ptr!=NULL){
cout<<ptr->data<<" ";
ptr=ptr->next;
}
}
void push(int d){
//at the front of linked list
struct node* temp=(struct node*) malloc(sizeof(struct node));
temp->data=d;
temp->next=head;
head=temp;
}
int main(){
head=NULL;
//removing duplicates from linked list
push(10);
push(11);
push(12);
push(11);
push(11);
push(12);
push(10);
traversalLinkedList(head);
struct node *ptr;
struct node* prev;
struct node* qtr;
for(ptr=head;ptr->next!=NULL;ptr=ptr->next){
prev=ptr;
for(qtr=ptr->next;qtr!=NULL;){
if(ptr->data==qtr->data){
//means duplicate nodes
prev->next=qtr->next;
free(qtr);
qtr=prev->next;
}
else{
prev=qtr;
qtr=qtr->next;
}
}
}
cout<<endl;
traversalLinkedList(head);
cout<<endl;
return 0;
}
它将取消对最后一个节点的NULL
指针的引用。应该是:
for(ptr=head;ptr->next!=NULL;ptr=ptr->next)
此条件
ptr->next=for循环中的NULL
有问题
#include<iostream>
#include<stdlib.h>
using namespace std;
struct node{
int data;
struct node* next;
};
struct node* head;
void traversalLinkedList(struct node* ptr){
if(ptr==NULL) {cout<<"null hain bhai"<<endl; return;}
while(ptr!=NULL){
cout<<ptr->data<<" ";
ptr=ptr->next;
}
}
void push(int d){
//at the front of linked list
struct node* temp=(struct node*) malloc(sizeof(struct node));
temp->data=d;
temp->next=head;
head=temp;
}
int main(){
head=NULL;
//removing duplicates from linked list
push(10);
push(11);
push(12);
push(11);
push(11);
push(12);
push(10);
traversalLinkedList(head);
struct node *ptr;
struct node* prev;
struct node* qtr;
for(ptr=head;ptr->next!=NULL;ptr=ptr->next){
prev=ptr;
for(qtr=ptr->next;qtr!=NULL;){
if(ptr->data==qtr->data){
//means duplicate nodes
prev->next=qtr->next;
free(qtr);
qtr=prev->next;
}
else{
prev=qtr;
qtr=qtr->next;
}
}
}
cout<<endl;
traversalLinkedList(head);
cout<<endl;
return 0;
}
它将取消对最后一个节点的NULL
指针的引用。应该是:
for(ptr=head;ptr->next!=NULL;ptr=ptr->next)
for(ptr=head;ptr->next!=NULL;ptr=ptr->next){
应该是
for(ptr=head;ptr!=NULL;ptr=ptr->next){
它失败了,因为最后只剩下两个12,ptr指向其中一个。下一个不是空的,所以你进入迭代。在那个迭代中你删除了第二个12,所以ptr的下一个现在是空的。然后迭代结束,你将ptr设置为ptr->next,所以ptr本身变为空,然后你检查ptr->next是否为空,并在那里崩溃
编辑:如果要跳过最后一个元素,请执行以下操作
for(ptr=head;ptr&&ptr->next!=NULL;ptr=ptr->next){
for(ptr=head;ptr->next!=NULL;ptr=ptr->next){
应该是
for(ptr=head;ptr!=NULL;ptr=ptr->next){
它失败了,因为最后只剩下两个12,ptr指向其中一个。下一个不是空的,所以你进入迭代。在那个迭代中你删除了第二个12,所以ptr的下一个现在是空的。然后迭代结束,你将ptr设置为ptr->next,所以ptr本身变为空,然后你检查ptr->next是否为空,并在那里崩溃
编辑:如果要跳过最后一个元素,请执行以下操作
for(ptr=head;ptr&&ptr->next!=NULL;ptr=ptr->next){
在这一行中,当您说ptr->next!=NULL时,最后一个节点的空指针将被取消引用。这会导致分段错误,因为您试图访问空指针
因此,只需将第二个条件设置为ptr!=NULL
。这就足够了,因为您在for
循环的第三个条件中执行了ptr=ptr->next
在这一行中,当您说ptr->next!=NULL时,最后一个节点的空指针将被取消引用。这会导致分段错误,因为您试图访问空指针
因此,只需将第二个条件设置为
ptr!=NULL
。这就足够了,因为在for
循环的第三个条件中,您正在执行ptr=ptr->next
。我使用该逻辑使ptr->next!=NULL,因为我不希望最后一个节点被访问,就好像它是一个重复的节点一样,它已经被删除了。您能这样做吗请解释如何为最后一个节点取消对空指针的引用for循环中的increment语句是:“ptr=ptr->next”。因此,如果您在最后一个节点,在下一次迭代中,ptr将为空。条件检查将为“ptr->next!=null”。此时ptr为空。@GuillaumeGeorge不需要额外的条件,它是空的CHEVIES在正确的<代码> PTR!= null < /代码>中。如果PTR不是空的,但是PTR-下一个是,NOLOP。您立即取消引用NULL,这会直观地告诉您它是错误的。我使用该逻辑使ptr->next!=NULL,因为我不希望访问最后一个节点,就好像它是重复的一样,因为它已经被删除了。您能解释一下如何为最后一个节点取消引用NULL指针f中的increment语句吗或者循环是:“ptr=ptr->next”。因此,如果您在最后一个节点,在下一次迭代中,ptr将为NULL。条件检查将为“ptr->next!=NULL”。此时,ptr为NULL。@GuillaumeGeorge不需要额外的条件,它在正确的ptr!=NULL
上没有任何结果。如果ptr不是NULL,但ptr->next是,则内部循环是NOOP。@ BLACKSLACE“您能解释一下空指针是如何为最后一个节点注销的吗?”->代码> PREV-> Next=QTR>下一个;< /C> >可以设置<代码> PREV> >下< /COD>为空。您立即取消引用NULL,这会直观地告诉您它是错误的。我使用该逻辑让ptr->next!=NULL,因为我不希望访问最后一个节点,就像它是重复的一样,它已经被删除了。您能解释一下如何取消引用最后一个节点的NULL指针,以及我是如何访问的吗使用ptr->next的空指针=NULL@blankspace它已经被解释过好几次了。试着(用铅笔和纸)用一个简单的列表(比如,只有两个数据相等的项目)来跟踪代码,看看它是怎么做的。你会发现它不仅崩溃了,而且你的“逻辑”也崩溃了没有意义。我使用这种逻辑让ptr->next!=NULL,因为我不希望最后一个节点被访问,就好像它是一个重复的节点,它已经被删除了一样。你能解释一下如何为最后一个节点取消对NULL指针的引用,以及我如何使用ptr->next访问NULL指针吗=NULL@blankspace它已经被释放了重复几次。试着(用铅笔和纸)用一个简单的列表(比如,只有两个数据相等的项目)来跟踪代码,看看它是怎么做的。你会发现它不仅崩溃了,而且你的“逻辑”毫无意义。ptr&&ptr->next!=NULL
不一致;为什么不ptr&&ptr->next
(或者ptr!=NULL&&ptr->next!=NULL
)?这是毫无意义的,因为如果ptr->next
为NULL,则内部循环什么也不做,所以