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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2015, 20:59   #1
funn1kfun
Новичок
Джуниор
 
Регистрация: 17.06.2015
Сообщений: 4
По умолчанию (СИ) Печать очереди с условием

Помогите пожалуйста, работы на 2 минуты.
Есть очередь из целых чисел, нужно распечатать очередь из тех, после которых не стоит заданное число.

Вот объявление списка:

Код:
typedef struct node_t
{
    int value;
    struct node_t* next;
}  TNode;
 
typedef struct list_t
{
    TNode* head;
    TNode* tail;
}  TList;
Вот вызов функции печати (е - то самое число):

Код:
while (!IsEmpty(&list))
    {
        printf("%d ", Pop(&list, e));
    }
Вот сама функция:

Код:
int Pop(TList* list, int e)
{
    TNode* node = list->head;
    list->head = node->next;
    if (list->head == NULL)
    {
        list->tail = NULL;
    }
    int value = node->value;
    free(node);
 
    return value;
}
Вот ее нужно переделать под это условие, чтобы возвращались только те, у которых

Код:
list->head->next->value != e
или

Код:
node->next->value != е
(вот именно в этом не разбираюсь).
Спасибо заранее!

Последний раз редактировалось funn1kfun; 17.06.2015 в 21:02.
funn1kfun вне форума Ответить с цитированием
Старый 17.06.2015, 21:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Есть очередь из целых чисел, нужно распечатать очередь из тех, после которых не стоит заданное число.
Код:
void write(int n){
 TNode *i=list->head;
 for(;i;i=i->next) 
  if(i->next && i->next->value==n) {printf("%5d",i->value);i=i->next;}
}
Годится идея?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2015, 21:38   #3
funn1kfun
Новичок
Джуниор
 
Регистрация: 17.06.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
void write(int n){
 TNode *i=list->head;
 for(;i;i=i->next) 
  if(i->next && i->next->value!=n) {printf("%5d",i->value);i=i->next;}
}
Годится идея?
Спасибо за идею
В моем случае там
Код:
if(i->next && i->next->value!=n) {printf("%5d",i->value);i=i->next;}
Но суть в том, что печатает не все, некоторые пропускает.
Вот например: ввожу 1 2 3 5 6 7 5 11 2 5
Число 5
Должно быть 1 2 5 6 5 11 5
Но печатает лишь 1 5 5

Последний раз редактировалось funn1kfun; 17.06.2015 в 21:44.
funn1kfun вне форума Ответить с цитированием
Старый 17.06.2015, 21:50   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

i=i->next; наверное убери. Это я погорячился.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2015, 22:03   #5
funn1kfun
Новичок
Джуниор
 
Регистрация: 17.06.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
i=i->next; наверное убери. Это я погорячился.
К сожалению, снова мимо
Первых 2 только печатает вообще.
Пробовал и i->next->next - тогда 2 последних вообще печатает.
Спасибо Вам за помощь
funn1kfun вне форума Ответить с цитированием
Старый 17.06.2015, 22:43   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Я конечно дико извиняюсь, но я так и не понял, которые именно надо печатать?
waleri вне форума Ответить с цитированием
Старый 17.06.2015, 22:51   #7
funn1kfun
Новичок
Джуниор
 
Регистрация: 17.06.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Я конечно дико извиняюсь, но я так и не понял, которые именно надо печатать?
Я знаю, что плохо объяснил, но выше пример приводил, где вроде бы понятно.
Печатать нужно только те, после которых нет заданной цифры.
Ввели 1 2 3 5 6 7 5 11 2 5
Выбрали цифру 5
Напечатало 1 2 5 6 5 11 5

Последний раз редактировалось funn1kfun; 17.06.2015 в 22:57.
funn1kfun вне форума Ответить с цитированием
Старый 18.06.2015, 14:03   #8
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
Вопрос

Я как понял, Вы мутите очередь, что-то вроде стека. Хм, но вы забываете, очередь не односвязный список. Каждый вызов pop() вырезает самый последний элемент - LIFO (последний вошёл, первым вышел). Очередь можно сделать из массива или списка. Но делать Next или Prior, далеко не его собачья доля.

Код:
if(!Queue.Count()) return *Queue.None();

	if(Locale2 == Queue.End()) --Locale2;

	_Ty _Ret = *Locale2;

	if(Locale2 == Locale1)
		// Последний
		Cleanup();
	else
	{
		Iterator _Temp = Locale2 - 1;
		Queue.Remove(Locale2);
		Locale2 = _Temp;
	}

	return _Ret;
Это функция Pop из моей либы.

ПС: прочтя Ваш пост, более внимательней, а что вам запрещает добавлять по условию, а не вырезать? В конечном счёте, делаем проход до первого вхождения, в противном случаи вызываем none. Списком я бы Вам не советовал, очень сильно упадёт производительность.

Код:
]if(!Queue.Count()) return *Queue.None();

	if(Locale2 == Queue.End()) --Locale2;

	_Ty _Ret = *Locale2;

for((*Locale2 != #некое условное значение в аргументе функции#) && (Locale2 != Queue.None())) --Locale2;

if(Locale2 == Queue.None()) return *Queue.None();

	if(Locale2 == Locale1)
		// Последний
		Cleanup();
	else
	{
		Iterator _Temp = Locale2 - 1;
		Queue.Remove(Locale2);
		Locale2 = _Temp;
	}

	return _Ret;
ПСЫ: И вот ещё, придётся определится откуда постоянно начинать, либо с конца, либо с начало, в моём случаи постоянно обновлять локаль.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 18.06.2015 в 14:19. Причина: Прочёл пост №1 внимательней
Perchik71 вне форума Ответить с цитированием
Старый 18.06.2015, 16:21   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от funn1kfun Посмотреть сообщение
Печатать нужно только те, после которых нет заданной цифры.
Ввели 1 2 3 5 6 7 5 11 2 5
Выбрали цифру 5
Напечатало 1 2 5 6 5 11 5
Вроде такого?
Код:
for (item = list->head; 0 != item; item = item->next)
  if ((item->next == 0) || (item->next->value != 5))
    item->print();
waleri вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать макрос на печать с условием? Gunslighter Microsoft Office Excel 5 23.05.2014 10:51
С заданной целочисленной очереди организовать две: первая содержит все положительные элементы данной очереди, вторая - отрицательн wowan30002 Общие вопросы C/C++ 0 20.11.2012 17:39
Очереди stepanuch Паскаль, Turbo Pascal, PascalABC.NET 6 02.12.2011 20:17
Очереди anuta90 Помощь студентам 3 09.10.2010 22:07