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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2010, 20:20   #1
valdemar593
Пользователь
 
Регистрация: 22.12.2009
Сообщений: 20
По умолчанию Класс линейный список

Граждане всем доброго времени суток

собсно задание
/*
Целое число (длинное) представить
в виде двусвязного линейного списка.
Написать программу для сложения
2-х заданных чисел (со знаком)
произвольной длины.
*/

выдаёт ошибку обращения к такой то области памяти по окончанию работы ф-и Sum
не могу понять в чём дело
помогите кто чем может

собсно код
Код:
#include <iostream>
#include <fstream>
#include <cstring>
#include <windows.h>
using namespace std;



static char sign1, sign2, sign_result;



struct Number 
{
	int data;
	Number *next;
	Number *prev;
};



typedef Number* pNumber;



class cNumber
{
private:
	pNumber cur, first;
public:
	cNumber();
	~cNumber();
	void Point_end();
	bool Empty();
	void Del_cur(int &userdata);
	void Del_first(int &userdata);
	void Add_after_cur(int userdata);
	void Add_first(int userdata);
	void Form(char number[]);
	void Sum(cNumber spisok1, cNumber spisok2);
	void Read_prev();
	void Perenos();
	void Perenos1();
	void SetFirst();
	pNumber GetFirst();
	pNumber GetCur();
};



void main()
{
	::SetConsoleOutputCP(1251);
	::SetConsoleCP(1251);
	int abs1, abs2;
	char number[100] = {0,};
	cNumber spisok1, spisok2, spisok_result;
	//pNumber first1 = NULL, first2 = NULL, first_result = NULL, cur1 = NULL, cur2 = NULL, cur_result = NULL;
	// знак результата будет определяться ТУТ!
	cout << "Введите первое число. Максимальная длина 100 символов.\nПЕРВЫЙ РАЗРЯД ДОЛЖЕН БЫТЬ ЗНАКОВЫМ\n";
	cin.getline(number, 100);
	sign1 = number[0];
	abs1 = abs(atoi(&number[1]));
	spisok1.Form(number);
	cout << "Введите второе число. Максимальная длина 100 символов.\nПЕРВЫЙ РАЗРЯД ДОЛЖЕН БЫТЬ ЗНАКОВЫМ\n";
	cin.getline(number, 100);
	sign2 = number[0];
	abs2 = abs(atoi(&number[1]));
	spisok2.Form(number);
	if (abs1 > abs2)
		sign_result = sign1;
	else
		sign_result = sign2;
	// якобы до сюда якобы переделал
	spisok1.Point_end();
	cout << "Двусвязный список первого числа " << endl << sign1;
	spisok1.Read_prev();
	spisok2.Point_end();
	cout << "Двусвязный список второго числа " << endl << sign2;
	spisok2.Read_prev();
	spisok_result.Sum(spisok1, spisok2);
	spisok_result.Point_end();
	cout << "Результат сложения" << endl << sign_result;
	spisok_result.Read_prev();
}


cNumber::cNumber()
{
	cur = first = NULL;
}



cNumber::~cNumber()
{
	cNumber::Point_end();
	while (cur != NULL)
	{
		delete cur;
		cur = cur->prev;
	}
}


void cNumber::SetFirst()
{
	first = cur;
}


pNumber cNumber::GetFirst()
{
	return first;
}



pNumber cNumber::GetCur()
{
	return cur;
}



void CreateFile(fstream &finout, char name[])
{
	char Exit[20] = "Exit", str[100];
	cout << "Конец записи = Exit" << endl;
	finout.open(name, ios::out);	
	finout.clear();		
	if (finout.is_open())	
	{
		cout << "Введите число, максимальное количество разрядов - 100\nПервый разряд ДОЛЖЕН быть знаковым" << endl;
		cin.getline(str, 100);	
		while (strcmp(Exit, str) != 0)	
		{
			finout << str;	
			finout.put('\n');	
			cout << "Введите число" << endl;
			cin.getline(str, 100);	
		}
		finout.close();
	}
	else 
	{
		cout << "Не удалось открыть файл" << endl;
		exit(1);
	}
}
valdemar593 вне форума Ответить с цитированием
Старый 19.04.2010, 20:20   #2
valdemar593
Пользователь
 
