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,则内部循环什么也不做,所以