#c
Вопрос:
#include<iostream>
using namespace std;
struct Node{
int data=0;
Node* next=NULL;
};
void removeDuplicates(Node* head){
Node *ptr,*ptr2,*temp;
ptr=head;
while(ptr->next!=NULL amp;amp; ptr!=NULL){
ptr2=ptr;
while(ptr2->next!=NULL){
if(ptr2->next->data==ptr->data){
temp=ptr2->next;
ptr2->next=temp->next;
temp->next=NULL;
delete(temp);
}
else ptr2=ptr2->next;
}
ptr=ptr->next;
}
}
void display(Node *head){
Node* ptr=head;
while(ptr!=NULL){
cout<<ptr->data<<" ";
ptr=ptr->next;
}
cout<<endl;
}
int main(){
int n;
cin>>n;
Node* head=NULL;
Node *tail=NULL;
for(int i=0;i<n;i ){
Node *newNode=new Node();
cin>>newNode->data;
if(head==NULL){
head=newNode;
tail=newNode;
}
else{
tail->next=newNode;
tail=newNode;
}
}
display(head);
removeDuplicates(head);
display(head);
}
Приведенный выше код предназначен для удаления повторяющихся элементов в связанном списке .
Приведенный выше код не показывает никакого результата, если последний элемент списка является повторяющимся элементом .например (2 1 1 2 1) ,(1 1 1 1)
Код отлично работает для (1 2 1 3) (1 2 1 2 3)
Любая помощь будет оценена по достоинству.
Комментарии:
1. Для таких вещей, как списки, я предлагаю вам взять простой список, который у вас есть, и нарисовать его на бумаге карандашом. Используйте поля для узлов и стрелки для указателей (включая ссылки). Затем попробуйте выполнить операции, стирая и перерисовывая стрелки. Подробно описывайте все шаги, которые вы делаете. Как только вы решите, что он работает на бумаге, вы переведете этот алгоритм в код, который напишете и протестируете. Если это не сработает, используйте отладчик для пошагового выполнения кода и убедитесь, что он следует шагу, который вы записали на бумаге (и нарисуйте операции, которые выполняет ваша программа).
Ответ №1:
ошибка здесь была в 1-м цикле while в функции removeDuplicate(head)
while(ptr->next!=NULL amp;amp; ptr!=NULL)
Необходимо поставить ptr!=NULL
условие перед ptr->next!=NULL
ошибкой сегментации в противном случае
Пожалуйста, учитесь на моем опыте 🙂