Регистрация: 22.12.2009
Сообщений: 20
По умолчанию

Код:


void ReadFile(fstream &finout, char name[])
{
	char str[100];
	finout.open(name, ios::in);	
	finout.clear();
	finout.seekg(0); 
	if (finout.is_open()) 
	{
		cout << endl;
		while (finout.getline(str, 100)) 
			cout << str << endl;
		finout.close();
	}
	else
	{
		cout << "Не удалось открыть файл" << endl;
		exit(1);
	}
	cout << endl;
}



void cNumber::Point_end()
{
	while (cur->next != NULL)
		cur = cur->next;
}



void cNumber::Add_after_cur(int userdata)
{
	pNumber temp_p;
	temp_p = new Number;
	temp_p->data = userdata;
	if (cur->next == NULL)
	{
		temp_p->next = NULL;
		temp_p->prev = cur;
	}
	else	
	{
		temp_p->next = cur->next;
		temp_p->prev = cur;
		cur->next->prev = temp_p;
	}
	cur->next = temp_p;
	cur = temp_p;
}



void cNumber::Add_first(int userdata)
{
	pNumber temp_p;
	temp_p = new Number;
	temp_p->data = userdata;
	temp_p->prev = NULL;
	temp_p->next = NULL;
	first = temp_p;
	cur = first;
}



void cNumber::Del_cur(int &userdata)
{
	pNumber temp_p;
	temp_p = cur->prev;
	userdata = cur->data;
	temp_p->next = cur->next;
	if (cur->next != NULL)
		cur->next->prev = temp_p;
	delete cur;
	cur = temp_p;
}



void cNumber::Del_first(int &userdata)
{
	pNumber temp_p;
	temp_p = first;
	userdata = temp_p->data;
	first->next = temp_p->next;
	first->prev = NULL;
	delete temp_p;
}



bool cNumber::Empty()
{
	return (first == NULL);
}



void cNumber::Read_prev()
{
	while (cur != NULL)
	{
		cout << abs(cur->data) << " ";
		cur = cur->prev;
	}
	cout << endl;
}



void cNumber::Perenos()
{
	cNumber::cur = cNumber::first;
	while (cNumber::cur != NULL)
	{
		if (cNumber::cur->data >= 10 && cNumber::cur->next != NULL)
			while (cNumber::cur->data >= 10 && cNumber::cur->next != NULL)
			{
				cNumber::cur->next->data++;
				cNumber::cur->data -= 10;
			}
		else
		{
			if (cNumber::cur->data >= 10 && cNumber::cur->next == NULL)
			{
				Add_after_cur(0);
				cNumber::cur = cNumber::cur->prev;
				while (cNumber::cur->data >= 10)
				{
					cNumber::cur->next->data++;
					cNumber::cur->data -= 10;
				}
			}
		}
		cNumber::cur = cNumber::cur->next;
	}
}


void cNumber::Perenos1()
{
	pNumber p;
	cNumber::Point_end();
	bool perenos = false;
	while (cNumber::cur->prev != NULL)
	{
		if (cNumber::cur->data <= 0)
		{
			cNumber::cur = cNumber::cur->prev;
			continue;
		}
		else
		{
			perenos = true;
			break;
		}
	}
	if (perenos)
	while (cNumber::cur != NULL)
	{
		if (cNumber::cur->data < 0 && cNumber::cur->next > 0)
		{
			p = cNumber::GetCur();
			do
			{
				if (cNumber::cur->next != NULL)
					cNumber::cur = cNumber::cur->next;
			}
			while (cNumber::cur->data <= 0 && cNumber::cur->next != NULL);
			while (cNumber::cur != p)
			{
				cNumber::cur->data--;
				cNumber::cur->prev->data += 10;
				cNumber::cur = cNumber::cur->prev;
			}
			cNumber::cur= p;
		}
		cNumber::cur = cNumber::cur->prev;
	}
}
valdemar593 вне форума Ответить с цитированием
Старый 19.04.2010, 20:21   #3
valdemar593
Пользователь
 
