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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2014, 22:49   #1
screammassacre
Пользователь
 
Регистрация: 14.11.2013
Сообщений: 12
Радость Задание со списком

Прошу помочь с функцией void delsecelem(), которая предназначена для удаления каждого второго элемента со списка.
Код:
#include <iostream>     
#include <conio.h>
 
using namespace std;
 
struct node
{
 float num;
 node  *next;
}*head, *tail;
 
node *push(float what);
node *pop();
 
void printstack();
void delsecelem();
 
int main()                               
{
   float what;
   int n;
   cin  >>  n;
   cout << "input " << n << " values\n";
   node *head = 0;
   cout << "input n\n";   
   node *q = new node [n];
  
 
   for (int i = 0; i < n; i++)
   {
     cin >> what;
     head = push(what);
   }
            printstack();
            delsecelem();
            
            cout << endl;
            printstack();
    for ( int j = 0; j < n; j++) 
    {
        head = pop();
        printstack();
    }
    delete []q;
            _getch();
}
 
node *push(float what)
{
  node *pv = new node;
  pv -> num = what;
  pv -> next = NULL;
  if(!head)
  {
    head = pv;
    tail = head;
  } 
  else
  {
    tail -> next = pv;
    tail = pv;
  }
  return pv;
}
 
void printstack()
{
    cout << "queue : \n";
    node *iter = head;
    
    while (iter != 0)
    {
        cout << iter -> num << " ";
        iter = iter -> next;
    }
    cout << endl;
}
 
 
node *pop() 
{
   node *tmp = head;
   head = head -> next;
   delete tmp;
   
   return tmp;
}
 void delsecelem() 
 {
 }

Последний раз редактировалось Stilet; 23.03.2014 в 23:05.
screammassacre вне форума Ответить с цитированием
Старый 24.03.2014, 01:37   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Я бы для начала реализовал функцию для удаления одного элемента, а потом просто в цикле вызывал эту функцию и передавал ей номер удаляемого элемента. (2,4,6,8 и т.д.).
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 24.03.2014, 01:43   #3
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Вот я раньше писал код двунаправленного списка. На С++ конечно, но алгоритм тот же. Только за код прошу не ругать, я его писал когда только начинал писать программы и с того момента не разу его не переписывал, но код рабочий. Тестил.

Код:
#pragma once

