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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2012, 06:22   #1
Buserandi
 
Регистрация: 03.11.2010
Сообщений: 4
По умолчанию Односвязный список, добавление элемента

Доброго времени суток.
Возникла проблема с добавлением элемента в односвязный список. Порывшись в гугле и исходниках, везде вижу списки\классы объявленные в глобальной видимости, за пределами main(). Я хочу сделать заполнение списка в цикле, где звёздочками отмечено в main(). Подскажите, пожалуйста, как быть, какие решения?
У меня получился следующий код:
Код:
#include "StdAfx.h"
#include <conio.h>
#include <iostream>
using namespace std;

//Creates list with one connexion.
typedef int DataType;

typedef struct Node
{
	DataType Data;
	Node* PNode;
};

Node* CreateList(DataType Info)
{
	Node *NewNode = new(Node);
	NewNode->Data = Info;
	NewNode->PNode = NULL;
	return NewNode;
}

void AddNode(Node *prev_item, DataType Info)  
{
	Node *NewNode = new(Node);
	NewNode->Data = Info;
	prev_item->PNode = NewNode;
	NewNode->PNode = NULL;
}

void DeleteNode(Node *prev_item, Node *item) 
{
	Node *Pointer = item->PNode;
	delete(item);
	prev_item->PNode = Pointer;
}

void DeleteList(Node *item) 
{
	while (item != NULL)
	{
	    Node *Pointer = item->PNode;
		DeleteList(Pointer);
		cout << item->Data;
		delete(item);
		item = NULL;
	}
}
int main()
{
	Node* Strings = CreateList(12345);
***********************
        AddNode(Strings, 321);
	AddNode(Strings->PNode, 132);
***********************
	cout << Strings->Data;
	DeleteList(Strings);
	getch();
	return 0;
}
Заранее спасибо.

UPD: Вот, да. Сейчас попробовал с глобальным списком и работает цикл. Но это же не хорошо, когда в глобальных переменные лежат, если я не ошибаюсь.

Последний раз редактировалось Buserandi; 26.07.2012 в 07:47.
Buserandi вне форума Ответить с цитированием
Старый 26.07.2012, 07:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если я не ошибаюсь.
Это стереотип. Не слушай умников которые такое говорят - делай так чтоб работало надежно, а не так как какому-то трупу страуса моча в башню стукнула.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.07.2012, 10:14   #3
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Насчёт глобальных переменных. Вставлю 5 копеек.
Их можно использовать, но делать это нужно с умом. Например, если в твоём проекте всего один односвязный список, то почему бы его не сделать глобальным? А вот делать глобальными счётчики не стоит никогда.
Код:
Это стереотип.
Имхо, нужно уметь писать без глобальных переменных. Хотя бы для того чтобы уметь передавать указатели и правильно работать с ними. В данном примере ТСу было бы полезно переписать код так, чтобы он работал без использования глобальных переменных. Просто для наработки опыта.
Для односвязного списка всего-то нужно две функции - AddNode и DeleteNode.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 26.07.2012, 13:32   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Как только начинаем использовать многопоточност сразу начинаем понимать стереотипность...
Глобально - только константы!
waleri вне форума Ответить с цитированием
Старый 26.07.2012, 20:56   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как только начинаем использовать многопоточност сразу начинаем понимать стереотипность...
Дело не в многопоточности. Если у программиста башка на месте он напишет программу так что хоть глобально хоть локально переменки друг дружке мешать не будут. Да глобализация переменных добавляет грабли в некоторых случаях, когда к одной и той же переменке пытаются обратиться несколько блоков кода - deadlock получается, но это не повод полностью от них отказываться бездумно в любой ситуации, даже там где глобализация даст выигрыш. Гикам сего не понять.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.07.2012, 21:07   #6
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

Цитата:
Сообщение от Stilet
Не слушай умников которые такое говорят - делай так чтоб работало надежно
А как же принципы ООП?
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 26.07.2012, 21:09   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как же принципы ООП?
А разве их нужно соблюдать всегда и везде?
Разве ООП удобно применять везде?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.07.2012, 21:14   #8
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

Глобальная область должна быть как можно меньше захломлена, даже если это процедурное программирование.
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 26.07.2012, 21:27   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Виталий, при больших проектах идет конфликт имен потом, потому и нужно ограничивать по максимуму.
так же помнить про пространства имен, и статические переменные класса/модуля.

я уже натыкался на конфликт как то, с тех пор усвоил этот урок.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.07.2012, 21:56   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
при больших проектах идет конфликт имен
Верно, но никто не мешает мне давать уникальные имена
Ребята, это все обсуждение просто холливар. Я имею свое мнение - глобализация не так опасна как о ней говорят. Переубеждать никого не хочу, но в данном случае в рамках поставленной темы вынесение в глобаль быстро решит проблему.
Если далее эта программа не будет развиваться то и нет смысла надувать слона из мухи. Вот и все что я имел ввиду.
Столкнется автор с крупным проектом с межмодульными связями - тогда и придет время группировать данные, а на данном этапе это не обязательно (вернее не так обязательно как об этом говорят)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать односвязный список и вывести его на экран. Из этого списка создать новый список по указанному ниже правилу и новый список San111 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 22:08
Необходимо реализовать классы, односвязный список для хранения целых чисел, односвязный список для хранен lineico Помощь студентам 2 09.05.2011 17:45
Добавление элемента в кольцевой список ForzaJuve Общие вопросы C/C++ 1 09.11.2010 19:39
Двухсвязный список, добавление элемента в указанную позицию redmonkey Помощь студентам 3 19.10.2010 12:29
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52