Регистрация: 22.12.2009
Сообщений: 20
По умолчанию

Код:

void cNumber::Form(char number[])
{
	if (cNumber::Empty())
	{
		int i, n = 1 , length;
		char tmp_str[7] = "\0", sign;
		length = strlen(number);
		strset(tmp_str, 0x00);
		strncpy(tmp_str, &number[length - 1], 1);
		Add_first(atoi(tmp_str));
			cur = first;
		for (i = length - 2; i > 0; i--)
		{
			strset(tmp_str, 0x00);
			strncpy(tmp_str, &number[i], 1);
			Add_after_cur(atoi(tmp_str));
		}
		sign1 = number[0];
	}		
}



void cNumber::Sum(cNumber spisok1, cNumber spisok2)
{
	bool N1 = true, N2 = true;	
	int change1 = 0, change2 = 0, change_result = 0;
	// в случае cur1\2->next = NULL и несоответствия количества разрядов возникают проблемы при обращении к памяти
	spisok1.cur = spisok1.GetFirst();
	spisok2.cur = spisok2.GetFirst();
	if ((sign1 == '+' && sign2 == '+') || (sign1 == '-' && sign2 == '-'))
	{
		// фактически while (cur1->next != NULL || cur2->next != NUUL) 
		while (N1 || N2)	
		{		
			if (cNumber::Empty())
			{
				cNumber::Add_first(spisok1.cur->data + spisok2.cur->data);		
				cNumber::SetFirst();
			}
			else
				Add_after_cur(spisok1.cur->data + spisok2.cur->data);		
			if (N1)
				if (spisok1.cur->next != NULL)
				{
					spisok1.cur = spisok1.cur->next;
					change1++;
				}
				else
				{
					spisok1.cur->data = 0;
					N1 = false;
				}
			if (N2)
				if (spisok2.cur->next != NULL)
				{
					spisok2.cur = spisok2.cur->next;
					change2++;
				}
				else
				{
					spisok2.cur->data = 0;
					N2 = false;
				}
		}
		cNumber::Point_end();
		cNumber::Perenos();
	}	
	if ((sign1 == '+' && sign2 == '-'))
	{
		//фактически while (cur1->next != NULL || cur2->next != NUUL) 
		while (N1 || N2)	
		{		
			if (cNumber::Empty())
			{
				Add_first(spisok1.cur->data - spisok2.cur->data);		
				cNumber::cur = cNumber::GetFirst();
			}
			else
				Add_after_cur(spisok1.cur->data - spisok2.cur->data);		
			if (N1)
				if (spisok1.cur->next != NULL)
				{
					spisok1.cur = spisok1.cur->next;
					change1++;
				}
				else
				{
					spisok1.cur->data = 0;
					N1 = false;
				}
			if (N2)
				if (spisok2.cur->next != NULL)
				{
					spisok2.cur = spisok2.cur->next;
					change2++;
				}
				else
				{
					spisok2.cur->data = 0;
					N2 = false;
				}
		}
		cNumber::Point_end();
		cNumber::Perenos1();
	}
	if ((sign1 == '-' && sign2 == '+'))
	{
		//фактически while (cur1->next != NULL || cur2->next != NUUL) 
		while (N1 || N2)	
		{		
			if (cNumber::Empty())
			{
				Add_first(spisok2.cur->data - spisok1.cur->data);		
				cNumber::cur = cNumber::GetFirst();
			}
			else
				Add_after_cur(spisok2.cur->data - spisok1.cur->data);		
			if (N1)
				if (spisok1.cur->next != NULL)
				{
					spisok1.cur = spisok1.cur->next;
					change1++;
				}
				else
				{
					spisok1.cur->data = 0;
					N1 = false;
				}
			if (N2)
				if (spisok2.cur->next != NULL)
				{
					spisok2.cur = spisok2.cur->next;
					change2++;
				}
				else
				{
					spisok2.cur->data = 0;
					N2 = false;
				}
		}
		cNumber::Point_end();
		cNumber::Perenos1();
	}
}
valdemar593 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линейный список Black_Ak24 Паскаль, Turbo Pascal, PascalABC.NET 2 04.01.2008 15:00