Member 13455005 Ответов: 1

Как удалить элемент из связанного списка


Я попытался создать функцию удаления, но когда я запускаю программу и удаляю элемент, то после отображения он показывает мне мусорное значение, я не знаю, что я делаю не так

Что я уже пробовал:

#include<iostream>
using namespace std;
class node{
	int x;
	node *next;
	public:
		void set(int x)
		{
			this->x=x;
		}
		int get()
		{
			return x;
		}
		void setnext(node *next)
		{
			this->next=next;
		}
		node *getnext()
		{
			return next;
		}
};
class list{
	int size,elenum;
	node *head,*current;
	public:
		list()
		{
			head=new node();
			head->setnext(NULL);
			size=0;
			elenum=0;
			current=new node();
			current=NULL;
		}
		void create()
		{
			int v;
			cout<<"Enter value :";
			cin>>v;
			node *newnode=new node();
			newnode->set(v);
			if(current!=NULL)
			{
				newnode->setnext(NULL);
				current->setnext(newnode);
				current=newnode;
			}
			else
			{
				newnode->setnext(NULL);
				head->setnext(newnode);
				current=newnode;
			}
			size++;
		}
		void insert(int pos)
		{
			int val;
			cout<<"Enter value :";
			cin>>val;
			current=head->getnext();
			node *newnode=new node();
			newnode->set(val);
			for(int i=1;i<=pos;i++)
			{
				if(i=pos)
				{
					newnode->setnext(current->getnext());
					current->setnext(newnode);
					current=newnode;
				}
				current=current->getnext();
			}
			elenum++;
		}
		void remove(int pos)
		{
			node *temp=new node();
			current=head->getnext();
			for(int i=1;i<=pos;i++)
			{
				if(i=pos)
				{
					temp=current; 
					current->setnext(current->getnext());
					delete temp;
				}
				current=current->getnext();
			}
			elenum--;
		}
		int find(int x,int si)
		{
			current=head->getnext();
			for(int i=1;i<=size;i++)
			{
			    if(x=current->get())
			    {
			    	return i;
			    }
			}
			return 0;
		}
		int length()
		{
			return size;
		}
		int actlength()
		{
			int sum=size+elenum;
			return sum;
		}
		void display()
		{
			if(current!=NULL)
			{
			cout<<current->get();
		    }
		}
		void start()
		{
			current=head->getnext();
		}
		void next()
		{
			current=current->getnext();
		}
};
int main()
{
	list l1;
	int n1,n2,num;
	int ans,pos;
	cout<<"How many elements do you want to enter :";
	cin>>num;
	for(int i=1;i<=num;i++)
	{
		l1.create();
	}
	do
	{
		cout<<"\n1.Insert\n2.Remove\n3.Size of list\n4.Size after update\n5.Find\n6.Display\n7.End"<<endl;
		cout<<"Enter your choice :";
		cin>>ans;
		if(ans==1)
		{
			cout<<"Enter position where you want to enter :";
			cin>>pos;
			l1.insert(pos);
		}
		else if(ans==2)
		{
			cout<<"Enter position from which you want to remove your element :";
			cin>>pos;
			l1.remove(pos);
		}
		else if(ans==3)
		{
			cout<<"Size is "<<l1.length();
		}
		else if(ans==4)
		{
			cout<<"Size after some modification done by you "<<l1.actlength();
		}
		else if(ans==5)
		{
			n2=l1.actlength();
			cout<<"Enter the value you want to enter :";
			cin>>num;
			int n1=l1.find(num,n2);
			if(n1!=0)
			{
				cout<<"Your element was found at "<<n1<<endl;
			}
			else
			{
				cout<<"Your element is not in the list !"<<endl;
			}
		}
		else if(ans==6)
		{
			n2=l1.actlength();
			l1.start();
			for(int i=1;i<=n2;i++)
			{
				l1.display();
				cout<<endl;
				l1.next();
			}
		}
		else
		{
			break;
		}
	}while(1);
	return 0;
}

1 Ответов

Рейтинг:
5

Patrice T

Цитата:
это показывает мне мусорную ценность я не знаю что я делаю не так

Наиболее вероятная причина заключается в том, что вы испортили next указатели при удалении элемента. Вы думали о том, чтобы обновить next указатель предыдущего элемента?

DIY решение: рано или поздно вам придется научиться находить ошибки самостоятельно, инструментом выбора является отладчик.
Возьмите лист бумаги и карандаш и смоделируйте свой связанный список.
Предположим, что вы моделируете список из 5 элементов, рисуете 10 столбцов, по 2 на элемент; 1 Для значения, 1 для указателя, скажите, что адреса элементов - A, B, C, D и E.
каждый раз, когда вы обновляете список, записывайте новый список в новую строку.
и удалите третий элемент, 4-й и 5-й элементы остаются на тех же столбцах, обновите указатели, чтобы отразить изменения.
Теперь используйте указатель, чтобы увидеть, что делает ваш код, и увидеть, когда он не соответствует вашим ожиданиям, вот где находится ваша ошибка.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Затем протестируйте процедуру удаления для первого и последнего элементов.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.