Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Людмилка
Сообщений: n/a
#1

Циклический буфер. Проблема с удалением элемента. - C++

13.12.2008, 14:27. Просмотров 1559. Ответов 1
Метки нет (Все метки)

В общем, у меня такая проблема.. Не могу исправить ошибку в процедуре удаления... Элемент удаляет, но при выводе буфера программа зацикливается. Помогите, пожалуйста!) И еще не выходит перегрузить оператор вывода буфера...
Циклический буфер типа очередь. Последний элемент ссылается на первый. Удаление первого элемента, добавление в конец буфера.
Код
/*
     Циклический буфер
*/
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

#define box 10                //Максимальный размер буфера

int cursize;
class elem
{
      friend class spisok;
  //    friend ostream &operator<<(ostream &ostream, elem* ssil);
      int tt;
      elem *next;
      public:
	  void put_tt(int x) {tt=x;}
};
class spisok
{
      elem *p;     //adress nachala spiska
      int size;        //размер буфера
      public:
	 spisok();           // Є®*бвагЄв®а
	// ~spisok();          //¤ҐбвагЄв®а
	 void create(int nn);
	 void output();
	 spisok dell();
	 int get_size() {return size;}
	 spisok spisok::operator+(int n);
	 spisok spisok::operator-(int n);
	 friend ostream &operator<<(ostream& os,const spisok& obj);
	 spisok spisok::operator*(int n);
};

spisok::spisok()
{
   p=NULL;
   size = box;
}
void spisok::create(int nn)
{
     elem *q;
     if (nn>0)
     {
	p=new elem;
	p -> put_tt (random(100));
	q=p;
	for (int i=1;i<nn;i++)
	{
	     q -> next=new elem;
	     q=q->next;
	     q->put_tt(random(100));
	 }
	 q->next=p;
     }
     else p=NULL;
}

void spisok::output()
{
     elem *q;
     q=p;
     cout << "\nroot -> ";
     cout<<q->tt<<" -> ";
     q=q->next;
     while (q!=p)
     {
	cout<<q->tt<<" -> ";
	q=q->next;
     }
     cout << p->tt;
}
/*ostream &operator<<(ostream& os,const spisok &obj)
{
     elem *q;
     q=obj.p;
     os << "\nroot -> ";
     os <<q->tt<<" -> ";
     q=q->next;
     while (q!=obj.p)
     {
	os<<q->tt<<" -> ";
	q=q->next;
     }
     os << obj.p->tt;
     return os;
}     */

spisok spisok::operator+(int n)
{
     spisok summa;
     elem *q;
     elem *q1;
     q=p;
     q1=q;
     q=q->next;
     while (q!=p)
     {
	q1=q;
	q=q->next;
     }
     q=q1;
     q -> next=new elem;
     q=q->next;
     q->tt=n;
     q->next=p;
     summa.p=p;
     cursize++;
     return summa;
}

//udalenie

/*spisok spisok::operator-(int n)
{
     spisok summa;
     elem *q;//ssilka na next elem
     elem *q1;//ssilka,ukazivaet na predidushiy elem
     q=p->next;
     summa.p=p;
     while (q!=p)
     {
    // for (int i=1;i<=n;i++)
   //  {
//     if (q->tt==n)
//     {
	q=q->next;
//	summa.p=p;
//	delete q;
 //	return summa;
     }
//   while (q!=p)

	q1=q;
	q=q->next;
      //	if (q->tt==n)
	//{
	   q1->next=q->next;
	   p=q;
	   summa.p=p;
	   delete q;
	   return summa;
	   cursize--;
  //	}
    // }
 //    cout<<"Takogo elementa v spiske net\n";
     return summa;
} */
spisok spisok:: dell()
{
    spisok summa;
    elem *q;
    elem *r;
    summa.p=p;
    if (p!=NULL)
    {
       q=p;
       r=q->next;
       while (r!=p)
	  r=r->next;
       r->next=p->next;
       p=p->next;
       q=q->next;
       delete(q);
       cursize--;
       cout << "crs = " << cursize;
       summa.p=p;
    }
    return summa;
}

