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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.60
utwo
3 / 3 / 0
Регистрация: 10.10.2009
Сообщений: 108
#1

Односвязный список - C++

11.12.2009, 11:50. Просмотров 1986. Ответов 22
Метки нет (Все метки)

Всем привет,

Дaн oднocвязный cпиcoк, элeмeнт этoгo cпиcка coдержит маccив из 10 цeлых пeрeмeнных. Эти пeрeмeнные нужнo xранит в пoрядке вoзраcтания. Такжe маccив можeт быть запoлнен нe пoлнocтью.

Функция дoлжна включaть значeниe в элeмeнт этoгo cпиcка, нo c coхранением упoрядoченнocти. Eсли маccив пeрeпoлнитьcя, тo нужнo будет coздать нoвый элeмeнт cпиcка и в негo уже включить пoлoвину значeний из перепoлненнoгo.

С чего начать и в какую сторону копать?
Спасибо за любой ответ!

//C++
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2009, 11:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Односвязный список (C++):

Сформировать список из 10 книг, используя динамическую структуру данных односвязный список - C++
друзья спасайте Сформировать список из 10 книг, используя динамическую структуру данных односвязный список С++

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов - C++
Задание: создайте двусвязный список групп факультета. Каждая группа представляет собой односвязный список студентов. Помогите пожалуйста,...

Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке - C++
Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке.

Односвязный список - C++
Здравствуйте! Кто может разъяснить как вставить в узел заданного места значение.. 1. Нужно выделить память Elem *Ins = new Elem ...

Односвязный список - C++
Во общем, программа создает список и заносит туда элементы с помощью массива. Но при выводе, программа выводит лишний элемент первым. Где...

Односвязный список - C++
"Односвязный список 2.exe" (Win32). Загружено "C:\Users\Владислав\Documents\Visual Studio 2012\Projects\Односвязный список...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
utwo
3 / 3 / 0
Регистрация: 10.10.2009
Сообщений: 108
13.12.2009, 20:36  [ТС] #16
В принципе пока никаких изменений не вносилось. Тот же код что был указан выше, плюс исправление на счет сортировки.
Вот.
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
#include <iostream>
 
struct nodes
{
        
        void sort();
        void push(int value);
        void pop(int* value);
        void show();
        bool is_full();
        
        int* array;
        nodes* prior;
        
        nodes(){array = new int [10];top = 0;}
        ~nodes(){delete[] array;}
        int top; // показывает на первое свободное место
};
//============================================================
struct linked_lists
{
 
                void show(); // для контроля
                void add(int value);
                                
                linked_lists(){tail = NULL;}
                ~linked_lists();
                nodes* tail;            
};
 
//============================================================
int main()
{
        linked_lists a;
        
        a.show();
        system("pause");
        for(int i=0;i<15;i++) 
        {
                a.add(-i*i+10*i);
                a.show();
                system("pause");
        }
        system("cls");
        
        
        a.show();       
    system("pause");
   delete &a;
    system("pause");
        return 0;
}
 
//============================================================
void nodes::push(int value)
{
        if (top>9) return; // на всякий случай.
        array[top++]=value;
}
 
void nodes::pop(int* out)
{
        if (!top) return; // на всякий случай.
        
        *out = array[--top];
}
 
void nodes::show()//для контроля
{
        for(int i=0;i<top;i++) std::cout<<"  "<<array[i];
}
 
void nodes::sort()                                      //вставками.
{ 
        int tmp, i, j;
        for ( i=0; i < top; i++)
        {  
            tmp = array[i];   
        for ( j=i-1; j>=0 && array[j] > tmp; j--)
                array[j+1] = array[j];
        array[j+1] = tmp;
        }
}
bool nodes::is_full()
{
        return (top==10);
}
 
 
// =====================================================================
void linked_lists::add(int value)
{
        if (tail==NULL) { tail = new nodes(); tail->prior=NULL;}
        //если список пуст, создаём узел.
 
        if(!tail->is_full())// если узел не полнoн, то засовываем туда value
        {
                tail->push(value);
                tail->sort();
        }
        else 
        //если узел полон, создаем новый, перекидываем в него пять последних элементов
        {
                nodes* node = new nodes();
                node->prior = tail;//связали со списком.
                
                int tmp;
                for(int i=1;i<=5;i++)
                {
                        tail->pop(&tmp);
                        node->push(tmp);
                }
                // 5 элемент сравнивается с value. больший отпавляется в новый узел.
                // меньший остается.
                tail->pop(&tmp);
                if(value<tmp) {tail->push(value);node->push(tmp);}
                else {tail->push(tmp);node->push(value);}
                
                // осталось только переопределить указатель на хвост
                
                tail = node;
 
                tail->sort();
                tail->prior->sort();;
                
        }
        
}
 
 
void linked_lists::show()
{
        if(tail==NULL) {std::cout<<"\n linked-list is empty now..\n\n";return;}
        nodes* ip = tail;
        while (true)
        {
                std::cout<<ip;
                ip->show();
                std::cout<<"\n";
                if(ip->prior==NULL)     break;
                ip=ip->prior;
        }
 
}
 
linked_lists::~linked_lists()
{
        if(tail==NULL) {std::cout<<"\nmemory is free!!\n";return;}
        
        nodes* ip = tail;
        while (ip->prior!=NULL)
        {
                tail = ip;
                ip=ip->prior;
                delete tail;
        }
        delete ip;
        std::cout<<"\n memory is free!!!";      
        }
 
 
//======================================================================


