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

Как работают списки и как их создать вообще? - C++

Восстановить пароль Регистрация
 
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
26.05.2013, 21:31     Как работают списки и как их создать вообще? #1
Уважаемые программисты, помоги разобраться как работают списки и как их создать вообще!
Я ищу информацию, ищу, но ничего мне не помогает. Пожалуйста!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
26.05.2013, 21:32     Как работают списки и как их создать вообще? #2
Легче поправить, добавить, направить, чем научить. Что уже знаете о них?
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
26.05.2013, 22:58  [ТС]     Как работают списки и как их создать вообще? #3
Например, что объявить список, можно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Lll
{
  Lll *next; //Указатель на след.элемент
  int ch; //Данные списка
};
 
void main()
{
    setlocale(0,"");
    int a;
    Lll *head=NULL; //указатель на голову списка
}
Я делаю односвязный список. Мне нужно в его конец добавить новый элемент. Вот именно "добавление" понять не могу.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
26.05.2013, 23:04     Как работают списки и как их создать вообще? #4
C++
1
2
3
4
5
6
7
push (int number)
{
pTemp = new Lll();
pTemp->ch = number;
pTemp->next = sp;
sp = pTemp;
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.05.2013, 23:34     Как работают списки и как их создать вообще? #5
Цитата Сообщение от Nullik Посмотреть сообщение
Вот именно "добавление" понять не могу.
Нужно взять "голову" списка и пройтись через next до последнего эл-та (у которого next==NULL).
Потом установить next на добавляемый элемент (у которого снова next должен быть равен NULL).
Вот и всё.
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
27.05.2013, 06:19  [ТС]     Как работают списки и как их создать вообще? #6
Tulosba , вот возьмём пример выше,

C++
1
2
3
4
5
6
7
push (int number)
{
pTemp = new Lll(); // это мы выделили память под новый элемент
pTemp->ch = number; // вот здесь мы присвоили в "ячейку" ч - число.
pTemp->next = sp; // а вот здесь и ниже строчка -- что это?!
sp = pTemp;
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.05.2013, 09:42     Как работают списки и как их создать вообще? #7
Nullik, если вставка эл-та осуществляется в конец списка, то строка 5 должна быть такой:
C++
1
pTemp->next = NULL; // т.е. для добавляемого эл-та pTemp не существует следующего, ведь мы добавляем  в конец списка.
sp - это, видимо, в данном случае указатель на последний эл-т.
По-хорошему, для определения списка надо иметь хотя бы 2 класса. Например:
Элемент списка:
C++
1
2
3
4
5
class Element
{
   Element* next; // Указатель на следующий эл-т списка
   DataType data; // Сами данные
}
Сам список:
C++
1
2
3
4
5
6
class List
{
   Element* head; // Первый эл-т списка (обязательно)
   Element* tail; // Последний эл-т списка (для удобства добавления в конец списка)
   // ... другие нужные поля
}
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
27.05.2013, 14:04  [ТС]     Как работают списки и как их создать вообще? #8
Tulosba, допустим:


Этот код был взят с сайта: ССЫЛКА на статью


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
#include <iostream>
#include <cstdlib>
using namespace std;
 
struct STACK {
int info; 
STACK *next;
};
 
int Empty(STACK *pstack)
{
if (pstack==NULL) 
return 0; 
else 
return 1;
}
 
void Add(STACK **pstack)
{
STACK *tmp = new STACK; 
tmp->info=rand()%100; 
tmp->next=*pstack; 
*pstack=tmp;
}
 
void Del(STACK **pstack)
{
STACK *tmp=*pstack; 
*pstack=(*pstack)->next; 
delete tmp;
}
 
void Show(STACK *pstack)
{
STACK *tmp=pstack; 
while(tmp!=NULL) 
{ 
cout << tmp->info << " "; 
tmp=tmp->next; 
}
}
 
void ClearAll(STACK **pstack)
{
STACK *tmp; 
while(*pstack!=NULL) 
{ 
tmp=*pstack; 
*pstack=(*pstack)->next; 
delete tmp; 
}
}
 
int main()
{
setlocale(LC_ALL,"Russian"); 
STACK *stack=NULL; 
int num; 
char otv; 
do 
{ 
cout << "1. Добавление элементов в вершину стека" << endl 
<< "2. Удаление элемента из вершины стека" << endl 
<< "3. Вывод элементов" << endl 
<< "0. Выход" << endl; 
cout << " = "; 
cin >> otv; 
switch(otv) 
{ 
case1′: 
cout << endl << "Сколько элементов добавить" << endl; 
cin >> num; 
for ( int i=0;i<num;i++) 
Add(&stack); 
cout << endl << "Элементы добавлены" << endl; 
break;
case2′:
if (Empty(stack)==0) 
cout << endl << "Стек пуст" << endl; 
else 
{ 
Del(&stack); 
cout << endl << "Элемент удален из вершины стека" << endl; 
} 
break;
case3′:
if (Empty(stack)==0) 
cout << endl << "Стек пуст" << endl; 
else 
{ 
cout << endl << "Элементы стека:" << endl; 
Show(stack); 
cout << endl; 
} 
break;
case0′:
ClearAll(&stack); 
break; 
default: 
cout << endl << "Ошибка" << endl; 
break;
}
 
}while(otv!=0′);
cin.get();
 
}

Вот здесь, вроде бы, полный такой пример. Что должен уметь делать этот список. Вообще, мне как бы стек надо было сделать, у меня есть стек, но я в упор не понимаю списки. Ахахаха, бывает))))