spisok spisok::operator*(int n)
{
     spisok summa;
     elem *q;
     elem *q1;
     q=p;
     while (q!=NULL)
     {
	if (q->tt==n)
	{
	   cout <<"Takoi element v spiske suchestvuet\n";
	   summa.p=p;
	   return summa;
	}
	q1=q;
	q=q->next;
     }
     if (q->tt==n)
     {
	q1->next=q->next;
	delete q;
	return summa;
     }
     cout<<"Takogo elementa v spiske net\n";
     return summa;
}


//q->next=NULL;
//} else p=NULL;

int main()
{
    clrscr();
    spisok a,b,c,buf;
    char ch;
    int kol,new_el;
    do
    {
	cout << "\n Выберите вариант:"
	<< "\n1. Информация о буфере;"
	<< "\n2. Создание буфера;"
	<< "\n3. Вывод элементов буфера;"
	<< "\n4. Добавление элемента в буфер;"
	<< "\n5. Удаление элемента из буфера;"
	<< "\n6. Выход\n";
	cin >> ch;
	switch(ch)
	{
	    case '1':
		cout << "\nРазмер буфера: " << buf.get_size()
		<< "\nСвободного места: " << buf.get_size()-cursize;
		getch();
		clrscr();
		break;
	    case '2':
		cout << "\nВведите кол-во элементов* : ";
		cin >> cursize;
		if ((cursize<=box)&&(cursize>0))
		{
		    buf.create(cursize);
		}
		else cout << "Ошибка!";
		getch();
		clrscr();
		break;
	    case '3':
	      //	cout<<buf;
		buf.output();
		getch();
		clrscr();
		break;
	    case '4':
		if (cursize!=box)
		{
		   cout << "Введите новый элемент: ";
		   cin >> new_el;
		   buf=buf+new_el;
		}
		else cout << "Буфер переполнен! Добавление невозможно!";
		getch();
		clrscr();
		break;
	    case '5':
	      /*	cout << "Введите кол-во удаляемых элементов: ";
		cin >> kol;
		if ((kol>0) && (kol<=cursize))
		   for (int j=1;j<=kol;j++)    */
		   buf=buf.dell();
		getch();
		clrscr();
		break;
	}
    } while (ch!='6');
   // getch();
    return 0;
};
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2008, 14:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Циклический буфер. Проблема с удалением элемента. (C++):

Очередь С++ Проблема с удалением элементов класса очереди - C++
Разбираюсь с очередью. Не могу понять, где совершил ошибку: при компиляции компилятор ругается на необработанное исключение при удалении...

Ошибка с удалением элемента в односвязном списке - C++
Здравствуйте! Вроде написал функцию удаления элемента в указанной позиции, но почему то не срабатывает. Где ошибка?Или если есть вариант...

Определение возможности сортировки массива удалением одного элемента - C++
На входе есть не менее 4 целых чисел, нужно определить, можно ли удалив не более одного элемента получить невозрастающий или неубывающий...

Функция вставки элемента в циклический список - C++
Добрый день. Возник такой вопрос. Нам дано циклический список. Нужно написать функцию, которая будет вставлять елементы если будет введен...

Дан массив размера N. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k- индекс максимального элемента. - C++
Дан массив размера N. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k- индекс максимального элемента.

Дан массив размера N. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k – индекс максимального элемента - C++
Помогите пожалуйста решить эту задачу, Дан массив размера N. Осуществить циклический сдвиг элементов массива вправо на k позиций,...

1
Людмилка
Сообщений: n/a
13.12.2008, 22:13 #2
C удалением элемента разобралась! Но с перегрузкой оператора вывода проблемы.... Неужели никто не знает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2008, 22:13
Привет! Вот еще темы с ответами:

Помогите с удалением - C++
Такая проблема не могу понять как сделать: пользователь вводит текст длиной не больше 250 символом, конец ввода символ /. Потом...

проблема с удалением - Ноутбуки
у меня ноут hp проблема такая хочу удалить программу или игру а он окно с процессом удаления не выводит на экран,или файл хочу удалит в...

Проблема с удалением файла - C# ASP.NET
Set Fs=Server.CreateObject(&quot;Scripting.FileSystemObject&quot;) Fs.DeleteFile (server.mappath(&quot;block.000&quot;)) Выдает ошибку &quot;Permission...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru