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

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

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

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

13.07.2014, 14:11. Просмотров 296. Ответов 2
Метки нет (Все метки)

У меня есть структура (файловая система) , я могу помещать туда файлы (здесь все работает). Содержаться следующие поля : имя файла , время создания , количество обращений. Количество обращений и время задается рандомно. Хотел сделать следующее я задаю время с клавиатуры и оно должно мне удалить те файлы которые были созданы раньше заданного времени. И что странно оно мне все время удаляет первый элемент моего списка, хотя функция поиска по ключу вроде работает нормально. Функция Удаления я вызываю функцию поиска по ключу ,ключ задается как массив с трех элементов (день.месяц.год) соответственно проверяю с года если встречаю узел который меньше передаю его в функцию удаления. Думаю еще как вариант написать функцию сортировки по времени и потом удалять просто хвост. Функции 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++
C++ Строка: Выделить вхождение отдельного символа их количество и хранить их вместе со счётчиком в линейном однонаправленом списке.
удаления узла в двухсвязном списке C++
C++ Записи в линейном списке содержат ключевое поле типа int. Сформировать двунаправленный список. Удалить из него
C++ Добавление узла перед заданным в односвязном списке
C++ Почему сортируются цифры в линейном списке, а фамилии не сортируются
C++ Записи в линейном списке содержат ключевое поле типа int. Сформиро-вать двунаправленный список. Добавить в него элемент с заданным номером, удалить К
C++ RB tree удаление узла
C++ Удаление узла дерева
Удаление узла из дерева C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
4 / 4 / 1
Регистрация: 05.10.2013
Сообщений: 123
13.07.2014, 20:02  [ТС]     Удаление узла в линейном списке #3
я уже разобрался что у меня не работает)
Ответ Создать тему
Опции темы

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