Открытым остался вопрос по поводу системных ошибках при компиляции.
Ошибки пропали после комментирования оператора удаленияdelete &a. Но на сколько это правильно?
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.12.2009, 20:56 #17
возможно я неправ, вы пробывали писать delete &a без знака "&"?
0
utwo
3 / 3 / 0
Регистрация: 10.10.2009
Сообщений: 108
14.12.2009, 06:42  [ТС] #18
Цитата Сообщение от outoftime Посмотреть сообщение
возможно я неправ, вы пробывали писать delete &a без знака "&"?
error C2440: delete: невозможно преобразовать 'list' в 'void *'
0
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
14.12.2009, 12:34 #19
проблему нужно искать либо на уровне vs либо ОС (например, будет ли такая- же ошибка выпадать, если DEP отключить?).
Имеет смысл зайти к товарищу с VSС++ и попробывать скомпилировать у него.
1
utwo
3 / 3 / 0
Регистрация: 10.10.2009
Сообщений: 108
17.12.2009, 08:01  [ТС] #20
Ошибка похоже действительно на уровне VSС++ и OS.


Теперь если немного усложнить задачку
Надo, чтoбы элeмeнты включалиcь в списoк упoрядoченнo.

Напримeр:
Былo всeгo 2 элeмeнта списка с 7ми числами:
-1 3 5 7
-23 24 30

Вставляeм цифру 6 - сталo 3 элeмeнта списка:
-1 3
-5 6 7
-23 24 30

Тeпeрь вставляeм цифру 10 - сталo 3 элeмeнта списка:
-1 3
-5 6 7 10
-23 24 30
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
17.12.2009, 12:16 #21
Vladimir., utwo, первый признак ламерства - сваливание всех проблем на ОС и IDE. Если вы здесь пишете и обсуждаете что-либо отличное от a + b, то тогда не надо скатываться до такого уровня.

utwo, перепиши
так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    linked_lists *a = new linked_lists();
 
    a->show();
    system("pause");
    for(int i=0;i<15;i++) 
    {
        a->add(-i*i+10*i);
        a->show();
        system("pause");
    }
    system("cls");
    a->show();       
    system("pause");
    delete a;
    system("pause");
    return 0;
}
1
utwo
3 / 3 / 0
Регистрация: 10.10.2009
Сообщений: 108
18.12.2009, 12:56  [ТС] #22
Цитата Сообщение от M128K145 Посмотреть сообщение
Vladimir., utwo, первый признак ламерства - сваливание всех проблем на ОС и IDE. Если вы здесь пишете и обсуждаете что-либо отличное от a + b, то тогда не надо скатываться до такого уровня.
...
По поводу ошибок - не судите нас строго

Сейчас очень актуальная задача:
Теперь если немного усложнить задачку
Надo, чтoбы элeмeнты включалиcь в списoк упoрядoченнo.

Напримeр:
Былo всeгo 2 элeмeнта списка с 7ми числами:
-1 3 5 7
-23 24 30

Вставляeм цифру 6 - сталo 3 элeмeнта списка:
-1 3
-5 6 7
-23 24 30

Тeпeрь вставляeм цифру 10 - сталo 3 элeмeнта списка:
-1 3
-5 6 7 10
-23 24 30
Добавлено через 23 часа 37 минут
Цитата Сообщение от Vladimir. Посмотреть сообщение
Всё верно, там вообще сортировка не выполнялась...
Строка 121:
C++
1
tail = node;
Сделать так:
C++
1
2
3
tail = node;
tail->sort();
tail->prior->sort();
насчёт "лечения" ничего подсказать не могу..
Сортировка в данный момент работает только в последнем элементе.
Т.е. получается весь список в конечном счете выглядит не отсортированным.

Где нужно подправить чтоб список выглядел как упорядоченная последовательность.
Каждый новое число нужно вставлять в необходимый элемент списка с учетом общей сортировки списка.

Напримeр:
Былo всeгo 2 элeмeнта списка с 7ми числами:
- 1 3 5 7
- 23 24 30

Вставляeм цифру 6 - сталo 3 элeмeнта списка:
- 1 3
- 5 6 7
- 23 24 30

Тeпeрь вставляeм цифру 10 - сталo 3 элeмeнта списка:
- 1 3
- 5 6 7 10
- 23 24 30
0
utwo
3 / 3 / 0
Регистрация: 10.10.2009
Сообщений: 108
20.12.2009, 20:02  [ТС] #23
Цитата Сообщение от M128K145 Посмотреть сообщение
Vladimir., utwo, первый признак ламерства - сваливание всех проблем на ОС и IDE. Если вы здесь пишете и обсуждаете что-либо отличное от a + b, то тогда не надо скатываться до такого уровня.

utwo, перепиши
так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    linked_lists *a = new linked_lists();
 
    a->show();
    system("pause");
    for(int i=0;i<15;i++) 
    {
        a->add(-i*i+10*i);
        a->show();
        system("pause");
    }
    system("cls");
    a->show();       
    system("pause");
    delete a;
    system("pause");
    return 0;
}
Помогло. Полечили, даже без тестов с ОС и IDE
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2009, 20:02
Привет! Вот еще темы с ответами:

Односвязный список - C++
Дан список целых чисел , удалить все положительные. struct my_list{ int num; struct my_list*Next; } int x; my_list...

Односвязный список - C++
Посмотрите программу, правильно ли я вывожу список? Почему список выводится только из 7 цифр, и как можно написать с помощью функций?...

Односвязный список - C++
Здравствуйте уважаемые форумчане. Помогите пожалуйста с задачкой: В памяти хранится односвязный список. Вам дан указатель на первый...

Односвязный список C++ - C++
помогите решить проблему с выводом суммы, буду благодарен #include &lt;iostream&gt; #include &lt;cctype&gt; using namespace std; struct...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.12.2009, 20:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru