Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2015, 15:44   #1
demuros
Новичок
Джуниор
 
Регистрация: 07.12.2015
Сообщений: 2
По умолчанию Помогите исправить проблему в двусвязном списке!

Помогите пожалуйста исправить проблему в программе! При вводе, к примеру, 5 элементов в список и при последующем удалении, к примеру, 3 элемента, из списка пропадает еще и 1 элемент и появляется только если удалить остальные элементы. Странная фигня. Помогите, в чём проблема? Долго сидел над функцией удаления, но так и не понял в чём проблема. Заранее спасибо!!!

Вот половина кода проги, вторая половина в ответах
Код:
//
#include "stdafx.h"
#include "conio.h"
#include "locale.h"
#include <iostream>
#include <string>

using namespace std;
#define QUEUE struct queue

struct BUS
{
	int number_tel;
	int data;
	char surname_spisok[40];
	char name_spisok[40];

};

QUEUE
{
	struct BUS info;
	struct queue *next;
	struct queue *prev;
};

void add_data(QUEUE **pbeg, struct BUS item)
{
	QUEUE *cur;
	QUEUE *previous = 0;
	QUEUE *new_node;
	new_node = new QUEUE;
	int i = 0;
	cur = *pbeg;
	new_node->info = item;
	while (cur)
	{
		if ((new_node->info.number_tel - cur->info.number_tel)>0)
		{
			i++;
			previous = cur;
			cur = cur->next;
		}
		else if ((new_node->info.number_tel - cur->info.number_tel) <= 0)
		{
			break;
		}
	}

	if ((i == 0) && (cur != NULL))
	{
		new_node->next = cur;
		cur->prev = new_node;
		cur = new_node;
		cur->prev = NULL;
		*pbeg = cur;
	}

	else {
		cur = previous;
		if (cur == 0)
		{
			*pbeg = new_node;
			(*pbeg)->next = NULL;
			(*pbeg)->prev = NULL;
			cur = (*pbeg);
		}

		else if (cur->next == NULL)
		{
			cur->next = new_node;
			new_node->prev = cur;
			new_node->next = NULL;
			new_node = cur;
		}

		else if (cur->next != NULL)
		{
			new_node->next = cur->next;
			cur->next->prev = new_node;
			cur->next = new_node;
			new_node->prev = cur;
		}
	}
}

void delite_data(QUEUE **pbeg, char *driver)
{

	int prov;
	QUEUE *old_node = *pbeg;
	int flag = 0;
	if (pbeg)
	{
		fflush(stdin);

		while (((*pbeg) != 0) && (strcmp((*pbeg)->info.surname_spisok, driver) != 0))
		{
			*pbeg = (*pbeg)->next;
		}
		if (*pbeg)
		{
			if ((*pbeg)->prev == NULL)
			{
				old_node = (*pbeg);
				*pbeg = (*pbeg)->next;
				flag = 1;
				if (*pbeg)

					(*pbeg)->prev = NULL;
				flag = 1;
			}
			else
			{
				if ((*pbeg)->next == NULL)
				{
					old_node = (*pbeg);
					(*pbeg) = (*pbeg)->prev;

					(*pbeg)->next = NULL;
					flag = 1;
				}
				else
				{
					old_node = (*pbeg);
					(*pbeg)->prev->next = (*pbeg)->next;


					(*pbeg)->next->prev = (*pbeg)->prev;
					(*pbeg) = (*pbeg)->prev;

					flag = 1;
				}
			}


			free(old_node);
		}
		if (flag == 0) printf("\nТаких данных не существует!  \n");
		if (flag == 1) printf("\nДанные удалены!  \n");
	}
	else printf("Список пуст.");
}
demuros вне форума Ответить с цитированием
Старый 07.12.2015, 15:45   #2
demuros
Новичок
Джуниор
 
Регистрация: 07.12.2015
Сообщений: 2
По умолчанию

Код:
void output_all_bus(QUEUE **q)
{
	int prov = 0;
	QUEUE *tmp2 = *q;

	while (tmp2)
	{
		if (prov == 0)
		{
			printf_s("  **********************************************\n");
			printf_s("  | Фамилия           |День рождения| № телефона|\n");
			printf_s("  **********************************************\n");
		}
		prov = 1;
		printf_s("  |%17s  |", tmp2->info.surname_spisok);
		printf_s("%10d  |", tmp2->info.data);
		printf_s("%9d  |\n", tmp2->info.number_tel);
		tmp2 = tmp2->next;
	}


	if (prov == 0) cout << "\n\n\t\t\tВведите данные в первом пункте \n\n\n";
	else printf_s("  **********************************************\n\n\n");
}

