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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2010, 19:42   #1
Muro
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 11
По умолчанию Списки[ Удаление]

Здравствуйте Возникла Проблема с написание программы. Само задание ниже.Проблема в том что , программа не удаляет из списка.
Объясните в чем ошибка. Пожалуйста.
"Создать структуру с именем Sportsmen с полями: фамилия, имя, вид спорта, и результат. Сформировать список. Затем напечатать этот список в прямом и обратном порядке. Затем удалить из списка информацию о тех спортсменах, которые имеют худший результат в своем виде спорта. И снова напечатать список."


Код:
#include <iostream.h>
#include <conio.h>
#include <string.h>
#pragma argsused
int main(int argc, char* argv[])
{struct sportsman
{
 char fam[25], name[15], vidsp[20];
  int rez;
  sportsman  *next;
  sportsman *prev;
  } *current, *head=0, *tail=0,  *d, *r,*temp;
int c=1,m=0;
char f[25], na[15], v[20];
while (c)
{if (head)
{tail->next=new sportsman;
tail->next->prev=tail;
tail=tail->next;
}
else
{head=new sportsman;
tail=head;
head->prev=0;
};
cin>>tail->fam>>tail->name>>tail->vidsp>>tail->rez;
tail->next=0;
cout<<"eshe? yes - 1   no - 0"<<'\n';
cin>>c;
m++;}
current=head;
while(current!=0)
{ cout<<current->fam<<' '<<current->name<<' '<<current->vidsp<<' '<<current->rez<<endl;
current=current->next;
};
cout<<endl<<endl;
current=tail;
while(current!=0)
{ cout<<current->fam<<' '<<current->name<<' '<<current->vidsp<<' '<<current->rez<<endl;
current=current->prev;
};
cout<<endl<<endl;
current=head;
for(int i=0; i<=m; i++)
{current=head;
while(current->next!=0)

 {if (strcmp(current->vidsp,current->next->vidsp)>0)
{strcpy(temp->fam,current->fam);
strcpy(temp->name,current->name);
strcpy(temp->vidsp,current->vidsp);
temp->rez=current->rez;
strcpy(current->fam,current->next->fam);
strcpy(current->name,current->next->name);
strcpy(current->vidsp,current->next->vidsp);
current->rez=current->next->rez;
strcpy(current->next->fam,temp->fam);
strcpy(current->next->name,temp->name);
strcpy(current->next->vidsp,temp->vidsp);
current->next->rez=temp->rez;}

current=current->next;}}
current=head;
for(int i=0; i<m; i++)
{current=head;
while(current->next!=0)
 {if ((strcmp(current->vidsp,current->next->vidsp)==0)&&(current->rez>current->next->rez))
{strcpy(temp->fam,current->fam);
strcpy(temp->name,current->name);
strcpy(temp->vidsp,current->vidsp);
temp->rez=current->rez;
strcpy(current->fam,current->next->fam);
strcpy(current->name,current->next->name);
strcpy(current->vidsp,current->next->vidsp);
current->rez=current->next->rez;
strcpy(current->next->fam,temp->fam);
strcpy(current->next->name,temp->name);
strcpy(current->next->vidsp,temp->vidsp);
current->next->rez=temp->rez;}
 current=current->next;}}
 current=head;
 if(strcmp(current->vidsp, current->next->vidsp)==0)
{
current=head;
head=current->next;
current->next=0;
head->prev=0;

}current=head->next;

while ((current->next!=0) &&(current->next->next!=0))
{if ((strcmp(current->vidsp,current->prev ->vidsp)!=0)&&(strcmp(current->vidsp,current->next->vidsp)==0))
{{current->prev->next=current->next;
current->next->prev=current->prev;}
current=current->next->next;}
else
current=current->next;
}

 current=head;
 while(current!=0)
{ cout<<current->fam<<' '<<current->name<<' '<<current->vidsp<<' '<<current->rez<<endl;
current=current->next;
 };
cout<<endl<<endl;
getch();
return 0;

}
Muro вне форума Ответить с цитированием
Старый 09.06.2010, 23:26   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от Muro Посмотреть сообщение
Код:
 {if (strcmp(current->vidsp,current->next->vidsp)>0)
{strcpy(temp->fam,current->fam);
strcpy(temp->name,current->name);
strcpy(temp->vidsp,current->vidsp);
temp->rez=current->rez;
strcpy(current->fam,current->next->fam);
strcpy(current->name,current->next->name);
strcpy(current->vidsp,current->next->vidsp);
current->rez=current->next->rez;
strcpy(current->next->fam,temp->fam);
strcpy(current->next->name,temp->name);
strcpy(current->next->vidsp,temp->vidsp);
current->next->rez=temp->rez;}
Как вы все кактусы любите, std::string чем не угодило ?
Дайте место, хде же у вас не получается + про тег code не забывайте.
И почему бы список в виде класса не оформить ?
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 09.06.2010, 23:40   #3
Muro
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 11
По умолчанию

Потому что нельзя еще использовать классы, якобы мы их не прошли еще..
стд стринг ну вот как то использовать нельзя.. не прошли тот уровенью
Код:
current=head->next;

while ((current->next!=0) &&(current->next->next!=0))
{if ((strcmp(current->vidsp,current->prev ->vidsp)!=0)&&(strcmp(current->vidsp,current->next->vidsp)==0))
{{current->prev->next=current->next;
current->next->prev=current->prev;}
current=current->next->next;}
else
current=current->next;}
1 Элемент удаляет другие нет.

Последний раз редактировалось Muro; 10.06.2010 в 11:40.
Muro вне форума Ответить с цитированием
Старый 11.06.2010, 15:25   #4
Muro
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 11
По умолчанию

Видимо никто не знает где тут ошибка.
Muro вне форума Ответить с цитированием
Старый 11.06.2010, 15:45   #5
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

скорее просто код плохо читаемый =(
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 11.06.2010, 15:50   #6
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

попробуйте свой код расписать на функциях. Допустим:
1. функция создания списка
2. печать
3. удаление
4. линейный поиск
тогда и вам будет проще и нам легче найти ошибку
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 11.06.2010, 16:57   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

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

Оформите код хотя бы с отступами, и научитесь пользоваться тегом code, а потом поговорим о решении.
MaTBeu вне форума Ответить с цитированием
Старый 11.06.2010, 20:28   #8
Muro
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 11
По умолчанию

Код:
#include <iostream.h>
#include <conio.h>
#include <string.h>
#pragma argsused
int main(int argc, char* argv[])
{struct sportsman
{
 char fam[25], name[15], vidsp[20];
  int rez;
  sportsman  *next;
  sportsman *prev;
  } *current, *head=0, *tail=0,  *d, *r,*temp;
int c=1,m=0;
char f[25], na[15], v[20];
while (c)
{if (head)
{tail->next=new sportsman;
tail->next->prev=tail;
tail=tail->next;
}
else
{head=new sportsman;
tail=head;
head->prev=0;
};
cin>>tail->fam>>tail->name>>tail->vidsp>>tail->rez;
tail->next=0;
cout<<"eshe? yes - 1   no - 0"<<'\n';
cin>>c;
m++;} // Ввод данных.(фамилия,имя,вид спорта,результат)
current=head; // возвращаемся к началу.
while(current!=0)
{ cout<<current->fam<<' '<<current->name<<' '<<current->vidsp<<' '<<current->rez<<endl;
current=current->next;
};
cout<<endl<<endl; // выводим список.
current=tail; // достигли конца( перемещение на конец)
while(current!=0)
{ cout<<current->fam<<' '<<current->name<<' '<<current->vidsp<<' '<<current->rez<<endl;
current=current->prev;
};
cout<<endl<<endl;
current=head; //( в обратном направление вывод.)
//начинаем сортировать список по виду спорту.если вид спорта одинаковый то сортируем его по результату.
for(int i=0; i<=m; i++)
{current=head;
while(current->next!=0)

 {if (strcmp(current->vidsp,current->next->vidsp)>0)
{strcpy(temp->fam,current->fam);
strcpy(temp->name,current->name);
strcpy(temp->vidsp,current->vidsp);
temp->rez=current->rez;
strcpy(current->fam,current->next->fam);
strcpy(current->name,current->next->name);
strcpy(current->vidsp,current->next->vidsp);
current->rez=current->next->rez;
strcpy(current->next->fam,temp->fam);
strcpy(current->next->name,temp->name);
strcpy(current->next->vidsp,temp->vidsp);
current->next->rez=temp->rez;}

current=current->next;}}
current=head;
for(int i=0; i<m; i++)
{current=head;
while(current->next!=0)
 {if ((strcmp(current->vidsp,current->next->vidsp)==0)&&(current->rez>current->next->rez))
{strcpy(temp->fam,current->fam);
strcpy(temp->name,current->name);
strcpy(temp->vidsp,current->vidsp);
temp->rez=current->rez;
strcpy(current->fam,current->next->fam);
strcpy(current->name,current->next->name);
strcpy(current->vidsp,current->next->vidsp);
current->rez=current->next->rez;
strcpy(current->next->fam,temp->fam);
strcpy(current->next->name,temp->name);
strcpy(current->next->vidsp,temp->vidsp);
current->next->rez=temp->rez;}
 current=current->next;}}
 current=head;
 if(strcmp(current->vidsp, current->next->vidsp)==0)
{
current=head;
head=current->next;
current->next=0;
head->prev=0;

}current=head->next;
//ниже часть то работает то нет..
while ((current->next!=0) &&(current->next->next!=0))
{if ((strcmp(current->vidsp,current->prev ->vidsp)!=0)&&(strcmp(current->vidsp,current->next->vidsp)==0))
{{current->prev->next=current->next;
current->next->prev=current->prev;}
current=current->next->next;}
else
current=current->next;
}

 current=head;
 while(current!=0)
{ cout<<current->fam<<' '<<current->name<<' '<<current->vidsp<<' '<<current->rez<<endl;
current=current->next;
 };
cout<<endl<<endl;
getch();
return 0;

}
Muro вне форума Ответить с цитированием
Старый 11.06.2010, 20:43   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

На первый взгляд не заметил абсолютно никакой разницы с первым вариантом.
1. Сделайте нормальную табуляцию, совершенно непонятно, где что начинается, где что заканчивается:
Код:
for(int i=0; i<m; i++)
  {
  current=head;
  while(current->next!=0)
    {
    if ((strcmp(current->vidsp,current->next->vidsp)==0)&&(current->rez>current->next->rez))
      {
      strcpy(temp->fam,current->fam);
      strcpy(temp->name,current->name);
      strcpy(temp->vidsp,current->vidsp);
      temp->rez=current->rez;
      strcpy(current->fam,current->next->fam);
      strcpy(current->name,current->next->name);
      strcpy(current->vidsp,current->next->vidsp);
      current->rez=current->next->rez;
      strcpy(current->next->fam,temp->fam);
      strcpy(current->next->name,temp->name);
      strcpy(current->next->vidsp,temp->vidsp);
      current->next->rez=temp->rez;
      }
    current=current->next;
    }
  }
  current=head;
  if(strcmp(current->vidsp, current->next->vidsp)==0)
    {
    current=head;
    head=current->next;
    current->next=0;
    head->prev=0;
    }
  current=head->next;
  //ниже часть то работает то нет..
  while ((current->next!=0) &&(current->next->next!=0))
    {
    if ((strcmp(current->vidsp,current->prev ->vidsp)!=0)&&(strcmp(current->vidsp,current->next->vidsp)==0))
      {
        {
        current->prev->next=current->next;
        current->next->prev=current->prev;
        }
      current=current->next->next;
      }
  else
    current=current->next;
  }
Где-то примерно так, если, конечно, вы не перепутали там в двадцати местах положение скобок, что в такой портянке сделать очень легко.
2. Сделайте пару функций (как, например, указанные выше, а также функцию копирования, или сразу swap)
Код:
void swap(struct sportsman* sm1, struct sportsman* sm2)
  {
  //sm1 и sm2 меняются местами
  }
Код будет гораздо более структурирован и ошибки будет легче локализовать.

А то, что у вас сейчас - абсолютно нечитабельно и найти ошибки в этом, извините, творчестве - не представляется возможным. И, разумеется, никто их искать в таком - не будет.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 11.06.2010, 20:55   #10
Muro
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 11
По умолчанию

нашел ошибку.. все тему можно убивать.
Muro вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки sunman Паскаль, Turbo Pascal, PascalABC.NET 6 18.05.2010 19:03
списки angel# Паскаль, Turbo Pascal, PascalABC.NET 1 18.05.2010 18:35
Списки. Удаление элемента из списка. thexqn Помощь студентам 0 11.05.2010 09:04