Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631

Как создать динамический список используя классы?

24.09.2012, 07:21. Показов 5972. Ответов 18
Метки нет (Все метки)

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

Файл Program.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication2
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Файл Form1.cs:
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace pro
{
    public partial class Form1 : Form
    {
        System.Windows.Forms.Button[] btns = new System.Windows.Forms.Button[256];
        System.Windows.Forms.Button act_btn;    // активная кнопка элемента списка
        Elem el;                        // первый элемент списка
        List lst = new List(null);      // список
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
        // графически отобразить список
        void GraphList(List xList)
        {
            int i=0;
            while (Pnl.Controls.Count>0)
            {
                Pnl.Controls.Clear();
            }
 
            if (xList.First == null) return;
 
            Elem xEl = xList.First; i = 0;
            while (xEl!=null)
            {
                btns[i] = new System.Windows.Forms.Button();
 
                btns[i].Location = new System.Drawing.Point(20+(i%10)*30, 20+30*(i/10));
                btns[i].Size = new System.Drawing.Size(20, 25);
                btns[i].Text = "" + xEl.Value;
                btns[i].ContextMenuStrip = BtnPopMenu;
                btns[i].Tag = xEl;
                btns[i].MouseDown += button1_MouseDown;
                btns[i].Click += button2_Click;
                btns[i].Visible = true;
 
                Pnl.Controls.Add(btns[i]);
 
                xEl = xEl.next;
                i++;
            }
 
        }
 
        private void создатьСписокToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            el = new Elem('x');
            lst = new List(el);
            GraphList(lst);
        }
 
        private void изменитьЗначениеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Elem xEl = (act_btn.Tag as Elem);
            System.Windows.Forms.TextBox tb = new System.Windows.Forms.TextBox();
 
            tb.Location = new System.Drawing.Point(act_btn.Location.X, act_btn.Location.Y);
            tb.Size = new System.Drawing.Size(act_btn.Size.Width, act_btn.Size.Height);
            tb.Text = act_btn.Text;
 
            tb.Tag = xEl;
            tb.Leave += textBox1_Leave;
            tb.Visible = true;
 
            Pnl.Controls.Add(tb);
            tb.BringToFront();
        }
 
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            act_btn = (sender as Button);
 
        }
 
        private void добавитьЭлементСледомToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Elem xEl = (act_btn.Tag as Elem);
            xEl.AddNext('x');
            GraphList(lst);
        }
 
        private void textBox1_Leave(object sender, EventArgs e)
        {
            TextBox tb = (sender as TextBox);
            Elem xElem = (tb.Tag as Elem);
            xElem.Value = tb.Text[0];
            Pnl.Controls.Remove(tb);
            GraphList(lst);
        }
 
        private void добавитьЭлементСпередиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Elem xEl = (act_btn.Tag as Elem);
            Elem xEl2 = xEl.AddPrev('x');
            if (lst.First == xEl) lst.First = xEl2;
            GraphList(lst);
        }
 
        private void удалитьЭлементToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Elem xEl = (act_btn.Tag as Elem);
            xEl.Del();
            if (lst.First == xEl) lst.First = xEl.next;
            GraphList(lst);
        }
 
        private void Pnl_Click(object sender, EventArgs e)
        {
            GraphList(lst);
        }
 
        private void btn_Exit_Click(object sender, EventArgs e)
        {
            this.Close();
            Application.Exit();
        }
 
        private void поискЭлементаToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (tb_Val.Text.Length == 0)
            {
                MessageBox.Show("Введите символ для поиска");
                return;
            }
 
            Button btn;
            Elem xElem = lst.FindElem(tb_Val.Text[0]);
            if (xElem!=null)
            {
                int i=0;
                while (i < Pnl.Controls.Count)
                {
                    if (Pnl.Controls[i] is Button)
                    {
                        btn = (Pnl.Controls[i] as Button);
                        if (btn.Tag == xElem)
                        {
                            btn.BackColor = Color.Lime;
                            break;
                        }
                    }
                    i++;
                }
            }
 
        }
 
        private void btn_Find_Click(object sender, EventArgs e)
        {
            поискЭлементаToolStripMenuItem_Click(sender, e);
        }
 
        private void поменятьМестамиСоСледующимToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Elem xEl = (act_btn.Tag as Elem);
            Elem xEl2 = xEl.ChangeNext();
            if (lst.First == xEl) lst.First = xEl2;
            GraphList(lst);
        }
 
        private void удалитьСписокToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lst.DelList();
            GraphList(lst);
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (rb1.Checked) lst.SortAsc();
            if (rb2.Checked) lst.SortDesc();
            GraphList(lst);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            изменитьЗначениеToolStripMenuItem_Click(sender, e);
        }
    }
}
 
 
public class Elem
{
    public char Value;
    public Elem prev;
    public Elem next;
    public Elem(char xValue)
    {
        Value = xValue;
    }
 
