Форум программистов, компьютерный форум CyberForum.ru

Копирование списка - C++

Восстановить пароль Регистрация
 
Partiship
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 4
17.12.2013, 12:27     Копирование списка #1
Кто может помочь? У меня есть функция которая на основе изначального списка создает список (задом наперед). В итоге мне нужно иметь 2 списка: изначальный и (задом наперед).

Проблема в том, что функция список создает правильно. Но изначальный список становится пустым, чего не должно быть. Как избавиться от этого?

Мне предлагали сделать функцию рекуррентной, но я так и не смог. Как можно решить мою проблему? Буду благодарен.

Код
void reversed(LItem* &list_reversed, LItem* &list)
{
	list_reversed = NULL;
	LItem * buf = list;
	while (buf != NULL)
	{
		LItem *p = buf->next;
		buf->next = list_reversed;
		list_reversed = buf;
		buf = p;
	}
}
p.s.: с этой функцией у меня выводится только один элемент изначального списка.

Вот функция вывода.

Код
void output(LItem* &ListB, LItem* &ListE, LItem* &Elem, int z)
{
	Elem = ListB;
	//cout << "\nДля вывода списка нажмите любую клавишу\n";
	//_getch();
	cout << "\nСформированный список из " << z << " элементов:\n\n";
	while (Elem != NULL)
	{
		cout << Elem->data << endl;
		Elem = Elem->next;
	}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2013, 12:27     Копирование списка
Посмотрите здесь:

C++ Описать функцию, которая определяет, входят ли все элементы первого списка в состав второго списка.
копирование односвязного списка C++
C++ Удалить из списка все элементы с нечётными значениями и вывести указатель p2 на начало преобразованного списка.
Списки. Функции добавление списка в конец и в середину другого списка. C++
Дублирование вхождения каждого элемента списка One и формирование из этих значений списка Double (пояснить условие) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
17.12.2013, 12:54     Копирование списка #2
Приведу распространенную ошибку с использованием указателей. Возможно проблема в этом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int main()
{   
    int * var1 = new int;
    *var1 = 10;
    int * var2 = var1;
    
    std::cout << *var2 << std::endl;
    
    ++(*var2);
    
    std::cout << *var1 << std::endl;
    
    system("PAUSE");
    return 0;
}
Partiship
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 4
17.12.2013, 13:25  [ТС]     Копирование списка #3
Честно говоря я не очень понял где и какая ошибка, и как с этим бороться.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
17.12.2013, 13:36     Копирование списка #4
я не очень понял где и какая ошибка
Ошибка в том, что в примере выделяется память для указателя var1,
C++
1
2
int * var1 = new int;
    *var1 = 10;
а потом якобы пытаетесь скопировать в другой указатель не выделяя для него памяти
C++
1
int * var2 = var1;
, таким образом два указателя указывают на одну область памяти и изменение любого из этих указателей приводит к изменению и второго
C++
1
2
3
4
5
std::cout << *var2 << std::endl;
    
    ++(*var2);
    
    std::cout << *var1 << std::endl;
Часто это ошибка непонимания или невнимательности и потом приходится долго мучатся что бы найти её,
а исправление в данном примере это выделить память отдельно для var1 и var2 и потом копировать значения а не адреса памяти, примерно так
C++
1
2
3
4
5
6
7
8
9
10
int * var1 = new int;
    *var1 = 10;
    int * var2 = new int;
      *var2 = *var1;
    
    std::cout << *var2 << std::endl;
    
    ++(*var2);
    
    std::cout << *var1 << std::endl;
теперь изменение var2 не приводит к изменению var1.
Partiship
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 4
17.12.2013, 13:55  [ТС]     Копирование списка #5
А то есть, мне нужно выделить память под то, куда я хочу копировать, чтобы не было перезаписи?
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
17.12.2013, 14:08     Копирование списка #6
А то есть, мне нужно выделить память под то, куда я хочу копировать, чтобы не было перезаписи?
Совершенно верно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2013, 14:13     Копирование списка
Еще ссылки по теме:

C++ Списки. К каждому элементу списка прибавить значение следующего элемента списка. Последний элемент не менять
C++ Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка
Разработать класс Итератор, методы которого: переход в начало списка, в конец, к текущему элементу списка, к с C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Partiship
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 4
17.12.2013, 14:13  [ТС]     Копирование списка #7
Спасибо большое, дальше я уже сам буду разбираться.
Еще раз спасибо.
Yandex
Объявления
17.12.2013, 14:13     Копирование списка
Ответ Создать тему
Опции темы

Текущее время: 03:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru