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

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

Восстановить пароль Регистрация
 
FloraWinx
 Аватар для FloraWinx
4 / 4 / 1
Регистрация: 05.10.2013
Сообщений: 122
18.07.2014, 02:45     Связный список, потеря данных #1
Есть один список нахожу по ключу значения удаляю его из списка (все работает) , потом пытаюсь то что удалил внести в новый список и получаю ошибку
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;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
18.07.2014, 09:40     Связный список, потеря данных #2
FloraWinx, эмм, вы получаете адрес найденного элемента, а потом передаете его для добавления в другой список? так ведь вы же, если я правильно понял, коверкаете элемент из оригинального списка. В таком случае лучше сделать функцию cut, которая будет возвращать адрес вырезамого из списка элемента, а соседние элементы будет связывать между собой, что бы связь не нарушить
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
18.07.2014, 09:51     Связный список, потеря данных #3
Какой смысл использования двойных указателей? Они только затрудняют понимание работы программы в данном случае.
FloraWinx
 Аватар для FloraWinx
4 / 4 / 1
Регистрация: 05.10.2013
Сообщений: 122
18.07.2014, 10:10  [ТС]     Связный список, потеря данных #4
функция bool remove связывает элементы просто удалить помеченный узел я спокойно могу.
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
18.07.2014, 10:35     Связный список, потеря данных #5
FloraWinx, просто судя по всему у вас вначале происходит изменение элемента (то есть связность списка нарушается), а потом происходит попытка связки этого списка, но связности уже нет
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
18.07.2014, 17:42     Связный список, потеря данных #6
NODE *Route; не инициализированно. Далее ты в некуда переставляешь найденный элемент. При этом разрушаешь целостность списка. Ну а потом удаляешь элемент из списка. При этом у тебя в условии присваевание, что неоднозначно.
Yandex
Объявления
18.07.2014, 17:42     Связный список, потеря данных
Ответ Создать тему
Опции темы

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