    // добавить элемент со значением xValue
    Elem Add(char xValue)
    {
        return new Elem(xValue);
    }
 
    // добавить предыдущий элемент со значением xValue
    public Elem AddPrev(char xValue)
    {
        Elem xElem = new Elem(xValue);
        if (prev != null)
        {
            prev.next = xElem;
            xElem.prev = prev;
        }
        prev = xElem;
        xElem.next = this;
 
        return xElem;
    }
 
    // добавить следующий элемент со значением xValue
    public Elem AddNext(char xValue)
    {
        Elem xElem = new Elem(xValue);
        if (next != null)
        {
            next.prev = xElem;
            xElem.next = next;
        }
        next = xElem;
        xElem.prev = this;
 
        return xElem;
    }
 
 
    // удалить следующий элемент
    public void DelNext()
    {
        if (next != null)
        {
            next = next.next;
            next.prev = this;
        }
    }
 
    // удалить предыдущий элемент
    public void DelPrev()
    {
        if (prev != null)
        {
            prev = prev.prev;
            prev.next = this;
        }
    }
 
    // удалить элемент
    public void Del()
    {
        if (prev != null)
        {
            prev.next = next;
        }
 
        if (next != null)
        {
            next.prev = prev;
        }
    }
 
 
    // поменять местами со следующим элементом
    public Elem ChangeNext()
    {
        Elem t0 = prev;
        Elem t1 = this;
        Elem t2 = next;
 
        if (t1 == null) return null;
        if (t2 == null) return t2;
 
        if (t0 != null) t0.next = t2;
 
        if (t1 != null)
        {
            t1.prev = t2;
            if (t2 == null) t1.next = null; else t1.next = t2.next;
        }
        if (t2 != null)
        {
            t2.prev = t0;
            t2.next = t1;
        }
        return t2;
    }
}
 
 
public class List
{
    public Elem First;  // первый элемент списка
    public Elem Last;   // последний элемент списка
    public int cnt;            // кол-во элементов списка
    public bool ring;          // true, если список кольцевой
 
    public List(Elem xElem)
    {
        if (xElem == null) return;
 
        First = xElem;
        Last = GetLastElem();
    }
 
    // возвращает последний элемент списка
    Elem GetLastElem()
    {
        ring = false;
        Elem e = First.next;
        Elem t = e; cnt = 1;
        while (e != null)
        {
            cnt++;
            t = e;
            e = e.next;
            if (e == First)     // если пришли к первому элементу списка (кольцевой), 
            {
                ring = true;
                return e;       // то прервать
            }
        }
        return t;
    }
 
    // ищет элемент по значению
    public Elem FindElem(char xValue)
    {
        ring = false;
        Elem e = First;
        Elem t = null;
        if (e == null) return t;
        if (e.Value == xValue) return e;
 
        e = e.next;
        while (e != null)
        {
            if (e.Value == xValue) t = e; 
 
            if (e == First)     // если пришли к первому элементу списка (кольцевой), 
            {
                return t;       // то прервать
            }
            e = e.next;
        }
        return t;
    }
 
 
    // сортировка по возрастанию
    public void SortAsc()
    {
        ring = false;
        Elem e, t, x2;
        Elem x = First;
 
        while (x != null)
        {
            x = null;
            e = First;
            t = e.next;
 
            while ((e != null) && (t != null))
            {
                x2 = null;
                if (e.Value > t.Value)
                {
                    x = e.ChangeNext();
                    x2 = x;
                    if (First == e) First = x;
                }
 
                if (x2 != null) e = x2;
                e = e.next;
                if (e == null) t = null; else t = e.next;
            }
 
        }
    }
 
 
    // сортировка по убыванию
    public void SortDesc()
    {
        ring = false;
        Elem e, t, x2;
        Elem x = First;
 
        while (x != null)
        {
            x = null;
            e = First;
            t = e.next;
 
            while ((e != null) && (t != null))
            {
                x2 = null;
                if (e.Value < t.Value)
                {
                    x = e.ChangeNext();
                    x2 = x;
                    if (First == e) First = x;
                }
 
                if (x2 != null) e = x2;
                e = e.next;
                if (e == null) t = null; else t = e.next;
            }
 
        }
    }
 
 
 
 
 