void output_marsh(QUEUE **q)
{
	int marsh;
	cout << "Введите номер необходимого маршрута:  ";
	cin >> marsh;
	int flag = 0, prov = 0;
	QUEUE *tmp2 = *q;

	while (tmp2)
	{

		if (tmp2->info.number_tel == marsh)
		{
			if (prov == 0)
			{
				printf_s("  **********************************************\n");
				printf_s("  | Фамилия           |День рождения| № телефона|\n");
				printf_s("  **********************************************\n");
				prov = 1;
			}
			flag = 1;
			printf_s("  |%17s  |", tmp2->info.surname_spisok);
			printf_s("%10d  |", tmp2->info.data);
			printf_s("%9d  |\n", tmp2->info.number_tel);
		}
		tmp2 = tmp2->next;
	}


	if (flag == 0) cout << "\n\n\t\t\tПо данному номеру данных нет. \n\n\n";
	else printf_s("  **********************************************\n\n\n");
}


int _tmain(int argc, _TCHAR* argv[], int &pbeg, char &item)
{
	setlocale(LC_ALL, "Russian");
	cout << "\t\t***************************************************\n";
	cout << "\t\t|  Практика №3  |        Двусвязный список        |\n";
	cout << "\t\t|  Выполнил     |       Фомичев Юрий, ИКТ-11      |\n";
	cout << "\t\t***************************************************\n\n\n";
	cout << "***************---> Для перехода в меню нажмите любую клавишу <---**************";
	_getch();
	system("cls");
	struct BUS temp;
	char surname_spisok[40];
	char name_spisok[40];
	char driver[40];
	QUEUE *q = 0;
	int off = 1;
	do{
		system("cls");
		cout << "\t\t\t\t___МЕНЮ___\n\n\n";
		cout << "Выберите раздел:\n";
		cout << "1) Добавление данных.\n";
		cout << "2) Удаление данных.\n";
		cout << "3) Вывод информации.\n";
		cout << "4) Вывод информации по номеру телефона.\n";
		cout << "5) О программе.\n";
		cout << "6) Выход.\n";
		switch (int e = _getch())
		{
		case 49:system("cls");
			cout << "\t\t\t___Добавление данных об автобусе___\n\n\n";
			cout << "Введите фимилию и имя:  ";
			cin >> temp.name_spisok;
			cin >> temp.surname_spisok;
			cout << "Введите день рождения:  ";
			cin >> temp.data;
			cout << "Введите номер телефона:  ";
			cin >> temp.number_tel;

			add_data(&q, temp);

			cout << "\n\n\t\t\tДанные были успешно добавлены!\n\n";
			cout << "***************---> Для перехода в меню нажмите любую клавишу <---**************";
			_getch();

			break;
		case 50:system("cls");
			cout << "\t\t\t___Удаление данных___\n\n\n";
			if (q != NULL)
			{
				output_all_bus(&q);
				cout << "Введите фамилию:  ";
				cin >> driver;
				delite_data(&q, driver);


			}
			else cout << "\n\n\t\t\tВведите данные в первом пункте!\n\n";
			cout << "***************---> Для перехода в меню нажмите любую клавишу <---**************";
			_getch();
			system("cls");
			break;
		case 51:system("cls");
			cout << "\t\t___Вывод информации___\n\n\n";
			output_all_bus(&q);
			cout << "***************---> Для перехода в меню нажмите любую клавишу <---**************";
			_getch();
			break;
		case 52:system("cls");
			if (q != NULL)
			{
				cout << "\t\t\t___Вывод информации по номеру телефона___\n\n\n";
				output_marsh(&q);
			}
			cout << "***************---> Для перехода в меню нажмите любую клавишу <---**************";
			_getch();
			break;
		case 53:
			"\t\t***************************************************\n";
			cout << "\t\t|  Практика №3  |        Двусвязный список        |\n";
			cout << "\t\t|  Выполнил     |       Фомичев Юрий, ИКТ-11      |\n";
			cout << "\t\t***************************************************\n\n";
			cout << "***************---> Для перехода в меню нажмите любую клавишу <---**************";
			_getch();
			system("cls");
			break;
		case 54:
			off = 0;
			break;
		}

	} while (off == 1);
	return 0;
}
demuros вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите исправить процедуру Del,в двусвязном списке svetik290895 Общие вопросы C/C++ 0 10.05.2015 19:32
Удаление элемента в двусвязном списке (Delphi). tgig Помощь студентам 4 10.10.2013 10:36
Сортировка char в двусвязном списке preanik Помощь студентам 0 12.05.2013 02:18
В двусвязном списке продублировать те элементы, которые меньше следующего, но больше больше предыдущего. gvenog Помощь студентам 0 13.12.2010 21:20
Помогите диагностировать проблему ноутбука и по возможности исправить Злая Злюка Компьютерное железо 3 04.11.2009 18:51