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

Ошибка в двусвязном списке - C++

Восстановить пароль Регистрация
 
zepterman
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 27
22.03.2013, 16:06     Ошибка в двусвязном списке #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
struct Elem
{
    int data; // просто данные
    int pri; // приоритет
    Elem * next, * prev;
};
 
class List
{
    // Голова, хвост
    Elem * Head, * Tail;
    // Количество элементов
    int Count;
 
// Получить количество
    int GetCount();
// Конструктор
    List();
// Вставка элемента
void Insert(int data, int pri);
}
 
 
int List::GetCount()
{
    return Count;
}
 
List::List()
{
    // Изначально список пуст
    Head = Tail = NULL;
    Count = 0;
}
 
void List::Insert(int data, int pri)
{
    if (Count==0)
    {
        cout<<"\ncase 1\n";
        // новый элемент
        Elem * temp = new Elem;
 
        // Предыдущего нет
        temp->prev = 0;
        // Заполняем данные
        temp->data = data;
        temp->pri=pri;
        temp->next = NULL;
        Head = Tail = temp;
        Count++;
 
    } 
    else
    {
        Elem * Ins = Head;
 
        if (pri>Ins->pri)
        {
 
            cout<<"\ncase 2\n";
            // новый элемент
            Elem * temp = new Elem;
 
            // Предыдущего нет
            temp->prev = 0;
            // Заполняем данные
            temp->data = data;
            temp->pri=pri;
            // Следующий - бывшая голова
            temp->next = Head;
 
            // Если элементы есть?
            if(Head != 0)
                Head->prev = temp;
 
            // Если элемент первый, то он одновременно и голова и хвост
            if(Count == 0)
                Head = Tail = temp;
            else
                // иначе новый элемент - головной
                Head = temp;
 
            Count++;
 
        }
        else{
            cout<<"\ncase 3\n";
            int i=0;
            for (;Ins->pri>pri && i<Count;i++)
            {
                Ins->next;
            }
        cout<<"i= "<<i<<" ";
        
        Elem * temp = new Elem;
        temp->data = data;
        temp->pri=pri;
        temp->next=Ins->next;
        temp->prev=Ins;
        Ins->next=temp;
        if (temp->next!=NULL)
        {
            temp->next->prev=temp;
        }
        Count++;
        }
    }
    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 16:06     Ошибка в двусвязном списке
Посмотрите здесь:

Ошибка в списке C++
C++ Поиск элемента в двусвязном списке
C++ как работает вставка в двусвязном списке?
C++ Использование итератора в двусвязном списке
C++ Нахождение элемента в двусвязном списке
C++ что я делаю не так? в двусвязном списке?
Ошибка в односвязном списке C++
Поиск элемента в двусвязном списке C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
23.03.2013, 00:14     Ошибка в двусвязном списке #2
zepterman, вот посмотрите, я не совсем разобрался в той части кода что вы предоставили, я сделал очередь с тремя видами приоритета

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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <locale>
using namespace std;
 
struct Queue
{
    int data;
    int prioritet;              //1,2,3 
    Queue *next, *pred;
};
 
class QueueNode
{
    private:
        Queue *Head, *Tail;
 
    public:
        QueueNode()
        {
            Head = Tail = NULL;
        }
 
        void add(const int value, const int _prior)             
        {                                                   
            Queue *Ptr = new Queue;
            Ptr -> data = value;
            Ptr -> prioritet = _prior;
 
            if(Head == NULL)
            {
                Head = Tail = Ptr;
                Ptr -> pred = NULL;
                Ptr -> next = NULL;
            }
            else
            {
                Queue *tmp = Tail;
                Queue *cur = NULL;
 
                if(Head != Tail)
                {
                    while((tmp != NULL) && (Ptr -> prioritet > tmp -> prioritet))
                    {
                        cur = tmp;
                        tmp = tmp -> pred;
                    }
 
                    if(tmp == NULL)
                    {
                        Ptr -> next = Head;
                        Ptr -> pred = NULL;
                        Head -> pred = Ptr;
                        Head = Ptr;
                    }
                    else
                    {
                        tmp -> next = Ptr;
                        Ptr -> pred = tmp;
                        Ptr -> next = cur;
                    }
                }
                else
                {
                    if(Head -> prioritet < Ptr -> prioritet)
                    {
                        Head -> pred = Ptr;
                        Ptr -> next = Head;
                        Ptr -> pred = NULL;
                        Head = Ptr;
                    }
                    else
                    {
                        Tail -> next = Ptr;
                        Ptr -> pred = Head;
                        Ptr -> next = NULL;
                        Tail = Ptr;
                    }
                }
            }
        }
 
        void delQueue()
        {
            Queue *tmp = Head;
            Queue *cur = NULL;
 
            if(Head != NULL)
            {
                cur = Head -> next;
                cur -> pred = NULL;
                delete Head;
                Head = cur;
            }
        }
 
        void showQueue()
        {
            Queue *temp = Head;
 
            if(Head != NULL)
            {
                while(temp != NULL)
                {
                    cout << temp -> data << " ";
                    temp = temp -> next;
                }
            }
            else
                wcout << L"Очередь пуст!\n";
        }
};
 
void instructions();
void menu();
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    menu();
 
    cout << "\n\n";
    return 0;
}
 
void instructions()
{
    wcout << L"Выберите пункт меню: " <<
        L"\n1 - Добавить элемент" <<
        L"\n2 - удалить элемент" <<
        L"\n3 - Выход.\n";
}
 
void menu()
{
    QueueNode Universal;
    int punkt_menu, value, prior;
 
    instructions();
 
 
    do{
        wcout << L"\n? ";
            cin >> punkt_menu;
 
            switch(punkt_menu)
            {
                case 1:
                    wcout << L"Введите число: ";
                        cin >> value;
                    wcout << L"Введите приоритет(1-3): ";
                        cin >> prior;
 
                    Universal.add(value, prior);
                    Universal.showQueue();
                    break;
                case 2:
                    Universal.delQueue();
                    Universal.showQueue();
                    break;
 
            }
 
    }while(punkt_menu != 3);
}
Yandex
Объявления
23.03.2013, 00:14     Ошибка в двусвязном списке
Ответ Создать тему
Опции темы

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