    // удаление списка
    public void DelList()
    {
        First = null;
    }
}
Добавлено через 13 часов 35 минут
хелп ми
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2012, 07:21
Ответы с готовыми решениями:

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.)
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы...

Создать динамический класс Book, содержащий динамический массив Authors
Мне нужно написать программу,а я не знаю как ее написать. Знаю, тут люди за кого-то не делают,...

Создать динамический класс Book, содержащей динамический массив Authors
всем привет. может кто-то набросать код для такой вот задачи: Создать динамический класс Book,...

18
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
24.09.2012, 19:24
Можете полистать pdf во вложение.
Посмотреть так же на вики

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
struct Value
{
        public:int data;
        Value* Next;
        Value(int d):Next(0),data(d){}
        ~Value(){data=0;}
};
 
class Stack
{
        Value* Head;
        public:void Add(int d);
        public:void Delete();
        public:void Print();
        public:Stack(){Head=NULL;}
};
 
void Stack::Add(int d)
{
        Value* newHead=new Value(d);    
        newHead->Next=Head;
        Head=newHead;
}
 
void Stack::Delete()
{
        Value *p;
        p=Head->Next;
        delete Head;
        Head=p;
}
 
 
void Stack::Print()
{
        Value *p=Head;
        while(p!=NULL)
        {
                cout<<p->data<<"  ";
                p=p->Next;
        }
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
        Stack elements;
 
        elements.Add(10);
        elements.Add(1);
        elements.Add(3);
        elements.Add(7);
        elements.Add(9);
        elements.Add(4);
 
        elements.Delete();
        elements.Delete();
 
        elements.Print();
 
        system("pause");
        return 0;
}
Вложения
Тип файла: pdf ЯП_Си_Лаб_07.pdf (238.5 Кб, 93 просмотров)
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
25.09.2012, 04:45  [ТС]
за лабу спасибо вот только сразу появился вопрос по лабе
C++
1
2
3
4
struct Element{ // структура, задающая элемент списка
int data; // поле для хранения данных
Element *next; // указатель на следующий элемент
} *start, *p; //определяем глобальные указатели на начало списка и текущий элемент
start и p это указатели на что? тут правильно написанно в лабораторной?
Может должно было быть так
Element *next, *start, *p; подскажите пожалуйста
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
25.09.2012, 08:14
Цитата Сообщение от lexflax Посмотреть сообщение
тут правильно написанно в лабораторной?
абсолютно.
Цитата Сообщение от lexflax Посмотреть сообщение
Может должно было быть так
Element *next, *start, *p;
нет.
можно было
C++
1
2
3
4
5
struct Element{ // структура, задающая элемент списка
int data; // поле для хранения данных
Element *next; // указатель на следующий элемент
};
Element *start, *p; //определяем глобальные указатели на начало списка и текущий элемент
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
26.09.2012, 07:03  [ТС]
взял кусочек из лабораторной работы небольшой заменил в нем тип int на тип char
исходный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
struct Element{ // структура, задающая элемент списка
int data; // поле для хранения данных
Element *next; // указатель на следующий элемент
} *start, *p; //определяем глобальные указатели на начало списка и текущий элемент
void create_list(int a){
p = new Element;
p->data = a;
p->next = NULL;
start = p;
return;
}
int main(){
int a;
printf("Введите значение для первого элемента, создаваемого списка: ");
scanf("%i",&a);
create_list(a);
printf("Список создан, единственный элемент: %i \n",start->data);
return 0;
}
вот такой получился переделанный я просто хотел чтоб любую информацию можно было ввести в список а не только числа.
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
#include <vcl.h>
#pragma hdrstop
#include <stdlib.h>
#include <tchar.h>
#include <iostream>
//---------------------------------------------------------------------------
 
