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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2012, 18:37   #1
Alex_Dep
Пользователь
 
Регистрация: 18.01.2012
Сообщений: 26
По умолчанию списки(удаление всех отрицательных)

помогите переделать программу. когда я ввожу -1, -2 и -3. а мне надо удалить все отрицательные элементы он выдает какую то ошибку.
Код:
#include <iostream>
#include <windows.h>
#include <locale>
 using namespace std;

 class Node
{ 
	public:
	int numer;
	Node* next;
};
 void main()
{
	setlocale(LC_ALL,"rus");
	Node* head = NULL;
	Node* body = NULL;
	short action = -1;
	while (1)
	{
		cout<<"1. Добавить элемент"<<endl;
		cout<<"2. Просмотр списка"<<endl;
		cout<<"3. Поиск отрицательных элементов"<<endl;
		cout<<"4. Удаление первого отрицательного элемента"<<endl;
		cout<<"0. Выход"<<endl;
		cout<<"Ваш Выбор: ";
		cin>>action;

		if (action == 0)
		{
			system("CLS");
			break;
		}	
		if (action == 1)
		{
			system("CLS");
			Node* ptr = new Node;
			int m;
			cout<<"Введите Число: ";
			cin>>m;
			ptr->numer = m;
			ptr->next = NULL;
			if (head == 0)
			{	
				head = ptr;
				body = ptr;
				system("CLS");
				continue;
			}	
			body->next = ptr;
			body = ptr;
			system("CLS");
			continue;
		}

		if (action == 2)
		{
			Node* ptr = NULL;
			system("CLS");
			if (head == NULL)
			{	
				cout<<"СПИСОК ПУСТ"<<endl;
				system("PAUSE");
				system("CLS");
				continue;
			}	
			cout<<" СПИСОК "<<endl;
			ptr = head;
			while (1)
			{
				cout<<ptr->numer<<" ";
				if (ptr->next == 0)
					break;
				ptr = ptr->next;
			}
			cout<<"\n\n";
			system("PAUSE");
			system("CLS");
			continue;
		}
		if (action == 3)
		{
			body=head;
			while (body!=NULL)
			{ 
				if (body->numer<0)
					cout<<body->numer<<" ";
				body = body->next;
			}	
			cout<<endl;
		}
	if (action == 4)
{
	system("CLS");
	Node* del = NULL;
	Node* last = head;

	body=head;
	while (body!=NULL)
	{
		if (body->numer<0)
		{
			del=body;
			body=body->next;
			last->next=body;
			if (del==head) 
				head=body;
			delete del;
		}
		else
		{
			last=body;
			body=body->next;
		}
	}
	if (head == NULL)
	{
		puts("Пустой список");
		system("PAUSE");
		system("CLS");
		continue;
	}
}

	cout<<endl;
	}
	}
и в двух связном списке такая же проблемма. ввожу два отрицательных числа. он удаляет их и выходит ошибка.
Код:
#include<iostream>
#include<conio.h>
using namespace std;

struct node
{
	int info;
	node *rlink;
	node *llink;
};

node* f(node *r)
{
	node *t;
	t=r;
	while(t!=NULL)
	{
		if(t->info<0)
			return t;
		t=t->llink;
	}
	return t;
}

//список с право на лево
void llist(node *left)
{
	node *k=left;
	while(k!=NULL)
	{
		cout<<k->info<<"\t";
		k=k->rlink;
	}
	if(left==NULL)
		cout<<"Список пуст!\n";
}

//список слева на право
void rlist(node *right)
{
	node *k=right;
	while(k!=NULL)
	{
		cout<<k->info<<"\t";
		k=k->llink;
	}
	if(right==NULL)
		cout<<"Список пуст!\n";
}

void main()
{
	setlocale(LC_ALL,"");
	node *k, *q, *left, *right;

	int n,i=1;
	cout<<"Введите кол-во чисел: ";
	cin>>n;

	k=new node;
	cout<<"Введите число: ";
	cin>>k->info;
	k->rlink=NULL;
	k->llink=NULL;
	right=k;
	q=k;

	while(i<n)
	{
		k=new node;
		cout<<"Введите число: ";
		cin>>k->info;

		k->rlink=q;
		q->llink=k;
		q=k;
		i++;
	}

	q->llink=NULL;
	left=q;

	cout<<"\nСписок до преоброзования с лева на право: \n";
	rlist(right);

	cout<<"\nСписок до преоброзования с права на лево: \n";
	llist(left);
	cout<<"\n\n//--------------------------------------//";
	// поиск и удаление отрицательных элементов
	bool fll=true;
	while(fll)
	{
		k=left;
		node *l,*res;

		res=f(right);
		

		if(left->info<0 && left->rlink==NULL)
		{
			left=NULL;
			right=NULL;
		}
		else
			if(res!=NULL && res->info<0)
			{
				fll=true;
				while(k!=NULL)
					if(res==k)
						if(k==left) 
						{
							q=k;
							left=k->rlink;
							left->llink=NULL;
							l=k=left;
							delete q;
						}
						else
							if(k==right)
							{
								q=k;
								right=k->llink;
								right->rlink=NULL;
								k=NULL;
								delete q;
							}
							else
							{
							q=k;
							l->rlink=k->rlink;
							k->rlink->llink=l;
							delete q;
							k=l->rlink;
							}
					else
					{
						l=k;
						k=k->rlink;
					}
			}
			else
				fll=false;
				
	}

	cout<<"\n\nСписок после преоброзования с лева на право: \n";
	rlist(right);

	cout<<"\nСписок после преоброзования с права на лево: \n";
	llist(left);

	getch();
}
пожалуйста помогите. я не могу понять чего не хаватает

Последний раз редактировалось Alex_Dep; 10.06.2012 в 18:39.
Alex_Dep вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
замена всех отрицательных елементов, находившихся под главной диагонолью матрицы VaLiAr Помощь студентам 2 03.11.2011 17:57
Списки[ Удаление] Muro Общие вопросы C/C++ 9 11.06.2010 20:55
Pascal - Найти сумму всех ее отрицательных элементов и заменить ею все диагональные элементы этой матрицы NewBi Паскаль, Turbo Pascal, PascalABC.NET 2 24.04.2010 09:15
Удаление всех гиперссылок БуреВестник Microsoft Office Word 6 16.10.2009 10:05
Паскаль.Файлы.удаление отрицательных чисел NEMO1991 Помощь студентам 3 06.06.2009 00:38