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

Удаление элемента из двусвязного списка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
03.04.2013, 12:24     Удаление элемента из двусвязного списка #1
Надо удалить элемент из двусвязного списка, если выполняется условие (2013-(current->god)<3). Я пытаюсь как могу, но что то все равно косяки идут. Подскажите...


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
#include <conio.h>
#include <windows.h>
#include <iostream>
 
using namespace std;
//Создать структуру с именем Sotrudnik с полями: 
//фамилия, имя, должность, год поступления на работу.
//Сформировать двусвязный список. Удалить из списка тех сотрудников,
//кто работает менее 3-х лет. Вывести измененный список.
struct Sotrudnik
{
    char Famil[100];
    char Imya[100];
 
    char Dolznost[100];
    int god;
 
        Sotrudnik * next;
        Sotrudnik * prev;
        //Sotrudnik * tmp;
};
Sotrudnik *head=0;//адрес головы списка
Sotrudnik * tail=0;//адрес хвоста списка
//head->prev=0;
Sotrudnik *current,*tmp, *tyear;// tyear-работающий меньше 3 лет.
int main() 
{
    SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char c;
int k;
cout<<"Ввести данные о субъекте? д/Д";
 c=_getche();     
 //формирование списка с клавиатуры
 while (c=='д' || c=='Д')  
 {
if (head) //если не первый элемент списка
 { tail->next=new Sotrudnik;  /* создаем новый элемент и объяв-ляем его следующим для последнего элемента */
 
   tail->next->prev=tail; /* для вновь созданного элемента объявляем текущий последний элемент списка предыдущим */
   tail=tail->next;  /* созданный элемент списка объявляем по-следним */
   current=tail;
  }
else  //если создаем первый элемент списка
  { head=new Sotrudnik; /* созданный элемент объявляем головой списка */
    tail=head;   //он же пока и последний
    head->prev=0;  //у первого элемента нет предыдущего эле-мента
    current=head;
  }
 
 cout<<"\nВведите данные о субъекте:\n";
  cout<<"Фамилия:";
  cin>> current->Famil;
  cout<<"Имя:";
  cin>> current->Imya;
  cout<<"Должность:";
  cin>> current->Dolznost;
  cout<<"Год поступления на работу:";
  cin>>current->god;
  current->next=0;
  cout<<"Ввести данные о еще одном субъекте? д/н \n";
  c=_getche();
 
tail->next=0; /* у последнего элемента списка адрес не следующего элемента */
}
 
 
/* current=head;
  while(current!=0)
  {
      cout<<"Фамилия: \t";
     cout<<current->Famil<<"\n";
        cout<<"Имя:\t";
     cout<<current->Imya<<"\n";
        cout<<"Должность: \t";
    cout<<current->Dolznost<<"\n";
      cout<<"Год поступления на работу: \t";
          cout<<current->god<<"\n";
    current=current->next;
    cout<<"\n";
  }*/
current=head;
  while(current!=0)
  { 
      if (2013-(current->god))
      {
      current->next->prev=current->prev;
      current->prev->next=current->next;
      *tmp=*current;
      current=current->next;
      delete tmp;
      }
  }
current=head;
  while(current!=0)
  {
      cout<<"Фамилия: \t";
     cout<<current->Famil<<"\n";
        cout<<"Имя:\t";
     cout<<current->Imya<<"\n";
        cout<<"Должность: \t";
    cout<<current->Dolznost<<"\n";
      cout<<"Год поступления на работу: \t";
          cout<<current->god<<"\n";
    current=current->next;
    cout<<"\n";
  }
  
  system("pause");
  return 0;
}
Это весь код, а вот блок ответственный за удаление.
C++
1
2
3
4
5
6
7
8
9
10
11
12
current=head;
  while(current!=0)
  { 
      if (2013-(current->god))
      {
      current->next->prev=current->prev;
      current->prev->next=current->next;
      *tmp=*current;
      current=current->next;
      delete tmp;
      }
  }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