#include<stdio.h>
using namespace std;
struct Element{ // структура, задающая элемент списка
char data; // поле для хранения данных
Element *next; // указатель на следующий элемент
} *start, *p; //определяем глобальные указатели на начало списка и текущий элемент
void create_list(char a){
p = new Element;
p->data = a;
p->next = NULL;
start = p;
return;
}
int main(){
char a[20];
printf("vvedide znachenie dla pervogo elementa, sozdavaemogo spiska: ");
cin>>a;
create_list(a[20]);
cout<<"spisok sozdan, edinstvennii element:"<<a;
system ("pause");
return 0;
}
заинтересовала строка из первого примера
C++
1
start->data-я так понял она обращается к элементу и выводит его?
в символьном варианте моем она не выводит то что я ввожу в список, выводит лабуду какую то, если ставлю вывести переменную а тогда все нормально, но я так понимаю просто вывести переменную это не правильно должно быть обращение именно к списку... не могу вот тут разобраться...
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
26.09.2012, 07:28
в структуре определено
C++
1
char data; // поле для хранения данных
это один символ.
а потом впихнуть пытаетесь туда все 20, отсюда и лабуда.
хотя если быть точнее, пытаетесь втолкнуть 20-й символ массива, которого по сути даже если ввести 20 символов не будет, т.к. 20-й элемент массива имеет индекс 19, т.к. нумерация идет с нуля.
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
27.09.2012, 04:50  [ТС]
ну тогда как должен выглядеть символьный список чтоб не цифры можно было только вводить а слова, фразы
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
27.09.2012, 16:33
Цитата Сообщение от lexflax Посмотреть сообщение
ну тогда как должен выглядеть символьный список чтоб не цифры можно было только вводить а слова, фразы
Довольно много вариантов.
C++
1
2
3
char str[50]; //массив символов, для работы с ним используем специальные функции
string str; //класс для хранения и обработки строк из STL
AnsiString str; //еще один посложней
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
27.09.2012, 17:54  [ТС]
ну вот в таком виде попытался написать выдает ошибку
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
#include <vcl.h>
#pragma hdrstop
#include <stdlib.h>
#include <io.h>
#include <tchar.h>
#include <iostream>
//---------------------------------------------------------------------------
 
#include<stdio.h>
using namespace std;
struct Element{ // структура, задающая элемент списка
String data; // поле для хранения данных
Element *next; // указатель на следующий элемент
} *start, *p; //определяем глобальные указатели на начало списка и текущий элемент
void create_list(a){
p = new Element;
p->data = a;
p->next = NULL;
start = p;
return;
}
int main(){
String a;
printf("vvedide znachenie dla pervogo elementa, sozdavaemogo spiska: ");
cin>>a;
create_list(a);
cout<<"spisok sozdan, edistvennii element:"<<start->data;
system ("pause");
return 0;
}
первая ошибка в строке
C++
1
cin>>a;
-[BCC32 Error] File5.cpp(27): E2094 'operator>>' not implemented in type 'istream' for arguments of type 'UnicodeString'
вторая ошибка в строке под предыдущей
C++
1
create_list(a);
-[BCC32 Warning] File5.cpp(28): W8065 Call to function 'create_list()' with no prototype
и третья ошибка в строке
C++
1
cout<<"spisok sozdan, edinstvennii element:"<<start->data;
-[BCC32 Error] File5.cpp(29): E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'UnicodeString'
что не так написанно у меня не пойму...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
27.09.2012, 18:55
Цитата Сообщение от lexflax Посмотреть сообщение
что не так написанно у меня не пойму...
E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'UnicodeString' - оператор << потока ostream не определен для аргументов типа UnicodeString. Не съест он его, не запихивай.
Просто используй тип string.
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
28.09.2012, 07:17  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
UnicodeString. Не съест он его, не запихивай.
Просто используй тип string.
кого не съест? я вроде и так использую String.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using namespace std;
struct Element{ // структура, задающая элемент списка
String data; // поле для хранения данных
Element *next; // указатель на следующий элемент
} *start, *p; //определяем глобальные указатели на начало списка и текущий элемент
void create_list(a){
p = new Element;
p->data = a;
p->next = NULL;
start = p;
return;
}
main(){
char a[50];
printf("vvedide znachenie dla pervogo elementa, sozdavaemogo spiska: ");
cin>>a;
create_list(a);
cout<<"spisok sozdan, edinstvennii element:"<<start->data;
system ("pause");
return 0;
}
Добавлено через 10 минут
ну или так в обоих случаях не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
using namespace std;
struct Element{ // структура, задающая элемент списка
char data[50]; // поле для хранения данных
Element *next; // указатель на следующий элемент
} *start, *p; //определяем глобальные указатели на начало списка и текущий элемент
void create_list(a){
p = new Element;
p->data = a;
p->next = NULL;
start = p;
return;
}
main(){
char a[50];
printf("vvedide znachenie dla pervogo elementa, sozdavaemogo spiska: ");
cin>>a;
create_list(char a);
cout<<"spisok sozdan, edinstvennii element:"<<start->data;
system ("pause");
return 0;
}
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2012, 07:27
String и string - две разные вещи, хоть и разница в одну букву; заглядывай в справку почаще.
В своем примере с char data[50] ты неверно передаешь параметры функции. Вечерком приду домой - поправлю...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2012, 18:14
Вот так можно, к примеру:
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
using namespace std;
 
