Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

17.12.2013, 12:27. Просмотров 829. Ответов 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;
	}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2013, 12:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копирование списка (C++):

Копирование односвязного списка - C++
в классе содержится односвязный список. соответственно пишу для него оператор присваивания. подскажите, как можно скопировать односвязный...

Копирование списка указателей на виртуальный класс - C++
Добрый день! Подскажите, пожалуйста. Имею примерно такой код class Abstract { public: int mAbs;

Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка - C++
Люди ПОМОГИТЕ осталось совсем мало , мне нужна помощь!!! написать код программ: 1) Написать код программы, выполняющей растяжку...

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

Списки. Функции добавление списка в конец и в середину другого списка. - C++
Всем привет!) Я вот написал две функции, 1- добавляется список2 в середину списка1, а 2 - добавляет список2 в конец списка1....когда я...

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

6
egor2116
342 / 373 / 42
Регистрация: 20.01.2013
Сообщений: 1,132
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;
}
0
Partiship
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 4
17.12.2013, 13:25  [ТС] #3
Честно говоря я не очень понял где и какая ошибка, и как с этим бороться.
0
egor2116
342 / 373 / 42
Регистрация: 20.01.2013
Сообщений: 1,132
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.
0
Partiship
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 4
17.12.2013, 13:55  [ТС] #5
А то есть, мне нужно выделить память под то, куда я хочу копировать, чтобы не было перезаписи?
0
egor2116
342 / 373 / 42
Регистрация: 20.01.2013
Сообщений: 1,132
17.12.2013, 14:08 #6
А то есть, мне нужно выделить память под то, куда я хочу копировать, чтобы не было перезаписи?
Совершенно верно.
1
Partiship
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 4
17.12.2013, 14:13  [ТС] #7
Спасибо большое, дальше я уже сам буду разбираться.
Еще раз спасибо.
0
17.12.2013, 14:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2013, 14:13
Привет! Вот еще темы с ответами:

Привести пример реализации любого линейного списка списка с использованием лишь структур - C++
Буду благодарен, если кто-нибудь сможет привести пример реализации любого линейного списка списка с использованием лишь структур (то есть...

Удалить из списка все элементы с нечётными значениями и вывести указатель p2 на начало преобразованного списка. - C++
Здравствуйте. Не получается решить задачу. Условие. Дан непустой двусвязный список. Удалить из списка все элементы с нечётными ...

Получить указатель на элемент двунаправленного списка, добавить значение в начало списка и очистить его - C++
Нужно создать двунаправленный список //вроде так, но не уверен struct Double_List {//структура данных int Data;...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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