03.04.2013, 12:35     Удаление элемента из двусвязного списка #2
Lotus34, как-то так, не компилил, так что проверь

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
current = head;
 
    while(current != NULL)
    { 
        Sotrudnik *tmp = NULL;
 
        if(2013 - (current -> god) < 3)
        {
            if(current == head)
            {
                tmp = head -> next;
                delete head;
                head = tmp;
                tmp -> pred = NULL;
            }
            else if(current == tail)
            {
                tmp = tail -> pred;
                delete current;
                tail = tmp;
                tmp -> next = NULL;
            }
            else
            {
                tmp = current -> pred;
                tmp -> next = current -> next;
                delete current;
            }
        }
    }
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
03.04.2013, 14:29  [ТС]     Удаление элемента из двусвязного списка #3
Цитата Сообщение от yoghurt92 Посмотреть сообщение
Lotus34, как-то так, не компилил, так что проверь

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
current = head;
 
    while(current != NULL)
    { 
        Sotrudnik *tmp = NULL;
 
        if(2013 - (current -> god) < 3)
        {
            if(current == head)
            {
                tmp = head -> next;
                delete head;
                head = tmp;
                tmp -> pred = NULL;
            }
            else if(current == tail)
            {
                tmp = tail -> pred;
                delete current;
                tail = tmp;
                tmp -> next = NULL;
            }
            else
            {
                tmp = current -> pred;
                tmp -> next = current -> next;
                delete current;
            }
        }
    }

Все отлично запахало, спасибо, я понял , почему у меня не получалось,я как раз не мог правильно обратотать такую ситуацию, когда удаляем голову либо хвост.
1071
 Аватар для 1071
0 / 0 / 0
Регистрация: 11.03.2014
Сообщений: 8
11.03.2014, 19:27     Удаление элемента из двусвязного списка #4
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
#include <conio.h>
#include <Windows.h>
#include <iostream>
 
using namespace std;
//Создать структуру с именем Sotrudnik с полями: 
//фамилия, имя, должность, год поступления на работу.
//Сформировать двусвязный список. Удалить из списка тех сотрудников,
//кто работает менее 3-х лет. Вывести измененный список.
int main()
{   //setlocale(LC_ALL,"Russian");
struct Sotrudnik
{
    char Famil[20];
    char Imya[20];
    char Dolznost[20];
    int god;
 
        Sotrudnik * next, * prev;
        
};
Sotrudnik *head=0;//адрес головы списка
Sotrudnik *tail=0;//адрес хвоста списка  
//head->prev=0;
Sotrudnik *current,*tmp, *tyear;// tyear-работающий меньше 3 лет.
    /*setlocale(LC_ALL,"Russian");
    SetConsoleCP(1251);
SetConsoleOutputCP(1251);   */
char c;
int k;
cout<<"vvesti gaHHble? y/n";
 c=getche();     
 //формирование списка с клавиатуры
 while (c=='y' || c=='Y')  
 {                
if (head) //если не первый элемент списка
 { tail->next=new Sotrudnik;  /* создаем новый элемент и объяв-ляем его следующим для последнего элемента */
 
   tail->next->prev=tail; /* для вновь созданного элемента объявляем текущий последний элемент списка предыдущим */
   tail=tail->next;  /* созданный элемент списка объявляем по-следним */
  current=tail;
  }
else  //если создаем первый элемент списка
  { head=new Sotrudnik; /* созданный элемент объявляем головой списка */
    tail=head;   //он же пока и последний
    head->prev=0;  //у первого элемента нет предыдущего эле-мента
   current=head;
  }
               
 cout<<"\nvvedite gaHHble:\n";
  cout<<"famil:";
  cin>>current->Famil;  
  cout<<"imya:";
  cin>>current->Imya;
  cout<<"dolznost:";
  cin>>current->Dolznost;
  cout<<"god noctyplen:";
  cin>>current->god;
  current->next=0;
  cout<<"vvesti eLLLe gahhble? y/n \n";
  tail->next=0; /* у последнего элемента списка адрес не следующего элемента */
  c=getche();
 
 }
 
 
// current = head;
  current=current->next;
    while(current != 0)
    { 
        Sotrudnik *tmp = 0;
 
        if(2014 - (current -> god) < 3)
        {
            if(current == head)
            {
                tmp = head -> next;
                delete head;
                head = tmp;
                tmp -> prev = 0;
            }
            else if(current == tail)
            {
                tmp = tail -> prev;
                delete current;
                tail = tmp;
                tmp -> next = 0;
            }
            else
            {
                tmp = current -> prev;
                tmp -> next = current -> next;
                delete current;
            }
        }
    }        //удаление
 
current=head;
  while(current!=0)
  {
      cout<<"famil: \t";
     cout<<current->Famil<<"\n";
        cout<<"imya:\t";
     cout<<current->Imya<<"\n";
        cout<<"dolzhnostь: \t";
    cout<<current->Dolznost<<"\n";
      cout<<"god noctyplen: \t";
          cout<<current->god<<"\n";
    current=current->next;
    cout<<"\n";
  }
  
  
 
 system("pause");
  return 0;
}
Yandex
Объявления
11.03.2014, 19:27     Удаление элемента из двусвязного списка
Ответ Создать тему
Опции темы

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