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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2013, 22:08   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию Очередь

Как удалить четный элемент из очереди?
Понимаю, как удалить только голову списка, а если определенный?
Задание было удалить четный элемент.

Не представляю как это сделать
Praud вне форума Ответить с цитированием
Старый 15.03.2013, 22:12   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Что такое четный элемент очереди?
s-andriano вне форума Ответить с цитированием
Старый 15.03.2013, 22:15   #3
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Есть какой-то список.
К примеру:

1,5,4,6,7,8,9,NULL

Нужно удалить все элементы стоящие на четных местах.
Praud вне форума Ответить с цитированием
Старый 15.03.2013, 22:18   #4
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <malloc.h>
#include <locale.h>


/* Объявляем структуру типа Очередь(Список) */
#define QUE struct que          
 QUE
 {
   int info;
   QUE *next;
 };

/*Глобальная переменная-указатель, отвечающая за объявление списка*/
 QUE *q=NULL;
 void display(QUE * q);
 void create_list();
 void job(QUE * q);

 void main()                              /* головна функцiя */
{
	setlocale(LC_ALL, "Russian");
    create_list();
    display(q);
	job(q);
	display(q);
	_getch();
}

/* Функция добавления элемента в список*/
 void insert (QUE **q, int item)    
{
	QUE *current = *q;
    QUE *previous = 0;
    QUE *new_node;
    while(current)
	{
      previous=current;
      current=current->next;
    }
    new_node = (QUE*) malloc (sizeof (QUE));
    new_node->info = item;
    if (previous)
    {
      new_node->next = previous->next;
      previous->next = new_node;
    }
    else
	{
       *q = new_node;
       (*q)->next = 0;
	}
}

/* Функци создания списка*/
void create_list()                  
{
	QUE * list=NULL;
    int done=1,
	info, c;
    printf("Создаем список:\n");

    while(done)
      {
		  printf("Добавляем элемент? (Y/N)");
		  c = _getch();
          switch(c)
	      {
		  case 'Y':printf("\n Элемент: ");
				 scanf_s("%d", &info);
				 insert(&q, info);
				 break;

			  case 'N': done=0;
				 break;
	       }
       }
}


void display(QUE * q)                /* функцiя виведення списку */
{
	QUE * current = q;       
    printf("\nВот ваш список\n");
    while(current)
    {
		printf("%d-->", current->info);
		current = current ->next;
    }
    printf("NULL");
 }

void take_off(QUE **q, int *err)
{
	int value=0;

	QUE *old_header=*q;

	if(*q)
	{
		value=old_header->info;
		*q=(*q)->next;

		free(old_header);
		*err=0;
	}
	else
		*err = 1;

}

void job(QUE * q)                  
{
	int pos=0;
 QUE * current = q;
    int err;
    while(current!=NULL)
    {
  pos++;
  if (pos%2==0)
  {
   // должно быть take_off(&q, &err), но не сработает так как удаляет только голову.
  }
 current = current->next;
    }
}
Praud вне форума Ответить с цитированием
Старый 15.03.2013, 22:33   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

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

Вариант 1.
Глазками находим четные по нашему мнению элементы - это 1, 4, 7 и 9.
Остается 5, 6, 8, NILL.

Вариант 2.
Находим в очереди первый четный элемент. Очевидно, это 0-й элемент. Удаляем его. (1)
Берем оставшуюся часть очереди (5,4,6,7,8,9,NULL)
Находим в ней первый четный элемент. Очевидно, это 0-й элемент. Удаляем его. (5)
И т.д.
Остается пустая очередь.

Вариант 3.
Планируем удалить из очереди элементы: 0-й, 2-й, 4-й...
Удаляем 0-й (1), остается (5,4,6,7,8,9,NULL)
Удаляем 2-й (6), остается (5,4,7,8,9,NULL)
Удаляем 4-й (9), остается (5,4,7,8,NULL)

Как видим, выполняем, вроде, одну и ту же операцию, а получаем разные результаты. Это говорит о том, что в очереди нет элементов, которые можно было бы характеризовать определением "четный".
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очередь - C++ Snorlax712 Помощь студентам 4 09.05.2012 15:28
Очередь shelovek Помощь студентам 0 31.10.2010 14:15
Очередь Си svetikzo Помощь студентам 0 23.01.2010 10:03
Очередь Юлькин Общие вопросы C/C++ 4 30.05.2009 16:00