Но я хочу сказать, что вы вот сказали:

Нужно взять "голову" списка и пройтись через next до последнего эл-та (у которого next==NULL).
Потом установить next на добавляемый элемент (у которого снова next должен быть равен NULL).
Вот и всё.
и
т.е. для добавляемого эл-та pTemp не существует следующего, ведь мы добавляем в конец списка.
И сейчас меня осенила мысль, что это действительно легко и просто!

Вот, если вам не трудно, давайте разберём функцию добавления элемента:

C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <cstdlib>
using namespace std;
 
struct STACK {
int info; 
STACK *next;
};
Объявили этот список

C++
1
2
3
4
5
6
int main()
{
STACK *stack=NULL; // настроили указатель, на "несуществование элемента дальше"
Add(&stack); // вызвали функцию для добавления в список. Взяли указатель (ссылку на указатель), у которого NULL значение.
cin.get();
}
C++
1
2
3
4
5
6
7
void Add(STACK **pstack) // ? в скобках..
{
STACK *tmp = new STACK; 
tmp->info=rand()%100; 
tmp->next=*pstack; 
*pstack=tmp;
}
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.05.2013, 14:22     Как работают списки и как их создать вообще? #9
Nullik, в указанном примере функция Add() добавляет эл-т со случайным значением в поле info в начало. А не в конец, как я предположил изначально.
Параметр для Add() STACK **pstack это указатель на элемент, который указывает на начало списка.
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
27.05.2013, 15:25  [ТС]     Как работают списки и как их создать вообще? #10
Аааах, вот оно что.

Tulosba, можно я вас ещё помучаю, но не списками уже? (ленно тему ещё одну создавать, чувствую, что развожу флуд).

У меня есть программа, допустим, которая складывает два числа. *сложение находится в функции*. Как мне подключить эту программу к другому проекту, чтобы в другом проекте, если мы напишем эту функцию, то всё работало? Читаю, читаю темы "подключение библиотек к с++", но у меня не получается.


Вот, допустим.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 // ГЛАВНАЯ.cpp
#include "stdafx.h"
#include <iostream>
 
 
using namespace std;
 
void main()
{
    setlocale(0,"");
    int a,=0,b=0;
 
        summa(a,b);
    cin.get();
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// ВТОРИЧНАЯ.cpp
#include "stdafx.h"
#include <iostream>
 
 
using namespace std;
void summa (int a, int b)
{
      c=a+b;
      cout << c;
}
void main()
{
    setlocale(0,"");
    int a,=0,b=0;
        summa(a,b);
    cin.get();
}
Это я так, для примера. Вот, есть у меня два срр файла. Как к файлу ГЛАВНАЯ подключить ВТОРИЧНАЯ?
Нужно ли файлы из "ВТОРИЧНАЯ" перекидывать в проект "ГЛАВНАЯ"?
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
29.05.2013, 09:00  [ТС]     Как работают списки и как их создать вообще? #11
Ладно, с подключением программы разобралась, но возник новый вопрос:

Допустим, я сделала структуру, *простите, сейчас с телефона, записываю вкратце

C++
1
2
3
4
5
 struct SWR
 {
 Int asd;
SWR *next;
};
Далее, функции добавления элемнгта и вывод. И описаны они так:

C++
1
2
SWR* add_element(*указатель, да?);
 void print_SWR();
Подскажите, как в функции main вызвать добавление элемента и вывод?

Как можно из функции SWR* перевести в void, если в функции есть return указатель SWR?

*если что, то чуть позже выложу куски кода более конкретней.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 09:06     Как работают списки и как их создать вообще? #12
Цитата Сообщение от Nullik Посмотреть сообщение
SWR* add_element(*указатель, да?);
Можно и указатель, но если Вы просто добавляете целое, то лучше так:
C++
1
SWR* add_element( int value );
При условии, что это функция-член. Если обычная свободная функция, то надо еще передавать информацию о списке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 11:19     Как работают списки и как их создать вообще?
Еще ссылки по теме:

Односвязные списки: как работают? C++
C++ Списки. Как создать одновременно 2 списка? Как из второго списка поместить элементы в первый?
Как создать динамический массив типа string? Как создать класс такого массива? C++

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

Или воспользуйтесь поиском по форуму:
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
29.05.2013, 11:19  [ТС]     Как работают списки и как их создать вообще? #13
Вот, передавать информацию о списке. С этим, наверное, проблема.


В мэйне я пишу:
SWR* add_elem(SWR* yyy);

И вроде бы добавление происходит. Хотя бы, ошибок не выдаёт.
А вот что мне писать в функции void print?

Именно с мэйне, допустим, мне нужно вывести всё, что у меня есть, тогда...?
Main
{
Print(????);
}

Вот с чем я разобраться не могу. Кривой код подкинули))))
Yandex
Объявления
29.05.2013, 11:19     Как работают списки и как их создать вообще?
Ответ Создать тему
Опции темы

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