template<class TypeName>
class DoubleLinkedList
{
protected:
	struct _DATA
	{
		void* m_pNext;
		void* m_pPrev;
		void* m_pData;
	};
	_DATA* m_pSelected;
	_DATA* m_pFirst;
	_DATA* m_pLast;
	int m_CountElement;
public:
	DoubleLinkedList();
	~DoubleLinkedList();
	virtual bool Add(TypeName Data);
	virtual bool Delete();
	virtual bool Clear();
	virtual bool SelectFirst();
	virtual bool SelectLast();
	virtual bool SelectNext();
	virtual bool SelectPrev();
	virtual int GetCountElement() const;
	virtual TypeName& operator[](int Index);
};
template<class TypeName>
DoubleLinkedList<TypeName>::DoubleLinkedList()
{
	m_pFirst = nullptr;
	m_pLast = nullptr;
	m_pSelected = nullptr;
	m_CountElement = 0;
}
template<class TypeName>
DoubleLinkedList<TypeName>::~DoubleLinkedList()
{
	Clear();
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::Add(TypeName Data)
{
	_DATA* pNewElement = new _DATA;
	if (!pNewElement)
		return false;
	// Filling data
	pNewElement->m_pData = new TypeName;
	if (!pNewElement->m_pData)
		return false;
	*static_cast<int*>(pNewElement->m_pData) = Data;
	// Create first element
	if (m_CountElement == 0)
	{
		m_pFirst = pNewElement;
		pNewElement->m_pNext = nullptr;
		pNewElement->m_pPrev = nullptr;
	}
	// Add element to end list
	else if (m_pSelected->m_pNext == nullptr)
	{
		m_pSelected->m_pNext = pNewElement;
		pNewElement->m_pPrev = m_pSelected;
		pNewElement->m_pNext = nullptr;
	}
	m_pSelected = pNewElement;
	m_pLast = pNewElement;
	++m_CountElement;
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::Delete()
{
	SelectLast();
	if (m_pSelected == m_pFirst)
	{
		delete m_pSelected->m_pData;
		delete m_pSelected;
		m_pSelected = nullptr;
		return true;
	}
	_DATA* pDelete = m_pSelected;
	m_pSelected = static_cast<_DATA*>(m_pSelected->m_pPrev);
	delete static_cast<_DATA*>(m_pSelected->m_pNext)->m_pData;
	delete m_pSelected->m_pNext;
	m_pSelected->m_pNext = nullptr;
	m_pLast = m_pSelected;
	--m_CountElement;
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::Clear()
{
	int CopyCountElement = m_CountElement;
	for (int i = 0; i < CopyCountElement; ++i)
		Delete();
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::SelectFirst()
{
	m_pSelected = m_pFirst;
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::SelectLast()
{
	m_pSelected = m_pLast;
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::SelectNext()
{
	m_pSelected = static_cast<_DATA*>(m_pSelected->m_pNext);
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::SelectPrev()
{
	m_pSelected = static_cast<_DATA*>(m_pSelected->m_pPrev);
	return true;
}
template<class TypeName>
int DoubleLinkedList<TypeName>::GetCountElement() const
{
	return m_CountElement;
}
template<class TypeName>
TypeName& DoubleLinkedList<TypeName>::operator[](int Index)
{
	SelectFirst();
	for (int i = 0; i < Index; ++i)
		m_pSelected = static_cast<_DATA*>(m_pSelected->m_pNext);
	return *static_cast<TypeName*>(m_pSelected->m_pData);
}
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 24.03.2014, 01:59   #4
screammassacre
Пользователь
 
Регистрация: 14.11.2013
Сообщений: 12
Радость

Цитата:
Сообщение от kineziz Посмотреть сообщение
Вот я раньше писал код двунаправленного списка. На С++ конечно, но алгоритм тот же. Только за код прошу не ругать, я его писал когда только начинал писать программы и с того момента не разу его не переписывал, но код рабочий. Тестил.

Код:
#pragma once

template<class TypeName>
class DoubleLinkedList
{
protected:
	struct _DATA
	{
		void* m_pNext;
		void* m_pPrev;
		void* m_pData;
	};
	_DATA* m_pSelected;
	_DATA* m_pFirst;
	_DATA* m_pLast;
	int m_CountElement;
public:
	DoubleLinkedList();
	~DoubleLinkedList();
	virtual bool Add(TypeName Data);
	virtual bool Delete();
	virtual bool Clear();
	virtual bool SelectFirst();
	virtual bool SelectLast();
	virtual bool SelectNext();
	virtual bool SelectPrev();
	virtual int GetCountElement() const;
	virtual TypeName& operator[](int Index);
};
template<class TypeName>
DoubleLinkedList<TypeName>::DoubleLinkedList()
{
	m_pFirst = nullptr;
	m_pLast = nullptr;
	m_pSelected = nullptr;
	m_CountElement = 0;
}
template<class TypeName>
DoubleLinkedList<TypeName>::~DoubleLinkedList()
{
	Clear();
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::Add(TypeName Data)
{
	_DATA* pNewElement = new _DATA;
	if (!pNewElement)
		return false;
	// Filling data
	pNewElement->m_pData = new TypeName;
	if (!pNewElement->m_pData)
		return false;
	*static_cast<int*>(pNewElement->m_pData) = Data;
	// Create first element
	if (m_CountElement == 0)
	{
		m_pFirst = pNewElement;
		pNewElement->m_pNext = nullptr;
		pNewElement->m_pPrev = nullptr;
	}
	// Add element to end list
	else if (m_pSelected->m_pNext == nullptr)
	{
		m_pSelected->m_pNext = pNewElement;
		pNewElement->m_pPrev = m_pSelected;
		pNewElement->m_pNext = nullptr;
	}
	m_pSelected = pNewElement;
	m_pLast = pNewElement;
	++m_CountElement;
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::Delete()
{
	SelectLast();
	if (m_pSelected == m_pFirst)
	{
		delete m_pSelected->m_pData;
		delete m_pSelected;
		m_pSelected = nullptr;
		return true;
	}
	_DATA* pDelete = m_pSelected;
	m_pSelected = static_cast<_DATA*>(m_pSelected->m_pPrev);
	delete static_cast<_DATA*>(m_pSelected->m_pNext)->m_pData;
	delete m_pSelected->m_pNext;
	m_pSelected->m_pNext = nullptr;
	m_pLast = m_pSelected;
	--m_CountElement;
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::Clear()
{
	int CopyCountElement = m_CountElement;
	for (int i = 0; i < CopyCountElement; ++i)
		Delete();
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::SelectFirst()
{
	m_pSelected = m_pFirst;
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::SelectLast()
{
	m_pSelected = m_pLast;
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::SelectNext()
{
	m_pSelected = static_cast<_DATA*>(m_pSelected->m_pNext);
	return true;
}
template<class TypeName>
bool DoubleLinkedList<TypeName>::SelectPrev()
{
	m_pSelected = static_cast<_DATA*>(m_pSelected->m_pPrev);
	return true;
}
template<class TypeName>
int DoubleLinkedList<TypeName>::GetCountElement() const
{
	return m_CountElement;
}
template<class TypeName>
TypeName& DoubleLinkedList<TypeName>::operator[](int Index)
{
	SelectFirst();
	for (int i = 0; i < Index; ++i)
		m_pSelected = static_cast<_DATA*>(m_pSelected->m_pNext);
	return *static_cast<TypeName*>(m_pSelected->m_pData);
}
да код тяжелый у вас)
не смогу разобрать, наверняка(
screammassacre вне форума Ответить с цитированием
Старый 24.03.2014, 14:56   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Код:
 void delsecelem()
 {
    node *iter = head, *del_iter;

    while (iter != 0)
    {
        del_iter=iter->next;
        if (del_iter == 0) return;
        cout << "delete "<<del_iter->num<<endl;
        iter->next=del_iter->next;
        iter=del_iter->next;
        delete del_iter;
    }
 }
А вот если каждый 3-ий или четвёртый, то лучше вложенным циклом
eoln вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со списком, си tim47 Помощь студентам 0 25.03.2012 16:58
Операции над многочленами, заданными списком свомх коэффициентовОперации над многочленами, заданными списком свомх коэффициентов lelicki_bolicki Общие вопросы по Java, Java SE, Kotlin 1 06.12.2011 22:07
Запутаное задание задание с массивом.Буду очень благодарен. Riko1 Общие вопросы C/C++ 2 22.10.2011 10:23
работа с списком soirkar Visual C++ 0 28.06.2011 16:29
Поле со списком Diamand Microsoft Office Access 4 14.05.2010 21:28