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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2011, 17:31   #1
Karina2
Новичок
Джуниор
 
Регистрация: 26.05.2011
Сообщений: 2
Печаль Работа с циклическим однонаправленном списком в С++ (Borland C++ 3.1)

ПОМОГИТЕ ПОЖАЛУЙСТА!!!! сегодня надо сдать, не могу понять в чём дело.
Задание: с помощью циклического однонаправленного списка реализовать: описать структуру order, содержащую поля: 1)ФИО плательщика, 2)перечисляемую сумму 3)расчётный счёт плательщика 4) расчётный счёт получателя
ввод данных с клавиатуры типа order; вывод на экран информации о сумме, снятой с расчётного счёта плательщика, введённого с клавиатуры (если такого нет - выдать сообщение) + стандартные процедуры работы со списком.
в лабе используется циклический однонаправленный список с удалённым заглавным звеном.
лаба есть, но не работает очистка списка и при поиске плательщика по ФИО ищет правильно, а ин-фу о нём выводит неправильно.
работает в режиме меню.

код:
Код:
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
struct order
{
int sum;
char FIO [50];
char rs_platel [15];
char rs_poluch [15];
};
struct node
{
  order elem;
  node *sled;
};
class Spisok {
  private:
    node *phead,*Res;
  public:
    Spisok () {phead=new(node);Res=NULL;}
    ~Spisok() {delete phead;}
    void POSTROENIE ();
    void VYVOD ();
    void VYVODONE(node *Res);
    node *POISK (order elem);
    void InsAfter (order elem);
    void InsBefore (order elem);
    void Delete ();
    void DelAfter ();
    void OCHISTKA();
};
void main ()
{
  Spisok A;
  order el,el1;
  node *Res;
  int key;
do
   {	clrscr();
	cout<<"МЕНЮ: \n";
	cout<<"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= \n";
	cout<<"1. Заполнение значений базы \n";
	cout<<"2. Вывод значений базы на экран \n";
	cout<<"3. Поиск плательщика по ФИО \n";
	cout<<"4. Добавление нового элемента после указанного \n";
	cout<<"5. Добавление нового элемента перед указанным \n";
	cout<<"6. Удаление текущего элемента \n";
	cout<<"7. Удаление элемента после текущего \n";
	cout<<"8. Удаление всей базы данных \n";
	cout<<"9. Выход \n";
	cout<<"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- \n";
	cout<<"\n";
	key=getch();
	switch(key)
	{
	case '1':
		A.POSTROENIE();
		getch();
		continue;
	case '2':
		A.VYVOD();
		getch();
		continue;
	case '3':
		cout<<"Введите ФИО плательщика, которого нужно найти: \n";
		gets(el.FIO);
	   	if (A.POISK(el)!=NULL)
	  	    A.VYVODONE(Res);
		else cout<<"Такого плательщика в базе нет! \n";
		    getch();
		    continue;
	case '4':
		cout<<"Введите ФИО плательщика, после которого нужно добавить: ";
		gets(el.FIO);
		cout<<"Введите новую информацию: \n";
		cout<<"ФИО плательщика: ";
		gets(el1.FIO);
		cout<<"Перечисляемая сумма: ";
		cin>>(el.sum);
		cout<<"Расчётный счёт плательщика: ";
		gets(el1.rs_platel);
		cout<<"Расчётный счёт получателя: ";
		gets(el1.rs_poluch);
		if (A.POISK(el)!=NULL)
	       {
		A.InsAfter(el1);
		cout<<"\n";
		A.VYVOD();
	       }
	       else cout<<"Такого плательщика в базе нет!\n";
		getch();
		continue;
	case '5':
		cout<<"Введите ФИО плательщика, перед которым нужно добавить: ";
		gets(el.FIO);
		cout<<"Введите новую информацию: \n";
		cout<<"FIO: ";
		gets(el1.FIO);
		cout<<"Перечисляемая сумма: ";
		cin>>(el.sum);
		cout<<"Расчётный счёт плательщика: ";
		gets(el1.rs_platel);
		cout<<"Расчётный счёт получателя: ";
		gets(el1.rs_poluch);
		if (A.POISK(el)!=NULL)
		{
		A.InsBefore(el1);
		cout<<"\n";
		A.VYVOD();
		}
		else cout<<"Такого плательщика в базе нет!\n";
		getch();
		continue;
	case '6':
		cout<<"Введите ФИО плательщика, которого нужно удалить из базы: ";
		gets(el.FIO);
		if (A.POISK(el)!=NULL)
		{
		 A.Delete();
		 cout<<"\n";
		 A.VYVOD();
		}
		else cout<<"Такого плательщика в базе нет!\n";
		getch();
		continue;
	case '7':
		cout<<"Введите ФИО плательщика, после которого нужно удалить: ";
		gets(el.FIO);
		if (A.POISK(el)!=NULL)
		{
		 A.DelAfter();
		 cout<<"\n";
		 A.VYVOD();
		}
		else cout<<"Такого плательщика в базе нет!\n";
		getch();
		continue;

	case '8':
	      	 A.OCHISTKA();
		 A.VYVOD();
	     	getch();
		continue;
     	}
      }	while (key != '9');
  }

Последний раз редактировалось Karina2; 26.05.2011 в 17:39.
Karina2 вне форума Ответить с цитированием
Старый 26.05.2011, 17:35   #2
Karina2
Новичок
Джуниор
 
Регистрация: 26.05.2011
Сообщений: 2
По умолчанию

Код:
сами процедуры, которые вызываются:
void Spisok::POSTROENIE ()
//Построение списка с удалённым заглавным звеном.
//phead - указатель на заглавное звено.
{  node *t;
  order  el;
  t = phead; (*t).sled = NULL;
while  (strcmp((el.FIO),"0") != 0)
  {(*t).sled = new (node);
    t = (*t).sled; (*t).elem = el;
cout<<"Введите ФИО плательщика: (для окончания ввода введите 0) ";
   gets(el.FIO);
if (strcmp((el.FIO),"0") == 0)
 break;
else
{cout<<"Введите перечисляемую сумму (целое число): ";
   cin>>(el.sum);
cout<<"Введите расчётный счёт плательщика: ";
   gets(el.rs_platel);
cout<<"Введите расчётный счёт получателя: ";
   gets(el.rs_poluch);}
  }
  (*t).sled = (*phead).sled;}

void Spisok::VYVOD ()
//Вывод содержимого кольцевого списка с удалённым заглавным звеном.
//phead ? указатель на заглавное звено.
{  node *t;
  t = (*phead).sled;
  cout<<"База данных: ";
  if  (t!=NULL)
  {    cout<<"\n ФИО плательщика: ";
    cout<<((*t).elem).FIO<<" ";
    cout<<"\n Перечисляемая сумма: ";
    cout<<((*t).elem).sum<<" ";
    cout<<"\n Расчётный счёт плательщика: ";
    cout<<((*t).elem).rs_platel<<" ";
    cout<<"\n Расчётный счёт получателя: ";
    cout<<((*t).elem).rs_poluch<<" ";
    t = (*t).sled;
    while  (t!=(*phead).sled)
    {    cout<<"\n ФИО плательщика: ";
    cout<<((*t).elem).FIO<<" ";
    cout<<"\n Перечисляемая сумма: ";
    cout<<((*t).elem).sum<<" ";
    cout<<"\n Расчётный счёт плательщика: ";
    cout<<((*t).elem).rs_platel<<" ";
    cout<<"\n Расчётный счёт получателя: ";
    cout<<((*t).elem).rs_poluch<<" ";
    t = (*t).sled;   }
  }
  else  cout<<"база пуста!\n";}

void Spisok::VYVODONE (node *Res)
{  cout<<"Ickomij element: ";
  if  (Res!=NULL)
  {    cout<<"\n ФИО плательщика: ";
    cout<<((*Res).elem).FIO<<" ";
    cout<<"\n Перечисляемая сумма: ";
    cout<<((*Res).elem).sum<<" ";
    cout<<"\n Расчётный счёт плательщика: ";
    cout<<((*Res).elem).rs_platel<<" ";
    cout<<"\n Расчётный счёт получателя: ";
    cout<<((*Res).elem).rs_poluch<<" "; }
  else  cout<<"база пуста!\n";}

node *Spisok:: POISK (order el)
//Поиск элемента el в кольцевом списке phead.
//Если элемент найден, то Res содержит указатель на звено,
//содержащее элемент el. В противном случае - NULL.
{  node *t;
  Res = NULL; t =(*phead).sled;
  while ((*t).sled!=(*phead).sled && Res==NULL)
  if  ( strcmp ( (((*t).elem).FIO),(el.FIO)) == 0)
  Res = t;
  else  t = (*t).sled;
  if  (Res==NULL && ( strcmp ( (((*t).elem).FIO),(el.FIO)) == 0) )
  Res = t;
  return Res;}

void Spisok::InsAfter (order el)
//Включение звена с информационным полем el в кольцо
//после звена, на которое указывает ссылка Res.
{  node *q;
  q = new (node);
  (*q).elem = el; (*q).sled = (*Res).sled;
  (*Res).sled = q;}

void Spisok::InsBefore (order el)
//Включение звена с информационным полем el в кольцо
//перед звеном, на которое указывает ссылка Res.
{  node *q;
  q = new (node);
  (*q).elem = (*Res).elem; (*q).sled = (*Res).sled;
  (*Res).elem = el; (*Res).sled = q;}

void Spisok::Delete ()
//Удаление звена, на которое указывает ссылка Res,
//из кольцевого списка с удалённым заглавным звеном,
//заданного указателем phead.
{  node *z,*q;
  if  ((*Res).sled!=(*phead).sled)
  {
    q = (*Res).sled;
    (*Res).elem = (*((*Res).sled)).elem;
    (*Res).sled = (*((*Res).sled)).sled;
    delete q;  }
  else  if  ((*Res).sled==Res)
	{   // В кольце единственное звено.
	   q = (*phead).sled; (*phead).sled = NULL;
	  delete q; cout<<"База пуста!";	}
       else
       { //Удаляется  "последнее" звено кольца.
	 z = phead; q = (*phead).sled;
	 while  (q!=Res)
	   { z = q; q = (*q).sled; }
	 (*z).sled = (*((*z).sled)).sled;
	 delete q;	}
}

void Spisok::DelAfter ()
//Удаление звена, расположенного после звена,
//на которое указывает ссылка Res,
//из кольцевого списка с удалённым заглавным звеном,
//заданного указателем phead.
{  node *q;
  if  ((*Res).sled!=(*phead).sled)
  {    //ссылка Res не указывает на последнее звено.
    q = (*Res).sled;
    (*Res).sled = (*((*Res).sled)).sled;
    delete q;  }
  else  if  ((*Res).sled==Res)
	  {	    //Удаляемое звено ? единственное в кольце.
	    q = (*phead).sled; (*phead).sled = NULL;
	    delete q; cout<<"База пуста!";	   }
	  else
	  {	    //Удаляемое звено ? первое в кольце и не единственное.
	    q = (*phead).sled;
	   (*Res).sled = (*((*Res).sled)).sled;
	   (*phead).sled  = (*Res).sled; delete q;	   }
}

void Spisok::OCHISTKA()
{  node *q,*q1;// Рабочие указатели.
  q = phead;
  q1 = (*q).sled; // Указатель q1 "опережает" указатель q.
  do {	q = q1;
	q1 = (*q1).sled;
	delete q;       }
  while (q1!=(*phead).sled);}

Последний раз редактировалось Karina2; 26.05.2011 в 17:39.
Karina2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с динамическим списком Medik07 Общие вопросы C/C++ 2 08.03.2011 20:54
проблемы со связным списком с++ (Borland) adwaer Помощь студентам 0 15.04.2009 16:23
проблемы со связным списком с++ (Borland) adwaer Помощь студентам 0 15.04.2009 16:22