Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/26: Рейтинг темы: голосов - 26, средняя оценка - 5.00
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767

Реализация дека через список

03.11.2010, 01:16. Показов 5577. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
надо реализовать дек через список.очевидно что список должен быть двунаправленным

а)как проверить является ли пустой голова/хвост?
делал так
C++
1
2
3
4
 
list *head;
......
if (head==null)
ругается на null

б)добавлять элементы надо так?
в голову
C++
1
2
3
4
5
list *spis=new list;
        spis->next=head;
        spis->prev=null;
        spis->val=x;
        head=spis;
C++
1
2
3
4
spis->next=null; 
    spis->val=x;
        spis->prev=ends; 
    ends=spis;
в)как извлекать(т.е. вывести и удалить)?

C++
1
2
3
4
5
while(ele->prev!=null)
    {
        cout<<ele->val<<" ";
        ele=ele->prev;
    }
так они просто выведутся(с конца) но в деке со[ранятся?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2010, 01:16
Ответы с готовыми решениями:

Считывание элементов дека с файла и запись дека в файл
Доброго времени суток. Я написал код программы про дек с ограниченным входом слева (то есть с него можно удалять элементы как с начала,...

Реализация стека через односвязный список
вот что я накалякал... должно по идее выводить первый элемент стека (ну лн в принципе пока тут и единственный), но вылетает либо 0 либо...

Реализация класса множество через двусвязный список.
дали задание реализовать класс множество через двусвязный список. Сам класс список мне реализовать вроде удалось, но стоит загвоздка в...

14
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.11.2010, 01:34
Artishok, NULL пишется. + В С++ лучше использовать просто 0.
1
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
03.11.2010, 19:17  [ТС]
хм.ясн

а остальное?

Добавлено через 17 часов 8 минут
help
0
 Аватар для Mayonez
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
03.11.2010, 19:27
лично я не знал что такое дек
вики ТУТ
0
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
03.11.2010, 19:49  [ТС]
Цитата Сообщение от Mayonez Посмотреть сообщение
лично я не знал что такое дек
вики ТУТ
я знаю что такое дек.я реализовывал его уже но через другую структуру.
проблема в другом
0
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
05.11.2010, 20:26  [ТС]
ну вот что получилось у меня
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
typedef struct list
{
    int val;
    list *next; //óêàçàòåëü íà ñëåäóþùèé ýëåìåíò
    list *prev; //óêàçàòåëü íà ïðåäûäóùèé ýëåìåíò
};
 
list *head=0,*tail=0; //ãëîáàëüíûå ïåðåìåííûå ãîëîâû è õâîñòà ñïèñêà
 
void insertfront(int x)
{
    list *spis=new list;
    spis->prev=0;//ïðè äîáàâëåíèè â íà÷àëî ïðåäûäóùåãî ýëåìåíòà íå ñóùåñòâóåò
    spis->val==x;
    if (head==0)
     spis->next=tail;
     else
     spis->next=head;
     head=spis;
}
 
void insertback(int x)
{
    list *spis=new list;
    spis->next=0;
    spis->val=x;
    if (tail==0)
      spis->prev=head;
      else
      spis->prev=tail;
      tail=spis;
}
 
void showfront()
{
  list *ele=new list;
  ele=head;
  while(ele!=0)
  {
   cout<<ele.val<<" ";
   ele=ele->next;
  }
}
 
void showback()
{
    list *ele=new list;
    ele=tail;
    while(ele!=0)
    {
    cout<<ele.val<<" ";
    ele=ele->next; 
    }
}
 
int main()
{
    for(int i=0;i<10;i++)
    insertfront(i);
    showfront();
}
не работает.в чем и где ошибки?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2010, 05:02
C++
1
2
3
4
5
6
7
8
9
10
11
void showback()
{
        //list *ele=new list; // не надо выделять память
 
        list *ele = tail;
        while(ele != 0) {
            cout << ele.val << " ";
            //ele=ele->next; // почему next ?
            ele=ele->prev;
        }
}
C++
1
2
3
4
5
6
void showback()
{
    for (list *ele = tail; ele; ele = ele->prev)
        cout << ele.val << " ";
    cout << endl;
}
1
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
06.11.2010, 13:54  [ТС]
в случае showback не выводит ничего.
подкорректировал наподобие showback showfront()-выводит адреса.
если ставить ele.val - ошибка.поэтому ставлю ele->val
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2010, 15:08
ele.val - это я не заметил

C++
1
spis->val==x;
=

у тебя как получается, если добавить несколько элементов справа, то ты не можешь применить showfront()
если добавить несколько элементов слева, то ты не можешь применить showback()

так что нужно переделать, на первый узел сразу устанавливай head и tail
0
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
06.11.2010, 15:27  [ТС]
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
#include <iostream.h>
 
//äåê ðåàëèçîâûâàåòñÿ â äàííîì ñëó÷àå ÷åðåç äâóíàïðàâëåííûé ñïèñîê
 
typedef struct deque
{
    int val;
    deque *prev;
    deque *next;
};
 
deque *head=0,*tail=0;
 
void insertnach(int x)
{ 
  deque *tmp=new deque;
  tmp->val=x;
  if (head==0)
  {
    head=tmp;
    tail=tmp;
  }
  else
  {
    head->prev=tmp;//ýëåìåíò ïåðåä ãîëîâîé íîâûé
    tmp->next=head;//ýëåìåíò íîâûé èäåò ïåðåä ñòàðûì
    head=tmp;//íîâàÿ ãîëîâà íîâûé ýëåìåíò
  }
}
 
void insertlast(int x)
{
    deque *tmp=new deque;//ñîçäàåì ýëåìåíò
    tmp->val=x;
    if (head==0)//åñëè ïóñòîé äåê
    {
        head=tmp;
        tail=tmp;
        
    }
    else
    {
        tail->next=tmp;//
        tmp->prev=tail;
        tail=tmp;
    }
}
 
void showfront()
{
    deque *el;
    el=head;
    while(el!=0)
    {
        cout<<el->val<<" ";
        el=el->next;
    }
}
 
void showback()
{
    deque *el;
    el=tail;
    while(el!=0)
    {
        cout<<el->val<<endl;
        el=el->prev;
    }
}
    
    
int main()
{
    for(int i=0;i<10;i++)
    insertnach(i);
    showfront();
}
тут не работает showback и криво insertnach
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2010, 15:37
C++
1
2
3
4
5
6
typedef struct deque
{
        int val;
        deque *prev;
        deque *next;
};
это что

C++
1
2
3
4
5
struct deque
{
    int val;
    deque *prev, *next;
};
в insertlast нужно if (tail == 0)
1
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
06.11.2010, 17:30  [ТС]
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
#include <iostream.h>
 
//äåê ðåàëèçîâûâàåòñÿ â äàííîì ñëó÷àå ÷åðåç äâóíàïðàâëåííûé ñïèñîê
 
typedef struct deque
{
    int val;
    deque *prev,*next;
};
 
deque *head=0,*tail=0;
 
void insertnach(int x)
{ 
  deque *tmp1=new deque;//ñîçäàåì íîâûé ýëåìåíò
  tmp1->val=x;//â ïîëå äàííûõ âïèñûâàåì çíà÷åíèå
  if (head==0)
  {
    head=tmp1;//åäèíñòâåííûé ýëåìåíò ïîêà è íà÷àëî
    tail=tmp1;//è õâîñò
  }
  else
  {
    head->prev=tmp1;//ýëåìåíò ïåðåä ãîëîâîé íîâûé
    tmp1->next=head;//ýëåìåíò íîâûé èäåò ïåðåä ñòàðûì
    head=tmp1;//íîâàÿ ãîëîâà íîâûé ýëåìåíò
    head->prev=0;
  }
}
 
void insertlast(int x)
{
    deque *tmp=new deque;//ñîçäàåì ýëåìåíò
    tmp->val=x;
    if (tail==0)//åñëè ïóñòîé äåê
    {
        head=tmp;
        tail=tmp;
        
    }
    else
    {
        tail->next=tmp;//ñëåäóþùèé ýëåìåíò çà  õâîñòîì íîâûé
        tmp->prev=tail;//äëÿ íîâîãî ýëåìåíòà ïðåäûäóùèé - õâîñò
        tail=tmp;//õâîñò íîâûé ýëåìåíò
        tail->next=0;
    }
}
 
void showfront()
{
    deque *el;
    el=head;
    while(el!=tail->next)
    {
        cout<<el->val<<" ";
        el=el->next;
    }
}
 
void showback()
{
    deque *el1;
    el1=tail;
    while(el1!=head->prev)
    {
        cout<<el1->val<<" ";
        el1=el1->prev;
    }
}
 
void clean()
{
    deque *del;
    while(head!=0)
    {
      del=head;
      head=head->next;
      delete del;
    }
}
    
    
int main()
{
    for(int i=0;i<10;i++)
    insertnach(i);
    showfront();
}
Теперь похоже работает

Добавлено через 10 минут
правда я так и не понял почему цикл идет до head->prev(или tail->next)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2010, 03:57
это у тебя идёт до head->prev

я тебе функцию писал, там только el.val неправильно
https://www.cyberforum.ru/post1087500.html

хотя у тебя тоже сработает, останавливаться будет на head->prev
0
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
07.11.2010, 14:32  [ТС]
Теоретически записи эквивалентны т.к head->prev==0 и tail->next==0
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2010, 14:52
юзай свой вариант, так как у тебя как раз обнуление и нужно, чтобы по нему определять концы
код пояснее получается
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2010, 14:52
Помогаю со студенческими работами здесь

Организация дека через New и Delete
Уважаемы форумчане, помогите с написанием программы. Необходимо написать программу которая организует работу с деком (добавление...

Преимущества и недостатки при реализации стека, очереди и дека через дин. массива
Доброго времени суток! 1) Назовите преимущества и недостатки реализации очереди с помощью динамического массива. 2) Назовите...

Функции посчитывающие количество вхождений подстроки в строку, реализация через char* и через шаблон
Необходимо реализовать две функции: 1) int SubStrCount(const char *str, const char *subStr); 2) template&lt;typename T&gt;...

Односвязный список, реализация
Добрый вечер! :) Пытаюсь разобраться как работают списки. Делаю последовательный односвязный список, в который можно добавить элемент,...

Реализация класса «двусвязный список»
потребовалось выполнить такое задание, вот только не могу сообразить с чего начать и как собственно будет выглядеть код (в связи с тем, что...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru