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

Удаление узла в линейном списке - C++

Восстановить пароль Регистрация
 
FloraWinx
 Аватар для FloraWinx
4 / 4 / 1
Регистрация: 05.10.2013
Сообщений: 122
13.07.2014, 14:11     Удаление узла в линейном списке #1
У меня есть структура (файловая система) , я могу помещать туда файлы (здесь все работает). Содержаться следующие поля : имя файла , время создания , количество обращений. Количество обращений и время задается рандомно. Хотел сделать следующее я задаю время с клавиатуры и оно должно мне удалить те файлы которые были созданы раньше заданного времени. И что странно оно мне все время удаляет первый элемент моего списка, хотя функция поиска по ключу вроде работает нормально. Функция Удаления я вызываю функцию поиска по ключу ,ключ задается как массив с трех элементов (день.месяц.год) соответственно проверяю с года если встречаю узел который меньше передаю его в функцию удаления. Думаю еще как вариант написать функцию сортировки по времени и потом удалять просто хвост. Функции add , add_first , fill, get_info работают корректно их можно не смотреть.

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
#include <iostream>
#include <conio.h>
#include <time.h>
 using namespace std;
 struct  file_system{            
     char file_name [10]; 
     int file_cr [3]; 
     int file_response;};
 
   struct NODE {
     file_system file; 
     NODE *next; 
     NODE *prev; 
 
 };
 
   NODE *first(file_system file);
   NODE *find(NODE *const pbeg , int i);
   bool remove(NODE**pbeg , NODE **pend, int key);
 
   void get_info (file_system file , NODE *pb){
       cout<<"File name:"<< pb->file.file_name<<"\n";
       cout<<"File creation date:";
       for(int i=0;i<3;i++){
        cout<<pb->file.file_cr[i]<<".";}
       cout<<"\n";
       cout<<"File responses:"<<pb->file.file_response<<endl;
       
        
   }
 
 file_system **fill (file_system *file){
 srand(time(NULL));
 int first_value = 1990;
cout<<"Enter file name:";
cin>>file->file_name;
file->file_cr[0]=rand()%30;
file->file_cr[1]=rand()%12;
file->file_cr[2]=first_value+rand()%15;
cout<<"File data creation is :"<<file->file_cr[0]<<"."<<file->file_cr[1]<<"."<<file->file_cr[2]<<"\n";
file->file_response=rand()%10; 
cout<<"number of cals is seted up:"<<file->file_response<<endl;
return &file;
 }
 
 NODE * add_first (file_system file){
 
     NODE *pv =  new NODE;
     pv->file=file;
     pv->next=0;
     pv->prev=0;
     return pv;
 }
 
 NODE *find (NODE * const pbeg , int key[]) { // return data
    NODE *pv = pbeg;
    bool flag = false;
    while(pv){ 
 
        for(int i=2;i>=0;i--){
        if(pv->file.file_cr[i]<key[i]){
            flag=true;
            break; }
        }
 
        if(flag==true) break;
        else pv = pv->next;
 
    }
    return pv   ;
 }
 
 
bool remove (NODE ** pbeg, NODE **pend , int key [3]){
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;
}
 
 
 void add(NODE **pend , file_system file){
 fill(&file);
 
    NODE *pv = new NODE;
    pv->file = file;
    pv->next=0; 
    pv->prev=*pend;
    (*pend)->next=pv;
    *pend=pv;
 }
 
 
 int main(){
 
int n ;
cout<<"How much files you want to place in?:";
cin>>n;
 
file_system file;
 fill(&file);
 
NODE *pbeg = add_first(file);
NODE *pend = pbeg;
 
 
 for( int i=0;i<n-1;i++){
    add(&pend ,file);
    cout<<endl;}
 
NODE *pb = pbeg;
 
  system("cls");
 int l=1;
 
 while(pb){
    cout<<l<<")";
l++;
    get_info(file , pb);
 
pb=pb->next;
 
  }
 
 
 
 
 
  cout<<"enter date. All the files which were creater earlier will be deleted.";
    int date [3];
     cin>>date[0]>>date[1]>>date[2];
if(!remove(&pbeg, &pend , date)) cout<<"Not found";
 
NODE *kit = pbeg;
while(kit){
 
    get_info(file , kit);
    kit=kit->next;
}
 
 
 
 
 return 0;}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2014, 14:11     Удаление узла в линейном списке
Посмотрите здесь:

удаления узла в двухсвязном списке C++
C++ Строка: Выделить вхождение отдельного символа их количество и хранить их вместе со счётчиком в линейном однонаправленом списке.
C++ Записи в линейном списке содержат ключевое поле типа int. Сформиро-вать двунаправленный список. Добавить в него элемент с заданным номером, удалить К
Ошибка в линейном списке C++
Программа которая определяет число элементов в линейном списке C++
C++ Записи в линейном списке содержат ключевое поле типа int. Сформировать двунаправленный список. Удалить из него
C++ Добавление узла перед заданным в односвязном списке
C++ Почему сортируются цифры в линейном списке, а фамилии не сортируются

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
13.07.2014, 17:49     Удаление узла в линейном списке #2
C++
1
bool remove (NODE ** pbeg, NODE **pend , int key [3]){ 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; }
Как я понял это из учебника по С++? Советую вам самому реализовать линейный список (как делал это я) без применения указателя на указатель (пхахаха, вообще бред).
FloraWinx
 Аватар для FloraWinx
4 / 4 / 1
Регистрация: 05.10.2013
Сообщений: 122
13.07.2014, 20:02  [ТС]     Удаление узла в линейном списке #3
я уже разобрался что у меня не работает)
Yandex
Объявления
13.07.2014, 20:02     Удаление узла в линейном списке
Ответ Создать тему
Опции темы

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