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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2009, 13:47   #1
DED_moroZ
 
Регистрация: 03.06.2009
Сообщений: 5
По умолчанию Список структур. -> определенных удалить. (подскажите)

Направьте на путь истинный (переклинило.. мозГ).....
Структура содержит фамилию и 4 оценки. Удалить из списка имеющих 2, 3.
Все работает до void del(void);
------------------------------------
Код:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>

struct spis
{ char name[20];
  int bal1, bal2, bal3, bal4;
  struct spis *v1;
  struct spis *v2;
};

void create(void);  //Прототип функции Создать
void list(spis *);  // Прототип функци Просмотр
void add(void);      // Прототип функции Добовить
void del(void);

struct spis *head,*tail;

main()
{
char c;
while (1)
{
 clrscr();
 puts(" 1 - Создать список");
 puts(" 2 - Просмотреть список");
 puts(" 3 - Довавить в конец списка новой структуры");
 puts(" 4 - Удалить из списка имеющих 2, 3.");
 puts(" 0 - Выход");
 c=getch();
 switch(c)
 {
   case '1':create();break;
   case '2':list(head);break;
   case '3':add();break;
   case '4':del();break;
   case '0':return 0;
   default : puts("Неверный режим");
 }
}
free(head); // Освобождение памяти
}

void create(void)
{clrscr();
spis *p,*pred;
  pred=NULL;
  do {
    p=(spis *)malloc(sizeof(spis));
    printf("Фамилия студента: ");
    scanf("%s",&p->name);
    printf("Оценка №1: ");
    scanf("%d",&p->bal1);
    printf("Оценка №2: ");
    scanf("%d",&p->bal2);
    printf("Оценка №3: ");
    scanf("%d",&p->bal3);
    printf("Оценка №4: ");
    scanf("%d",&p->bal4);
    p->v1=pred;
    if (pred != NULL)
      pred->v2=p;
    else
      head=p;
    pred=p;
    puts("Выход - <esc>");
}
while (getch()!=27);
  tail=p;
  tail->v2=NULL;
}


void list(spis *p)  // Просмотр списка
{clrscr();
printf("    Фамилия  \t|    Оценки  \n");
printf("---------------------------------");
if (p==head)
  while (p != NULL)
    {
    printf("\n %s \t| %d | %d | %d | %d ",p->name, p->bal1, p->bal2, p->bal3, p->bal4);
      p=p->v2;
    }
   else if (p==tail)
  while ( p!= NULL)
  {
  puts(p->name);
    p=p->v1;
  }
  else
    puts("Неверный параметр:");
    getch();
  }

  void add(void)
{
spis *p,*pn;
  clrscr();
  do{
    pn=(spis *)malloc(sizeof(spis));
    printf("Фамилия студента: ");
    scanf("%s",&pn->name);
    printf("Оценка №1: ");
    scanf("%d",&pn->bal1);
    printf("Оценка №2: ");
    scanf("%d",&pn->bal2);
    printf("Оценка №3: ");
    scanf("%d",&pn->bal3);
    printf("Оценка №4: ");
    scanf("%d",&pn->bal4);
        p=tail;
       pn->v1=tail;
       pn->v2=NULL;
       p->v2=pn;
       tail=pn;
       puts("Выход - <esc>");
       }
   while (getch()!=27);
}
------------------------------------------
вот тут замудрил....  подскажите... (и как чтоб не вводить 2 и 3), а сразу выстроился список по нажатию 4 
------------------------------------------
void del(void)
{
spis *p, *temp;
int f[20];
char c;
int j=0;
clrscr();
printf("Студенты имеющие 2 и 3: ");
scanf("%d",&f);
p=head;
      while (p!=NULL)
      {
        while (strcmp((p->bal1),f)=0){
          j++;
          printf("\nНайденo: ");
          printf("\n %s \t| %d | %d | %d | %d ",p->name, p->bal1, p->bal2, p->bal3, p->bal4);
          printf("Удалить? - Y\n");
          c=getch();
           if (c=='y'){
               if (p==head) // если найденная запись - первая
                 {head=p->v2;
                  head->v1=NULL;
                  free(p);
                  p=head;
               }

               else if (p==tail) // если найденная запись - последняя
                 {tail=p->v1;
                  tail->v2=NULL;
                  free(p);
                  p=tail;
                  break;
               }

               else // удаление из средины списка
                 {p->v2->v1=p->v1;
                  p->v1->v2=p->v2;
                  temp=p;
                  p=p->v2;
                  free(temp);
               }
            printf("Удалено!\n");
            }else break;
            }
      p=p->v2;
      }
if(j==0) {
printf("\nНе найдено");
getch();
}
}
Модератор: тег CODE

Последний раз редактировалось Sazary; 03.06.2009 в 13:51.
DED_moroZ вне форума Ответить с цитированием
Старый 03.06.2009, 14:05   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
struct spis *v1;
  struct spis *v2;
Какой из них указывает на следующий элемент? v1?

