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

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

Войти
Регистрация
Восстановить пароль
 
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
#1

Функция next списка ссылается не на следующий элемент, а на последний - C++

21.05.2012, 19:26. Просмотров 313. Ответов 8
Метки нет (Все метки)

после выполнения функции pbeg->next ссылается на последний элемент, а не на следующий, помогите!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void addf()
 
       { FILE *f1;
pt=new magazin;
pr=new magazin;
magazin m;
f1 = fopen("6.dat","r+b");
fread(&m.nomer,sizeof(m.nomer),1,f1);
fread(&m.nazvanie,sizeof(m.nazvanie),1,f1);
fread(&m.fio,sizeof(m.fio),1,f1);
fread(&m.dohod,sizeof(m.dohod),1,f1);
fread(&m.kol,sizeof(m.kol),1,f1);
pr->nomer=m.nomer;
strcpy(pr->nazvanie,m.nazvanie);
strcpy(pr->fio,m.fio);
pr->dohod=m.dohod;
pr->kol=m.kol;
pr->prev=0;
pr->next=0;
pbeg=pr;
pg=pbeg;
while(true)
{fread(&m.nomer,sizeof(m.nomer),1,f1);
fread(&m.nazvanie,sizeof(m.nazvanie),1,f1);
fread(&m.fio,sizeof(m.fio),1,f1);
fread(&m.dohod,sizeof(m.dohod),1,f1);
fread(&m.kol,sizeof(m.kol),1,f1);
pt->nomer=m.nomer;
strcpy(pt->nazvanie,m.nazvanie);
strcpy(pt->fio,m.fio);
pt->dohod=m.dohod;
pt->kol=m.kol;
if(feof(f1)) {break;}
pt->next=0;
pt->prev=pg;
pg->next=pt;
cout<<pt->dohod<<endl;
pg=pt;
}
 
  fclose(f1); }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 19:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция next списка ссылается не на следующий элемент, а на последний (C++):

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

Вывести содержимое списка в следующем порядке: первый элемент, последний элемент, второй элемент, предпоследни - C++
#include &lt;iostream&gt; #include &lt;list&gt; #include &lt;iterator&gt; void output(std::list&lt;int&gt; myList, std::list&lt;int&gt;::iterator iter1,...

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

Задача Иосифа Флавия. Удалить каждый второй элемент из списка и в конце вывести на экран последний оставшийся элемент - C++
Создать циклический список, в котором находятся элементы от 1 до N. Нужно написать программу, которая удаляет каждый второй элемент из...

Удалить из списка последний элемент - C++
Задание: Удалить из списка последний элемент. #include&lt;iostream.h&gt; #include&lt;conio.h&gt; struct elem { int Data; elem *Next; ...

Удалить из непустого списка L последний элемент. - C++
Прошу помочь решить задачки!:(очень нужно (Билет №15) Удалить из непустого списка L последний элемент. Правила форума

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 19:51 #2
обычно лучше весь код выкладывать, а не отдельные куски.
значит попробуй поугадывать:
в строке 21: pg=pbeg;
pbeg указывает на самый первый узел. после выполнения этой строчки
pg тоже бует указывать на этот самый первый узел.
далее идет цикл заполнения списка и в строчке 36 происходит следующее:
pg->next= pt;
вот в этот момент начальный узел начинает ссылаться на последний узел, т.к.
pg и pbeg указывают на один и тот же узел, то эта 36ая строчка эквивалентна
pbeg->next=pt; - т.е. pbeg->next начнет указывать на последний добавленный.

А вообще я бы вам посоветовал реорганизовать код.
чтение данных из файла - это одна функция.
добавление значение в конец списка - это другая.
так будет проще и понятнее.
Вот примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Вот примерный код:
 
//Тут обратите внимание на то, что узел - это структура из
//данных и указателя на другие узлы. У вас же узел списка - это
//структура в которой и поля данных и указатели на другие узлы.
// такое разделение еще дает возможность читать из файла структуру
// magazine одним вызовом функции, а не по полям,
// т.е. fread(&m,sizeof(magazine),1,f1);, потому что в структуре нет
// паразитных next и prev
struct Node
{
  magazine mag;
  Node* prev;
  Node* next
};
 
magazine readFromFile()
{
  magazine m;
  // тут любым способом макаром читаем из файла
  return m;
};
 
Node* getLastNode()
{
  // тут проходим по списку до конца и возвращаем последний узел.
  // ну или еще откудато его берем. это не важно. главное чтобы
  // функция всегда возвращала последний узел.
  return lastNode;
}
 
void add(const magazine& m)
{
  Node* lastNode = getLastNode();
  Node* newNode = new Node();
  newNode.mag = m;
  lastNode->next = newNode;
  newNode->prev = lastNode;
  newNode->next = 0;
}
 
// ну и тут все это применяем:
const magazine m = readFromFile();
add(m);
 
 
// В таком коде всегда легче разобраться чем в том, что у вас написано.
0
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 20:09  [ТС] #3
ну так правильно, в 36 строчке после первого прохода я присваиваю pbeg->next следующее значение pt, а потом в 38 строке pg присваиваю значение этого(следуещего) pt, т.е. pg теперь у нас pbeg->next
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 20:33 #4
как вы определили, что pbeg указывает на последний элемент в списке, а не на следующий? печатью на экран? а размер списка после такого добавления не пробовали проверить? корректные ли указатели? в общем на один вызов функции вы выделяете в памяти всего два узла (строки 4 и 5), а потом химичите с указателями на них. после этого в список не получится сделать больше чем из двух узлов. на каждой итерации чтения нужно выделять в памяти новый узел и связывать его у уже имеющимися.
0
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 20:42  [ТС] #5
да, выводом на экран, и количество смотрел-2! не понял почему список не может быть больше 2-х узлов?
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:10 #6
вот еще раз прочтите:
на каждой итерации чтения нужно выделять в памяти новый узел и связывать его с уже имеющимися.
а лучше обратите внимание на код из моего первого сообщения.
0
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 21:17  [ТС] #7
я же динамически захватываю pt!
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:21 #8
не знаю что значит динамически захватить pt.
каждый узел списка должен создаваться динамически.
чтобы создать объект динамически, нужно позвать new.
у вас в коде new зовется всего два раза. значит создается всего два узла.
1
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 21:36  [ТС] #9
спс, согласен затупил
надо было pt=new magazin в цикл запихнуть!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2012, 21:36
Привет! Вот еще темы с ответами:

Поменять местами 1ый и последний элемент списка C++ - C++
Ребят посмотрите задачу! исправьте пожалуйста! завтра сдавать, а я не понимаю что нужно сделать, чтобы она работала правильно! Нужно...

Перенести в начало непустого двунаправленного списка L его последний элемент - C++
Облазил форум, ответа так и не нашел :(помогите разобраться. Создать два двунаправленных списка L1, L2. Вывести на экран оба списка....

В непустом динамическом списке последний элемент переместить в начало списка - C++
Добрый день! Помогите пожалуйста. Ниже код,который был дан как образец в методичке и был переделан под свое задание. Задание текущее в...

Переместить элемент в конец списка и вывести указатели на первый и последний элементы - C++
Помогите, пожалуйста! Прошу вас о помощи в написании программы на С++... Задача такова: Дан указатель P0 на один из элементов непустого...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.05.2012, 21:36
Ответ Создать тему
Опции темы

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