5 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 126
1

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

03.04.2013, 12:24. Показов 4493. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Надо удалить элемент из двусвязного списка, если выполняется условие (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;
      }
  }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2013, 12:24
Ответы с готовыми решениями:

Удаление элемента из двусвязного списка
Доброго всем времени суток. Нужна помощь. Есть двусвязный список. Функции передаем какое то...

Удаление элемента из двусвязного списка
Собственно, в коде все рабочее, кроме удаления. После ввода элемента выдает ошибку 0xC0000005....

Удаление элемента из двусвязного списка
Помогите пожалуйста найти где я ошибся. Элементы в список добавляются, вывод на экран тоже...

Удаление элемента из двусвязного списка по значению
Есть такой код, который позволяет добавлять элементы в список и выводить, а мне нужно доделать еще...

3
381 / 352 / 113
Регистрация: 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;
            }
        }
    }
1
5 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 126
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;
            }
        }
    }

Все отлично запахало, спасибо, я понял , почему у меня не получалось,я как раз не мог правильно обратотать такую ситуацию, когда удаляем голову либо хвост.
0
0 / 0 / 2
Регистрация: 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;
}
0
11.03.2014, 19:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2014, 19:27
Помогаю со студенческими работами здесь

Удаление первого и последнего элемента двусвязного списка с++
Удаление первого и последнего элемента двусвязного списка с++ namespace vlados { ...

"Сортировка двусвязного списка путем исключения элемента с минимальным значением и включения его в начало нового списка
Здравствуйте! Возникла проблема с программой. Тема: &quot;Сортировка двусвязного списка путем исключения...

Удаление структуры из двусвязного списка
Доброго времени суток! Пытаюсь создать функцию удаления из списка структуры, не выполняется цикл...

Удаление из двусвязного циклического списка
Начал реализовывать структуру данных - Фибоначчиевы кучи. Столкнулся с проблемой при написании...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru