mayashah Ответов: 3

Код перестал работать ? двойной связанный список


я получаю ошибку "перестал работать", когда пытаюсь реализовать функцию insertafter..
помогите мне решить эту ошибку !!

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

void DLL::insert(int value)
{
	if (head == NULL)
	{
		head = new Node;

		head->next = NULL;
		head->prev = NULL;
		head->data = value;
		last = head;
	}
	else
	{
		Node *temp = new Node;
		temp->data = value;
		temp->next = NULL;
		temp->prev = last;
		last->next = temp;
		last = temp;
	}
}


// Функция отображения и функция insertafter
void DLL::insertAfter(int v1, int v2)
{
	Node *present = new Node;
	while (present != NULL)
	{
		if (present->data == v1)
		{
			Node *temp = new Node;
			temp->data = v2;
			temp->next = present->next;
			temp->prev = present;
			present->next = temp;
			present = temp;
			break;
		}
		else
		{
			present = present->next;
		}
	}
}
void DLL::display()
{
	Node *temp = head;
	while (temp != NULL)
	{
		cout << temp->data << endl;
		temp = temp->next;
	}
}


//основная функция

void main()
{
	int v1, v2;
	DLL myList;
	myList.insert(1);
	myList.insert(2);
	myList.insert(4);
	myList.insert(5);
	myList.insert(6);
	myList.display();
	cout << "\n";
	cout << "PLEase enter the no Before that you want  to enter a number." << endl;
	cin >> v2;
	cout << "Now enter new no." << endl;
	cin >> v1;
	myList.insertAfter(v1, v2);
	myList.display();

}

3 Ответов

Рейтинг:
22

Jochen Arndt

Это выглядит подозрительно:

void DLL::insertAfter(int v1, int v2)
{
	Node *present = new Node;
	while (present != NULL)
	{
Вы создаете новый (unitialized) Node объект.

Наверное так и должно быть:
void DLL::insertAfter(int v1, int v2)
{
	Node *present = head;
	while (present != NULL)
	{


[РЕДАКТИРОВАТЬ]
Как только вы исправите это, вы столкнетесь с другими проблемами, потому что insertAfter не настраивает prev член следующего элемента списка (present- & gt;next - & gt;prev = temp) и не обновляется last когда элемент добавляется (элемент с data == v1 на самом деле это последний пункт в списке).

Наконец, существует транспозиция между v1 и v2 между запросом входных данных и обработкой их в insertAfter (положение вставки сохраняется в v2 который является значением данных при вставке).
[/РЕДАКТИРОВАТЬ]


Jochen Arndt

Ошибка "перестал работать" решается моим первоначальным решением.

Я также указал еще на некоторые проблемы с моим обновленным решением.

Какие же ошибки проявляются сейчас? Компилятор, компоновщик или при запуске программы?

Это также может быть возможность поднять новый вопрос, а не пытаться использовать раздел комментариев до тех пор, пока вся программа не сделает то, что должна.

Обратите внимание также, что в коде, не опубликованном здесь, может быть больше ошибок.
Например, инициализировали ли вы переменные-члены DLL head и last с NULL в конструкторе?

Рейтинг:
1

CPallini

Взгляните на свой insertAfter метод:

Node *present = new Node;
while (present != NULL)
{
  if (present->data == v1)
  {
   //..
  }
  else
  {
    present = present->next; //<--- troubles here
  }
  //..
Рассмотрим только что созданное present Node К сожалению, вы не показали нам Node конструктор, во всяком случае, мы могли бы с некоторой уверенностью предположить его next поле, указывающее на мусор, и его data поле очень маловероятно равное v1 Я вижу неприятности на горизонте.


mayashah

должен ли я включить эту строку "present = present - >next; / / < - - - неприятности здесь" тоже ??

Рейтинг:
0

Patrice T

void DLL::insertAfter(int v1, int v2)
{
	Node *present = new Node;
	while (present != NULL)

ваша функция работает с present, неинициализированный узел, не связанный со списком.

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.