// ---------------------------------------------------------------------------
struct Element {   // структура, задающая элемент списка
    char data[50]; // поле для хранения данных
    Element *next; // указатель на следующий элемент
    Element( )     // конструктор по-умолчанию
                   : next( NULL ) {}
} *start = NULL, *p = NULL; // определяем глобальные указатели на начало списка и текущий элемент
// ---------------------------------------------------------------------------
void add_to_list( char *_data ) {
    if ( ! start ) {
        start = p = new Element( );
    }
    else {
        Element *tmp = p;
        tmp->next = p = new Element( );
    }
    strcpy( p->data, _data );
}
// ---------------------------------------------------------------------------
void detele_list( ) {
    Element *tmp = start ? start->next : NULL;
    while ( start ) {
        delete start;
        tmp = ( start = tmp ) ? tmp->next : NULL;
    }
    p = NULL;
}
// ---------------------------------------------------------------------------
int main( ) {
    system( "chcp 1251" );
    system( "cls" );
    //////////////////////////////////////
    char a[50];
    printf( "vvedide znachenie dla pervogo elementa, sozdavaemogo spiska: " );
    cin >> a;
    add_to_list( a );
    add_to_list( "второй элемент" );
    for ( int i = 3; i < 10;
        add_to_list( ( char * )( string( "элемент №" ) + string( 1, '0' + i++ ) ).c_str( ) ) );
 
    Element *tmp = start;
    for ( int i = 1; tmp; i++ ) {
        cout << "element " << i << " data: \"" << tmp->data << "\"" << endl;
        tmp = tmp->next;
    }
    cout << endl << "end of list" << "\n\n";
    detele_list( );
    //////////////////////////////////////
    system( "pause" );
    return 0;
}
Миниатюры
Как создать динамический список используя классы?  
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
11.10.2012, 06:21  [ТС]
запустил ваш код но опять ошибку у меня почему то выдает на этой строке
C++
1
add_to_list( ( char * )( string( "элемент №" ) + string( 1, '0' + i++ ) ).c_str( ) ) );
а ошибка такая -[BCC32 Error] File5.cpp(51): E2093 'operator+' not implemented in type 'string' for arguments
может я какую то нужну библиотеку не прописал?
сейчас такие подключенны
C++
1
2
3
4
5
6
#include <vcl.h>
#pragma hdrstop
 
