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

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

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

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

21.05.2012, 19:26. Просмотров 288. Ответов 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); }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 19:26     Функция next списка ссылается не на следующий элемент, а на последний
Посмотрите здесь:

C++ Поменять местами 1ый и последний элемент списка C++
Переместить данный элемент в конец двусвязного списка и вывести указатели на первый и последний элементы C++
Переместить элемент в конец списка и вывести указатели на первый и последний элементы C++
C++ Надо удалить n-ный элемент списка, при том, что он не первый и не последний
C++ Удалить из списка последний элемент
C++ Удалить из непустого списка L последний элемент.
Рекурсивная функция. Преобразовать массив, прибавив к четным числам последний элемент C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 19:51     Функция next списка ссылается не на следующий элемент, а на последний #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);
 
 
// В таком коде всегда легче разобраться чем в том, что у вас написано.
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 20:09  [ТС]     Функция next списка ссылается не на следующий элемент, а на последний #3
ну так правильно, в 36 строчке после первого прохода я присваиваю pbeg->next следующее значение pt, а потом в 38 строке pg присваиваю значение этого(следуещего) pt, т.е. pg теперь у нас pbeg->next
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 20:33     Функция next списка ссылается не на следующий элемент, а на последний #4
как вы определили, что pbeg указывает на последний элемент в списке, а не на следующий? печатью на экран? а размер списка после такого добавления не пробовали проверить? корректные ли указатели? в общем на один вызов функции вы выделяете в памяти всего два узла (строки 4 и 5), а потом химичите с указателями на них. после этого в список не получится сделать больше чем из двух узлов. на каждой итерации чтения нужно выделять в памяти новый узел и связывать его у уже имеющимися.
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 20:42  [ТС]     Функция next списка ссылается не на следующий элемент, а на последний #5
да, выводом на экран, и количество смотрел-2! не понял почему список не может быть больше 2-х узлов?
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:10     Функция next списка ссылается не на следующий элемент, а на последний #6
вот еще раз прочтите:
на каждой итерации чтения нужно выделять в памяти новый узел и связывать его с уже имеющимися.
а лучше обратите внимание на код из моего первого сообщения.
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 21:17  [ТС]     Функция next списка ссылается не на следующий элемент, а на последний #7
я же динамически захватываю pt!
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2012, 21:21     Функция next списка ссылается не на следующий элемент, а на последний #8
не знаю что значит динамически захватить pt.
каждый узел списка должен создаваться динамически.
чтобы создать объект динамически, нужно позвать new.
у вас в коде new зовется всего два раза. значит создается всего два узла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2012, 21:36     Функция next списка ссылается не на следующий элемент, а на последний
Еще ссылки по теме:

C++ Функция, удаляющая элемент из двусвязного списка
Указатель в списке ссылается на себя, а не на следующий элемент C++
C++ Удалить из списка последний отрицательный элемент, если такой есть (линейные списки)
Перенести в начало непустого двунаправленного списка L его последний элемент C++
C++ В непустом динамическом списке последний элемент переместить в начало списка

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

Или воспользуйтесь поиском по форуму:
артем271293
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 20
21.05.2012, 21:36  [ТС]     Функция next списка ссылается не на следующий элемент, а на последний #9
спс, согласен затупил
надо было pt=new magazin в цикл запихнуть!
Yandex
Объявления
21.05.2012, 21:36     Функция next списка ссылается не на следующий элемент, а на последний
Ответ Создать тему
Опции темы

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