Вместо этого:
Код:
while (strcmp((p->bal1),f)=0){
сделайте:
Код:
if(p->bal1==2 || p->bal1==3)
Кстати, а зачем там у вас while?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 03.06.2009, 14:17   #3
DED_moroZ
 
Регистрация: 03.06.2009
Сообщений: 5
Хорошо

if(p->bal1==2 || p->bal1==3)

так вставил.... список формирует ...но не удаляет...
DED_moroZ вне форума Ответить с цитированием
Старый 03.06.2009, 14:25   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот так сделайте. Оно?
Код:
void del(void)
{
spis *p, *temp;
int f[20];
char c;
int j=0;

printf("Студенты имеющие 2 и 3: ");

p=head;
      while (p!=NULL)
      {
        if(p->bal1==2 || p->bal1==3)
        {
          j++;
          printf("\nНайденo: ");
          printf("\n %s \t| %d | %d | %d | %d ",p->name, p->bal1, p->bal2, p->bal3, p->bal4);
          printf("Удалить? - Y\n");
          c=getch();
           if (c=='y')
           {
               if (p==head) // если найденная запись - первая
                 {head=p->v2;
                  head->v1=NULL;
                  free(p);
                  p=head;
               }

               else if (p==tail) // если найденная запись - последняя
                 {tail=p->v1;
                  tail->v2=NULL;
                  free(p);
                  p=tail;
               }

               else // удаление из средины списка
                 {p->v2->v1=p->v1;
                  p->v1->v2=p->v2;
                  temp=p;
                  p=p->v2;
                  free(temp);
               }
            printf("Удалено!\n");
            }
           }
      p=p->v2;
      }
if(j==0) {
printf("\nНе найдено");
getch();
}
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 03.06.2009, 14:57   #5
DED_moroZ
 
Регистрация: 03.06.2009
Сообщений: 5
По умолчанию

так.... блин... в чем касяк..
он находит, но по одному (да и ладно бы, и так сошло), но из основного не удаляет... просмотр смотришь все как было...

т.е... до ----- printf("Удалено!\n"); не доходит

Модератор: пользуйтесь "правкой"

Последний раз редактировалось Sazary; 03.06.2009 в 15:03.
DED_moroZ вне форума Ответить с цитированием
Старый 03.06.2009, 15:03   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Уверены? У меня все находит и все удаляет.
Ввел 5 человек. Из них трое с оценками 2 и 3. Нажимаю просмотр - выводит всех.
Нажимаю удалить - три раза спрашивает, удалить-ли найденного человека. Нажимаю "да". После этого жму на просмотр - выводит двоих (тех, у которых с оценками все в норме).

Прикрепляю лог.
Вложения
Тип файла: txt log.txt (1.6 Кб, 140 просмотров)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 03.06.2009, 15:56   #7
DED_moroZ
 
Регистрация: 03.06.2009
Сообщений: 5
По умолчанию

Sazary -> ты Джедай ... молоток!!!
действительно.... перезапустил С.. поперло...
код под остальные поправлю ща (он читал тока по 1-й оценки) и все нормуль...
благодарю Sazary.
..... конечный код.... но что интересно!!! если в сторке по одной оценки <=3 - нормально удаляет, а если больше то одну строку оставляет (при повторном нажатии удаляет и её).... в чем прикол???...
void del(void)
{
spis *p, *temp;
int f[20];
char c;
int j=0;
clrscr();
printf("\nСтуденты имеющие 2 и 3:\n ");

p=head;
while (p!=NULL)
{
if(p->bal1<=3 || p->bal2<=3 || p->bal3<=3 || p->bal4<=3)
{
j++;
printf("\nНайденo:\n ");
printf("\n %s \t| %d | %d | %d | %d ",p->name, p->bal1, p->bal2, p->bal3, p->bal4);
printf("Удалить? - Y\n");
c=getch();
if (c=='y')
{
if (p==head) // если найденная запись - первая
{head=p->v2;
head->v1=NULL;
free(p);
p=head;
}

else if (p==tail) // если найденная запись - последняя
{tail=p->v1;
tail->v2=NULL;
free(p);
p=tail;
break;
}
else // удаление из средины списка
{p->v2->v1=p->v1;
p->v1->v2=p->v2;
temp=p;
p=p->v2;
free(temp);
}
printf("\nУдалено!\n");
}else break;
}
p=p->v2;
}
if(j==0) {
printf("\nНе найдено!\n");
getch();
}

Последний раз редактировалось DED_moroZ; 04.06.2009 в 07:14.
DED_moroZ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подскажите кто знает что это за файл и как его удалить Yury111 Безопасность, Шифрование 6 03.06.2009 14:54
Нужна помощь с доработкой.двусвязный список(С++).Удалить ел-т в заданой позиции. Olya90 Помощь студентам 1 28.05.2009 00:14
Подскажите как программно удалить все записи Worms БД в Delphi 3 04.03.2008 16:30
как удалить анти вирус( касперский 2006)если она не работает и ее не возможно удалить Alar Общие вопросы Delphi 0 29.10.2006 21:36