#include <tchar.h>
#include<iostream.h>
#include<string.h>
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
11.10.2012, 14:23
С областями видимости что-то напутано или версии stl у нас в этом аспекте отличаются, так как у меня работает. Оператор + определен вне класса string, вероятно, с ним проблема. Просто используй оператор += с той же целью - он определен как член класса. Вот так:
C++
1
( char * )( string( "элемент №" ) += string( 1, '0' + i++ ) ).c_str( )
1
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
12.10.2012, 07:32  [ТС]
а не подскажите по другому коду, у себя на компе нашел когда то видать его по частям собирал))) но сейчас начал тестировать понял что на одном моменте работает не правильно, вот допустим вводим 4 строчки со значением нажимаем сохранить он сохраняет в файл, а когда нажимаешь считать информацию в список то почему то только последний 2 строчки считывает, получается ошибка в коде где кнопка баттон 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
#include <vcl.h>
#pragma hdrstop
 
#include "struc.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <fstream.h>
 struct lfile{
    AnsiString name;
    AnsiString data;
    AnsiString upd;
};
struct sp{
    lfile elfile;   // поле данных
    sp *next;   // указатель
};
using namespace std;
 
 
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  }
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
sp* list =new sp; //создаем указатель на голову списка
    sp *ptr;
    ptr=list;
 
        while (true){
        ptr->elfile.name = Edit1->Text;
        ptr->elfile.data = Edit2->Text;
        ptr->elfile.upd =  Edit3->Text;
        ListBox1->Items->Add(ptr->elfile.name + " " + ptr->elfile.data+ " " + ptr->elfile.upd); break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
CreateDir("Mak\\");
ListBox1->Items->SaveToFile("Mak\\tmp.txt" );
}
//---------------------------------------------------------------------------
 
 
 
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    sp* list = new sp;    //выделяем память для списка
    sp *ptr;  //указатель на элемент списка
    bool on=true; //флажок, который определяет, читаем ли мы первый элемент списка или последующие
    ifstream inf("Mak\\tmp.txt");//считывание файла по имени name в inf
    while (!inf.eof()){ // цикл пока не будет достигнут конец файла
        if(on){     //если до этого список был пуст, то
            ptr=list;  //записываем в него первый элемент
            on=false;
        }else{  //если список не пуст, то записываем в него текущий элемент (настраиваем указатель на след. элемент)
            ptr->next=new sp; //выделяем память под следующий элемент списка
            ptr=ptr->next;//ptr теперь указывает на тот элемент который был выделен строкой выше
        }
        char NAME[ BUFSIZ ];
        char DATA [BUFSIZ ];
        char UPD [BUFSIZ];
 
        inf >>NAME;   //читаем конкретные данные в текущий элемент списка
        inf>> DATA;
        inf>> UPD;
        ptr->elfile.name=NAME;
        ptr->elfile.data=DATA;
        ptr->elfile.upd=UPD;
        Memo1->Lines->Add(ptr->elfile.name + " " + ptr->elfile.data + " " + ptr->elfile.upd);    //читаем конкретные данные в текущий элемент списка
 
 
    }
    ptr->next=NULL; //для последнего элемента списка указатель на следующий элемент не определен/пуст (установлен в NULL)
    inf.close();//закрытие файла
 
}
0
3 / 5 / 0
Регистрация: 09.12.2012
Сообщений: 104
29.10.2013, 18:44
А в структуре

C++
1
2
3
4
5
6
7
8
struct Value
{
  public:
    int data;
    Value* Next;
    Value(int d):Next(0),data(d){}
    ~Value(){data=0;}
};
Что за ужасом является

C++
1
Value(int d):Next(0),data(d){}
и

C++
1
~Value(){data=0;}
Можно же при создании элемента списка нулевыми их сделать в функции по созданию нового списка?

Добавлено через 48 минут
Я так к структурам привык, что конструктора не увидел=)
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
29.10.2013, 19:12
В билдере есть исходники класса TList. Почему бы не воспользоваться ими, а не изобретать велосипед?
0
29.10.2013, 21:16

Не по теме:

Поздно. Теме больше года, все велосипеды уже давно катаются или выброшены.:)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2013, 21:16
Помогаю со студенческими работами здесь

Переделать задание, используя классы Задача: найти наибольший общий делитель чисел, используя алгоритм Евклида
Даны n натуральных чисел. Найти их наибольший общий делитель, используя алгоритм Евклида и...

3 класса: список, стек(как список), очередь(как список)
препод дал задание: написать 3 класса (список, стек, очередь), методы: вывод, добавление,...

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru