Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2013, 17:23   #1
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию С++, Список, односвязный список (?!)

Возникли вопросы по поводу создания списков.

1 - где можно прочитать про списки для С++? (Реализация списков) Павловскую ещё не листала, но в интернете путного пока что ничего не наблюдала. Если есть ещё какие-то книги по поводу, была бы очень признательна!

2 - списки всегда через классы создаются?

3 - если у меня должно быть несколько списков, которые будут содержать однотипные данные, их можно как-то приумножить, или все прописывать?

например, у меня есть два списка. List1, List 2. каждый из этих списков имеет свои "записи", и эти записи у этих списков одинаковые. то есть, 1,2,3 - и в List1, и в List2.

4 - как думаете, возможно ли создать массив, ячейки которого будут и числами и ссылками\указателями\адресами на список?



Охх, большое спасибо всем тем, кто сможет ответить на сим вопрос или вопросы!
Fanyuus вне форума Ответить с цитированием
Старый 20.03.2013, 17:54   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Павловскую ещё не листала, но в интернете путного пока что ничего не наблюдала.
павловскую выкинь, литературы море, но что конкретно интересует?
Цитата:
2 - списки всегда через классы создаются?
нет
Цитата:
3 - если у меня должно быть несколько списков, которые будут содержать однотипные данные, их можно как-то приумножить, или все прописывать?
есть шаблоны (гугли template C++)

Цитата:
4 - как думаете, возможно ли создать массив, ячейки которого будут и числами и ссылками\указателями\адресами на список?
возможно по-разному извратица, но зачем?
(если такой вопрос дал препод - то он ждет услышать что размер массива надо определить при создании, а список может расти, поэтому скажите ему "нет", чтобы лишних вопросов не было, но сами на реализацию std::vector посмотрите)
rrrFer вне форума Ответить с цитированием
Старый 20.03.2013, 18:07   #3
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
павловскую выкинь, литературы море, но что конкретно интересует?
Интересует "как создать списки при незнании устройства классов". Потому что, читаю пока в инете - всё через классы. А я понятия (пока что) не имею, что и как там потом с этими классами.

Если вы мне сможете привести пример (пусть даже самый-самый простой), я буду безгранично благодарна Вам))

Цитата:
Сообщение от rrrFer Посмотреть сообщение
есть шаблоны (гугли template C++)
окееей))



Цитата:
Сообщение от rrrFer Посмотреть сообщение
возможно по-разному извратица, но зачем?
(если такой вопрос дал препод - то он ждет услышать что размер массива надо определить при создании, а список может расти, поэтому скажите ему "нет", чтобы лишних вопросов не было, но сами на реализацию std::vector посмотрите)
Yes!
Мой преподаватель и так меня начинает подкалывать, что я извращенец программирования, но чувствую, это уже правда моя)))
Так, это было лир. отступление.

На самом деле, преподаватель ничего не спрашивает. Это я хочу для себя.
У меня есть одна идея, но я (пока что) не знаю как её реализовать по другому, кроме как в двумерном массиве хранить и числа и адреса\ссылки\указатели на списки, в которых буду храниться одинаковые (для других групп списков) числа, чтобы там можно было легко удалять "варианты" (т.е., эти самые записи списка), и если запись одна - менять адрес на данные в записи.

Да игру "судоку" пытаюсь типа реализовать))
*не совсем игру, скорее "как решить", при том, что не просто перебрать варианты, а именно что - решить.
к тому же, это отличная, как мне показалось, тема для "использование списков в повседневной жизни программиста"))
Fanyuus вне форума Ответить с цитированием
Старый 20.03.2013, 18:26   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Интересует "как создать списки при незнании устройства классов". Потому что, читаю пока в инете - всё через классы. А я понятия (пока что) не имею, что и как там потом с этими классами.
Ну, ключевой момент списка - что есть объект, часть которого (меньшая целого) может указывать на такой же объект. Тогда "остаток" можно использовать, чтобы хранить информацию. Простейшее:
Код:
typedef void* List[2];

void AddItem(List** l, void* item){
  List* container = new List;
  (*container)[0] = item;
  (*container)[1] = *l;
  *l = container;
}

void RemoveItem(List** l){
  List* toDelete = *l;
  *l = (**l)[1];
  delete toDelete;
}

void* TopItem(List* l){
  return (*l)[0];
}
Структуры C++ делают этот код более наглядным, а классы избавляют от необходимости выполнять ряд действий вручную (инициализировать при создании, уничтожать, передавать во все функции работы со списком аргумент List* и всё такое). Вот здесь я пытался объяснять, чем отличаются C-структуры от C++-классов в части "методов" и ключевого слова this.
Abstraction вне форума Ответить с цитированием
Старый 20.03.2013, 18:33   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

http://www.codenet.ru/progr/cpp/dlist.php
_Bers вне форума Ответить с цитированием
Старый 20.03.2013, 18:43   #6
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Abstraction, всё великолепно, но это сейчас для меня "увидела оооот-такенную фигу")))

возникли ряды вопросов по этому приверу, и, если вы не потив, может разберём их?

1 - typedef void* List[2]; -- определение списка? это писать после инклудов, или где?

2 - void AddItem(List** l, void* item) -- функция по созданию списка, вижу, а переменные item и l - это какие переменные? тип, характер?
И их, похоже, описывать надо в main'е.
(о, я так даже понимаю, что item - число, а l - ссылка на следующую запись в списке?)

3 - но не могу тогда понять что это означает:
Код:
*l = container;
4 - далее, вроде бы всё понятно, на как, допустим, создавать списки?
Если у меня значения определённые, т.е., у меня не будет каких-то "фантастических записей с клавиатуры", как сделать начальный целый определённый заранее список и потом из него удалять?

т.е., суть всей моей задумки - есть список, удаляем из него записи до такой степени, пока не останется 1 запись.

Хах, моя задача даже сократилась до таких размеров, что только удалять. Даже не будет "добавить", только удалять, сравнивать и "думать"))
Fanyuus вне форума Ответить с цитированием
Старый 20.03.2013, 18:46   #7
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Bers, спасибо вам! правда, там тоже есть "вопросы", но я читала его. Тоже "книга-фига", буду читать, значит, ещё раз))
Fanyuus вне форума Ответить с цитированием
Старый 20.03.2013, 19:40   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
struct Node {
  int a;
  Node *next;
};

Node *head = new Node;
head->a = 1;
head->next = 0;
/////////

Node *p = new Node;
p->a = 2;
p->next = head;
head = p;

Node *p = new Node;
p->a = 3;
p->next = head;
head = p;
и т.п. Тут список из 3 элементов, если обходить от головы - то 3, 2, 1.
Какая-то закономерность должна быть видна. Попробуйте оформить это для общего случая в виде процедур. Пример Abstraction Вас больше запутает чем что-то прояснит )
rrrFer вне форума Ответить с цитированием
Старый 20.03.2013, 19:49   #9
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

rrrFer, и я вижу, что он меня запутал, вот и мщу - мучаю вопросами

Хорошо, хорошо, вот я, допустим, мистическим образом создам список (чуть позже буду тут выкладывать коды), вопрос - как мне к списку обратиться в главной функции? (без разницы где, зачем)
любое обращение, хоть к значению данной что-то прибавить, просто посмотреть что и как))
Fanyuus вне форума Ответить с цитированием
Старый 20.03.2013, 21:28   #10
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Так, начало типа положено, но там ошибки - что с Node'oм?
И head тоже... Я вижу, они не объявлены - а как их представить?))


Код:
#include "stdafx.h"
#include <iostream>

using namespace std;

struct TList {
	int n;
	TList* next;
} *list;


int main()
{

	Node *head = new Node;
head->a = 1;
head->next = 0;


Node *p = new Node;
p->a = 2;
p->next = head;
head = p;

Node *p = new Node;
p->a = 3;
p->next = head;
head = p;

	cin.get();
	cin.get();
	return 0;
}
Fanyuus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать односвязный список и вывести его на экран. Из этого списка создать новый список по указанному ниже правилу и новый список San111 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 22:08
Односвязный список ZavriK Помощь студентам 2 02.05.2012 22:27
Необходимо реализовать классы, односвязный список для хранения целых чисел, односвязный список для хранен lineico Помощь студентам 2 09.05.2011 17:45
Односвязный список masha17 Общие вопросы C/C++ 1 09.12.2009 12:20
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52