0 / 0 / 0
Регистрация: 27.04.2016
Сообщений: 2
1

Реализовать удаление элемента из пользовательского класса "Двунаправленный список"

10.10.2016, 22:47. Показов 919. Ответов 1
Метки нет (Все метки)

Программа для работы с двунаправленным списком.
Пользователь вводит список с клавиатуры, программа должна выводить его в обоих направлениях, удалять первый/последний элемент и выводить измененный список также в обоих направлениях.
Всё работает, но есть одно но: когда удаляю первый элемент, и после этого хочу вывести список в обратном порядке, он выводит его без удаления (то есть исходный список). В чём проблема?
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <ctime>
#include <Windows.h>
#include <WinBase.h>
 
 
using namespace std;
 
struct list
{
    int  Inf;
    list * n,
         * p;
         
 
};
 
int main ()
{
    setlocale(0,"");
    //cоздание списка
    int k; //необходимое кол-во ячеек
    list *c, *allo, *del, *begin, *ab, *Curr, *next=0;
    int dn;
    long long t=0;
    
 
    cout<<"Сколько ячеек создать?"<< endl;
    cin>>k;
    cout<<"Заполнить случайными числами? Да- нажмите 1, нет-нажмите 0"<<endl;
    cin>>dn;
    
    for ( int i = 1; i <= k; ++ i )
    {
        
        allo = new list;
    
        allo->n = next; 
        if  ( next )  
            {
                next->p=allo;}
 
    allo->p = 0;
        next = allo;
    
 
    c=allo;//запомнили первый элемент списка
    }
 
    
    if (dn==1)
    { t=GetTickCount64(); 
        for (int i=1; i<=k; ++i) 
        {
            //cout<<"Введите значение"<<endl;
            allo->Inf=rand();
            cout<<endl;
            allo=allo->n; //переход к следующему
            
        }
t= GetTickCount64()-t; 
          cout << "Время работы создания списка в программе равно " <<t<< endl;
          system ("pause");
    }
 
    
    int s;
    while (int l=1)
    {
        system("cls");
    cout<<"Введите:"<<endl<<"1-записать список"<<endl<<"2- удалить первый элемент элемент"<<endl<<"3-удалить последний элемент"<<endl<< "4-просмотреть список"<<endl<<"5-просмотреть список в обратном порядке"<<endl<<"6-выход"<< endl;
    cin>>s;
 
if (s == 1) //записываем список
    { 
        for (int i=1; i<=k; ++i) 
        {
            cout<<"Введите значение"<<endl;
            cin>>allo->Inf;
            cout<<endl;
            allo=allo->n; //переход к следующему
        }
 
    }
 
   
 
    if (s == 2) //удаление первого элемента
    {
        allo=c;
        ab=allo->n;
        c=ab;
        k--;
    }
 
    if (s == 3) //удаление последнего элемента
    {
    allo=c;
    for (int i=1; i<(k-1); ++i)
        allo=allo->n;
    allo->n=NULL;
    k--;
    }
 
     if (s==4) // просмотр списка
    {
        
        
        allo=c;
        while (allo != 0)
        {
            cout <<allo->Inf<<"\t";
            allo=allo->n;
        }
system ("pause");
    
    }
 
 
 if (s == 5)
 {
     allo=c;
     while ((allo->n) != NULL)
         allo=allo->n;
     do {
         cout<<allo->Inf<<'\t';
         allo=allo->p;
     }
     while ( allo != NULL);
     system ("pause");
 }
 
 if (s == 6)
     {
         return 0;
     }
 
}
 
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2016, 22:47
Ответы с готовыми решениями:

Реализовать пользовательский класс "Двунаправленный список"; реализовать добавление и удаление элементов
Записи в линейном списке содержат ключевое поле типа *char(строка символов). Сформировать...

Реализовать указанные функции-члены для пользовательского класса "Кольцевой двусвязный список"
Сообственно сабж. У списка два закрытых поля: tail-это узел следующий за &quot;последним&quot;(условно,ибо...

На основе заданных прототипов реализовать функции-члены для пользовательского класса "Односвязный список"
Извиняюсь,забыла принт опреедлить Преподаватель дал прототипы функций ,которые надо определить для...

Написать конструктор для пользовательского класса "Двусвязный список"
Попытался построить двусвязный список. Как написать этот конструктор ? Может быть правильно будет...

1
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
10.10.2016, 23:19 2
Darya2512,
Зачем это делать?
C++
1
c=allo;//запомнили первый элемент списка
Когда есть
C++
1
list *begin;
Проще заполнять список так:
C++
1
2
3
4
//Сначала до заполнения обнуляете два указателя(на начало и конец) и приравниваете значения конца началу
list *begin = NULL, *end = NULL;
end = begin;
//Далее выделяете память каждый раз и при заполнении сдвигаете только конец *end
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2016, 23:19
Помогаю со студенческими работами здесь

Обработка пользовательского класса "Односвязный линейный список"
Доброго времени суток. Хочу написать программу для обработки односвязного линейного списка (ОЛС)...

Реализовать класс "Список"; реализовать добавление и удаление элементов
помогите написать код по спискам. надо создать линейный односвязный (двухсвязный) список. Из...

Удаление элемента из вектора пользовательского класса
Помогите, пожалуйста. Не могут понять, что я упускаю. При удалении элемента из вектора происходит...

Реализовать поиск в массиве объектов пользовательского типа (структура "Маршруты")
Здравствуйте, нужна помощь, нужно доработать код, но не совсем понимаю как Вот код (что именно...


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

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

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