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

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

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

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

13.07.2014, 14:11. Просмотров 301. Ответов 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;}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2014, 14:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление узла в линейном списке (C++):

Ошибка в линейном списке - C++
ошибка

Поиск в линейном двусвязном списке - C++
Программа реализует добавление, удаление элементов списка, просмотр списка и поиск элемента в списке. Проблема в том, что когда поиск...

Программа которая определяет число элементов в линейном списке - C++
Написать программу обхода бинарного дерева Нужно написать, вопросы: 1)На каком языке лучше написать? 2)И как это лучше сделать? ...

Строка: Выделить вхождение отдельного символа их количество и хранить их вместе со счётчиком в линейном однонаправленом списке. - C++
Помогите написать программу которая выделяет вхождение отдельного символа их количество и хранит их вместе со счётчиком в линейном...

удаления узла в двухсвязном списке - C++
Привет всем! такая проблема , не получается корректно удалить узел из двухвязного списка. как решить эту проблему ? #include &lt;iostream&gt; ...

Записи в линейном списке содержат ключевое поле типа int. Сформировать двунаправленный список. Удалить из него - C++
Записи в линейном списке содержат ключевое поле типа int. Сформировать двунаправленный список. Удалить из него элемент с заданным номером,...

2
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; }
Как я понял это из учебника по С++? Советую вам самому реализовать линейный список (как делал это я) без применения указателя на указатель (пхахаха, вообще бред).
0
FloraWinx
4 / 4 / 1
Регистрация: 05.10.2013
Сообщений: 123
13.07.2014, 20:02  [ТС] #3
я уже разобрался что у меня не работает)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2014, 20:02
Привет! Вот еще темы с ответами:

Добавление узла перед заданным в односвязном списке - C++
Вот такой код я нашел, но он похоже с ошибками, нету * как минимум. проставил их но тоже не помогло void AddBefore(PNode PHead, PNode p,...

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

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

RB tree удаление узла - C++
Народ, подсткажите рекурсивный алгоритм удаления узла RB tree, или где найти можно... второй день в гугле сижу, видимо руки не от туда...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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