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

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

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

Связный список, потеря данных - C++

18.07.2014, 02:45. Просмотров 268. Ответов 5
Метки нет (Все метки)

Есть один список нахожу по ключу значения удаляю его из списка (все работает) , потом пытаюсь то что удалил внести в новый список и получаю ошибку
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <iostream>
#include <conio.h>
using namespace std;
 
 
struct BUS
{
    int bus_number;
    char driver_surname[10];
    char driver_name[10];
    int route_number;
};
 
 
   struct NODE {   // структура узел
    BUS  route;
    BUS bus; 
    NODE *next; 
    NODE *prev; 
 };
 
 
 
   NODE *first(BUS bus);
   NODE *find(NODE *const pbeg , int i);
   bool remove(NODE**pbeg , NODE **pend, int key);
 
 
   void get_info (BUS bus , NODE *pb){   
   cout<<"Bus nubmer:"<< pb->bus.bus_number<<"\n";
   cout<<"Driver name:"<<pb->bus.driver_name<<"\n";
   cout<<"Driver surname:"<<pb->bus.driver_surname<<"\n";
   cout<<"Bus route_number:"<<pb->bus.route_number<<"\n"; }
 
BUS **fill (BUS *bus){
cout<<"Bus number:";cin>>bus->bus_number;
cout<<"Driver name:"; cin>>bus->driver_name;
cout<<"Driver surname:";cin>>bus->driver_surname;
cout<<"Bus route number:";cin>>bus->route_number;
return &bus;
 }
 
 NODE * add_first (BUS bus){
 
     NODE *pv =  new NODE;
     pv->bus=bus;
     pv->next=0;
     pv->prev=0;
     return pv;
 }
 
 
 void add(NODE **pend , BUS bus){
     fill(&bus);
 
    NODE *pv = new NODE;
    pv->bus = bus;
    pv->next=0; 
    pv->prev=*pend;
    (*pend)->next=pv;
    *pend=pv;
 }
 
void add_route (NODE **pend , NODE *pv){
    
    //NODE *pv = new NODE;
    //pv->bus = *route;
    pv->next=0; 
    pv->prev=*pend;
    (*pend)->next=pv;
    *pend=pv;
 
}
 
 
 NODE *find (NODE * const pbeg , int key) {
        NODE *pv = pbeg;
        while(pv){
            if(pv->bus.bus_number == key ) break;
                  pv = pv->next;}
        return pv;
        }
 
 bool remove (NODE ** pbeg, NODE **pend , int key){
if(NODE *pkey = find(*pbeg, key)){
    if(pkey==*pbeg) {
        *pbeg=(*pbeg)->next;
        (*pbeg)->prev= 0;}
    else if(pkey==*pend){
        *pend = (*pend)->prev;
        (*pend)->next=0;}
    else {
        (pkey->prev)->next= pkey->next;
        (pkey->next)->prev = pkey->prev;}
    delete pkey;
    return true;
    }
return false;
}
 
 
 int main(){
 
int n ;
cout<<"How much buses you want to place in your park?:";
cin>>n;
 
   BUS bus;
   fill(&bus);
   NODE *pbeg = add_first(bus);
   NODE *pend = pbeg;
   
 
 for( int i=0;i<n-1;i++){
    add(&pend ,bus);
    cout<<endl;}
 
NODE *pb = pbeg;
 
 
    system("cls");
 int l=1;
 
    while(pb){
    cout<<l<<")";
    l++;
    get_info(bus , pb);
    cout<<endl;
    pb=pb->next; }
 
 int key;
cout<<"Enter which bus you want to delete ? enter bus number"<<endl;
cin>>key;
 
NODE *Route;
NODE *pv=find(pbeg,key);
add_route( &Route,pv);
remove(&pbeg, &pend , key);
 
 
 
//if(!remove(&pbeg, &pend , key)) cout<<"Not found";
 
 
NODE *pvv = pbeg;
pv = pbeg;
while (pvv)
{
get_info(bus,pv);
pvv=pvv->next;
cout<<"--------------------"<<endl;
}   
 
 
 
 
 cout<<"Now working with route";
 
 
 
 
 
     return 0;}

думаю дело в этом но как не переписывал не могу запустить без потери данных
C++
1
2
3
4
NODE *Route;
NODE *pv=find(pbeg,key);
add_route( &Route,pv);
remove(&pbeg, &pend , key);
Добавлено через 2 минуты
ругается на эту строчку
(*pend)->next=pv;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2014, 02:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Связный список, потеря данных (C++):

Связный список (Используя структуру описания даты, построить связный список студентов, сформированный в алфавитном порядке) - C++
Здраствуйте! Помогите пожалуйста найти косяк. Выводится только первая строчка из списка студентов. Вот такая задачка : Программа...

Однонаправленный связный список с полями данных в самом узле списка - C++
Добрый день! Правильно я поняла, что однонаправленный связный список с полями данных в самом узле списка выглядит так: struct robot //...

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

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

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

Связный список - C++
node *temp; 1.temp = (node*)malloc(sizeof(node)); 2.temp = new node; 1)Как работает (node*)malloc(sizeof(node)) ? что...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
18.07.2014, 09:40 #2
FloraWinx, эмм, вы получаете адрес найденного элемента, а потом передаете его для добавления в другой список? так ведь вы же, если я правильно понял, коверкаете элемент из оригинального списка. В таком случае лучше сделать функцию cut, которая будет возвращать адрес вырезамого из списка элемента, а соседние элементы будет связывать между собой, что бы связь не нарушить
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
18.07.2014, 09:51 #3
Какой смысл использования двойных указателей? Они только затрудняют понимание работы программы в данном случае.
0
FloraWinx
4 / 4 / 1
Регистрация: 05.10.2013
Сообщений: 123
18.07.2014, 10:10  [ТС] #4
функция bool remove связывает элементы просто удалить помеченный узел я спокойно могу.
0
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
18.07.2014, 10:35 #5
FloraWinx, просто судя по всему у вас вначале происходит изменение элемента (то есть связность списка нарушается), а потом происходит попытка связки этого списка, но связности уже нет
0
AlexVRud
442 / 152 / 38
Регистрация: 04.07.2014
Сообщений: 431
18.07.2014, 17:42 #6
NODE *Route; не инициализированно. Далее ты в некуда переставляешь найденный элемент. При этом разрушаешь целостность списка. Ну а потом удаляешь элемент из списка. При этом у тебя в условии присваевание, что неоднозначно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 17:42
Привет! Вот еще темы с ответами:

Связный список - C++
Скажите, пожалуйста, почему не отображается lastName? Или в структуре можно создавать только один тип для связных списков? #include...

Связный список - C++
Создать связанный список целых чисел, расположенных по возрастанию. Включить в список три числа, не нарушая упорядоченности. +ввод +вывод...

Связный список - C++
Здравствуйте. Подскажите информацию насчет связных списков. Книгу, или сайтик.

Связный список - C++
Не получается нормально скомпоновать файлы :( Сделал связный список использую шаблоны класса. Файл ListSpisok.h и есть сам связный...


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

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

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