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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Partiship
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 4
#1

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

17.12.2013, 12:27. Просмотров 684. Ответов 6
Метки нет (Все метки)

Кто может помочь? У меня есть функция которая на основе изначального списка создает список (задом наперед). В итоге мне нужно иметь 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++
Добрый день! Подскажите, пожалуйста. Имею примерно такой код class Abstract { public: int mAbs;

Реализовать ведение списка забронированных и списка купленных билетов в кинозале кинотеатра - C++
Приветствую! работаю на Builder Borland c++ - программирую таблицы и кнопки такое задание : Реализовать ведение списка забронированных...

Проверка, пуст ли список, очистка списка, печать списка в направлении от верха к низу - C++
Доброго вечера. Пожалуйста помогите разобраться с заданием на структуры, и подскажите с чего здесь начинать? 1) Кольцевой...

Описать функцию, которая определяет, входят ли все элементы первого списка в состав второго списка. - C++
Описать функцию, которая определяет, входят ли все элементы первого списка в состав второго списка. на с++

Необходимо разработать программу, в которой выполняется ввод списка записей определенного типа, а затем - обработка списка. - C++
Необходимо разработать программу, в которой выполняется ввод списка записей определенного типа, а затем - обработка списка. Сначала в...

Добавить в конец списка L1 все элементы списка L2 - C++
Разработать программу обработки односвязных линейных списков с числом элементов в списке не менее пяти в соответствии с индивидуальным...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
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
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
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
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
17.12.2013, 14:08     Копирование списка #6
А то есть, мне нужно выделить память под то, куда я хочу копировать, чтобы не было перезаписи?
Совершенно верно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2013, 14:13     Копирование списка
Еще ссылки по теме:

Написать функцию, которая из списка образует два новых списка. Один содержит нечетные числа, а второй - парные - C++
Помогите закончить одно из заданий по работе со списком: Написать функцию, которая использует первоначальный список L и образует два...

Формирование и просмотр списка и функция, которая изменяет каждое значение информационной части элемента списка на его квадрат - C++
Написать программу, содержащую процедуры формирования и просмотра списка и функцию, которая изменяет каждое значение информационной части...

Необходимо разработать программу, в которой выполняется ввод списка записей определенного типа, а затем - обработка списка. Сначала в программе должен - C++
Вывести на экран все записи товаров, определенного ценового диапазона. Ценовой диапазон указывается пользователем. ТОВАР: наименование...

Используя производные классы, определить класс параметризованного списка одного из следующих типов. Применить его для построения списка объектов указа - C++
Используя производные классы, определить класс параметризованного упорядоченного списка. Применить его для построения упорядоченного...

Формирование упорядоченного списка из целых чисел; удаление из списка отрицательные чисел и удвоение положительных - C++
Составить программу, которая: • обеспечивает первоначальный ввод целых чисел и формирует из них упорядоченного списка; • затем ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru