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

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

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

Восстановить пароль

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

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

Доброго времени суток граждане
Задали написать программу сложения двух знаковых чисел представив их в виде линейных двусвязных списков
На данный момент пытаюсь оформить только в случае если оба числа > 0
Не могу понять по чему по окончанию работы функции Sum выдаёт ошибку
stack around the variable signum was corrupted
собственно код
Код:
/*
Целое число (длинное) представить
в виде двусвязного линейного списка.
Написать программу для сложения
2-х заданных чисел (со знаком)
произвольной длины.
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include <windows.h>
using namespace std;



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



typedef Number* pNumber;



void CreateFile(fstream &finout, char name[]);
void ReadFile(fstream &finout, char filename[]);
bool Empty(pNumber &first);
void Del_cur(pNumber &cur, int &userdata);
void Del_first(pNumber &first, int &userdata);
void Add_after_cur(pNumber &cur, int userdata, char sign);
void Add_first(pNumber &first, int userdata, char sign); 
void Form(pNumber &first1, pNumber &first2, pNumber &cur1, pNumber &cur2, fstream &finoutF, char nameF[], pNumber &first_result);
void Sum(pNumber &first1, pNumber &first2, pNumber &first_result, pNumber &cur1, pNumber &cur2, pNumber &cur_result);
void Read_next(pNumber first);
void Perenos(pNumber cur1, pNumber cur2, pNumber cur_result, char sign_result, char* signum_operator);
void Signum(pNumber first1, pNumber first2, char* signum);



void main()
{
	::SetConsoleOutputCP(1251);
	::SetConsoleCP(1251);
	char nameF[20];
	pNumber first1 = NULL, first2 = NULL, first_result = NULL, cur1 = NULL, cur2 = NULL, cur_result = NULL;
	fstream finoutF;
	cout << "Введите имя файла для записи чисел ";
	cin.getline(nameF, 20);
	system("cls");
	CreateFile(finoutF, nameF);
	system("cls");
	cout << "Исходные числа №1";
	ReadFile(finoutF, nameF);
	Form(first1, first2, cur1, cur2, finoutF, nameF, first_result);
	cout << "Двусвязный список первого числа ";
	Read_next(first1);	
	cout << "Двусвязный список второго числа ";
	Read_next(first2);
	Sum(first1, first2, first_result, cur1, cur2, cur_result);
	Read_next(first_result);
}



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);
	}
}



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 Add_after_cur(pNumber &cur, int userdata, char sign)
{
	pNumber temp_p;
	temp_p = new Number;
	temp_p->data = userdata;
	temp_p->sign = sign;
	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 Add_first(pNumber &first, int userdata, char sign)
{
	pNumber temp_p;
	temp_p = new Number;
	temp_p->sign = sign;
	temp_p->data = userdata;
	temp_p->prev = NULL;
	temp_p->next = NULL;
	first = temp_p;
}



void Del_cur(pNumber &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 Del_first(pNumber &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 Empty(pNumber &first)
{
	return (first == NULL);
}



void Read_next(pNumber first)
{
	pNumber cur = first;
	cout << endl << first->sign;
	while (cur != NULL)
	{
		cout << cur->data;
		cur = cur->next;
	}
	cout << endl;
}
valdemar593 вне форума Ответить с цитированием
Старый 28.03.2010, 21:09   #2
valdemar593
Пользователь
 
Регистрация: 22.12.2009
Сообщений: 20
По умолчанию

Код:



void Form(pNumber &first1, pNumber &first2, pNumber &cur1, pNumber &cur2, fstream &finoutF, char nameF[], pNumber &first_result)
{
	if (Empty(first1) && Empty(first2))
	{
		int i, n = 1 , length, abs1, abs2;
		char str[100], tmp_str[7] = "\0", sign;
		finoutF.open(nameF, ios::in);
		finoutF.clear();
		finoutF.seekg(0);
		while (finoutF.getline(str, 100))
		{	
			length = strlen(str);
			if (n == 1)	
			{
				strset(tmp_str, 0x00);
				strncpy(tmp_str, &str[1], 1);
				Add_first(first1, atoi(tmp_str), str[0]);
				cur1 = first1;
				for (i = 2; i < length; i++)
				{
					strset(tmp_str, 0x00);
					strncpy(tmp_str, &str[i], 1);
					Add_after_cur(cur1, atoi(tmp_str), str[0]);
				}
				abs1 = atoi(&str[1]);
				sign = str[0];
			}
			if (n == 2)
			{
				strset(tmp_str, 0x00);
				strncpy(tmp_str, &str[1], 1);
				Add_first(first2, atoi(tmp_str), str[0]);
				cur2 = first2;
				for (i = 2; i < length; i++)
				{		
					strset(tmp_str, 0x00);
					strncpy(tmp_str, &str[i], 1);
					Add_after_cur(cur2, atoi(tmp_str), str[0]);
				}
				abs2 = atoi(&str[1]);
				if (abs(abs1) < abs(abs2))
					Add_first(first_result, 11, str[0]);
				else 
					Add_first(first_result, 11, sign);
			}
			n++;
		}		
	}
}



void Signum(pNumber first1, pNumber first2, char* signum)
{
	strset(signum, 0x00);
	if (first1->sign == '-' && first2->sign == '-')
		strcpy(signum, "--");
	if (first1->sign == '-' && first2->sign == '+')
		strcpy(signum, "-+");
	if (first1->sign == '+' && first2->sign == '-')
		strcpy(signum, "+-");	
	if (first1->sign == '+' && first2->sign == '+')
		strcpy(signum, "++");
}



void Sum(pNumber &first1, pNumber &first2, pNumber &first_result, pNumber &cur1, pNumber &cur2, pNumber &cur_result)
{
	char signum[7];
	Signum(first1, first2, signum);
	cur1 = first1;
	cur2 = first2;
	cur_result = first_result;
	if (strcmp(signum, "++\0") == 0)
	{
		while (cur1->next != NULL || cur2->next != NULL)
		{
			if ((cur1->data + cur2->data) < 10) 	
			{
				if (first_result->data == 11)
				{
					Add_first(first_result, cur1->data + cur2->data, first_result->sign);
					cur_result = first_result;
				}
				if (cur_result->next != NULL)
				{
					cur_result->next += (cur1->data + cur2->data);
					cur_result = cur_result->next;
				}
				else 
					Add_after_cur(cur_result, cur1->data + cur2->data, first_result->sign);
			}
			else 
				Perenos(cur1, cur2, cur_result, first_result->sign, signum);
			if (cur1->next != NULL)
				cur1 = cur1->next;
			if (cur2->next != NULL)
				cur2 = cur2->next;
		}
	}
}



void Perenos(pNumber cur1, pNumber cur2, pNumber cur_result, char sign_result, char* signum_operator)
{
	if (strcmp(signum_operator, "++") == 0)
	{
		cur_result->data = cur1->data + cur2->data;
		Add_after_cur(cur_result, 1, sign_result);
	}
}
valdemar593 вне форума Ответить с цитированием
Старый 29.03.2010, 10:43   #3
valdemar593
Пользователь
 
Регистрация: 22.12.2009
Сообщений: 20
По умолчанию

Кто-нибудь
valdemar593 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязные списки(Язык С) ecokot Помощь студентам 1 10.09.2009 11:02
двусвязные списки ai\ekcah^p Общие вопросы C/C++ 11 06.06.2009 19:13
Двусвязные списки Serp Помощь студентам 3 14.04.2009 16:13