Работа с двусвязным списком - создание, просмотр, добавление и редактирование записей - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброе время суток! Практически моя вторая программа на Си, которую пытаюсь сделать сама. Взяла из разных примеров. Вроде всё работает как надо. Если увидите какие-то очевидные неочевидности, ошибки, недочеты, прошу указать. Задание: Разработать программу для создания и работы с двусвязным списком, состоящим из структур. Для работы со списком создать меню со следующими пунктами: 1. Создание списка. 2. Просмотр списка. 3. Добавление в конец списка новой структуры. 4. Корректировка списка. 5. Выход. Структура содержит название издания, газета или журнал, цена экземпляра. Добавлять новые записи так, чтобы сначала располагались журналы, затем газеты. Вот что получилось:
  #include <stdio.h>
 #include <conio.h>
 #include <alloc.h>
 #include <string.h>
 #include <stdlib.h>
 
 struct spis
 { char izdat[30];
   int type;
   int price;
   struct spis *prev;              
   struct spis *next; 
 };
 
 void create(void); // создание
 void display(void); // просмотр
 void add(void); // добавление в конец списка
 void sort(void); // сортировка (вначале - журналы, потом газеты)
 struct spis *head,*tail; // указатели на начало и конец списка
 
 main()
 { char c;
   FILE *tf;
   while (1)
   { clrscr();
     puts(" 1 - create list"); // создать список
     puts(" 2 - view list"); // показать список
     puts(" 3 - add to the end of list"); // добавить в конец списка
     puts(" 4 - sort list"); // сортировка списка
     puts(" 0 - escape"); // выход
     c=getch();
     switch(c)
     { case '1':create();break;
       case '2':display();break;
       case '3':add();break;
       case '4':sort();break;
       case '0':return 0;
       default : puts("wrong choice");
     }
   }
 }
 
 void create()
 
 { spis *p,*pred;
   pred=NULL;
   clrscr();
   printf("\n Vvedite spisok \n");
   do { p=(spis *)malloc(sizeof(spis));
        printf("Izdatelstvo: "); scanf("%s",p->izdat);
        printf("\n Vid izdanija: Gazeta - 1; Jurnal - 2: "); scanf("%d", &p->type);
        printf("\n Cena: ");  scanf("%d", &p->price);
        p->prev=pred;
        if (pred != NULL)
            pred->next=p;
        else
            head=p;
            pred=p;
            puts(" Zakoncit` - <esc>");
      }
   while (getch()!=27);
   tail=p;
   tail->next=NULL;
 }
 
 void display()
 { spis *p = head;
   while (p != NULL)
                { printf("%30s  ", p->izdat);
                  if (p->type == 1)
                      printf("Gazeta");
                  else
                      printf("Jurnal");
                  printf("%10d\n", p->price);
                  p = p->next;
 
                 }
  getch();
 } 
 
 void add()
 { spis *p 
   printf("\n Vvedite novje dannje \n");
   clrscr();
   do { p=(spis *)malloc(sizeof(spis)); // Выделяем динамическую память
        printf("Izdatelstvo: "); scanf("%s",p->izdat);
        printf("\n Vid izdanija: Gazeta - 1; Jurnal - 2: "); scanf("%d", &p->type);
        printf("\n Cena: ");  scanf("%d", &p->price);
        p->prev = NULL;
        p->next = NULL;
        if (head == NULL) // Если список пустой
        head = tail = p;
        else 
        { tail->next = p;
          p->prev = tail;
          tail = p;
          puts(" Zakonchit` - <esc>");
        }
       }
   while (getch()!=27);
 }
 
int ListSize()
 { int n = 0;
   spis *p = head;
   while (p != NULL)
       { n++;
         p = p->next;
       }
   return n;
 }
 
 void sort()
 { spis *p;
   char s[30];  
   int k;
   int n = ListSize();
   for (int i = 1; i <= n - 1; i++) 
       { p = head;
         for (int j = 1; j <= n - i; j++) 
             { if (p->type < p->next->type) 
                   { strcpy(s, p->izdat);
                     strcpy(p->izdat, p->next->izdat);
                     strcpy(p->next->izdat, s);
                     k = p->type;
                     p->type = p->next->type;
                     p->next->type = k;
                     k = p->price;
                     p->price = p->next->price;
                     p->next->price = k;
                   }
               p = p->next;
             }
       }
 }
Конечно нужно еще подработать вывод на экран, но это уже второе дело. Главное, чтобы логически и концептуально все было правильно. Буду рада помощи. Пока вот что заметила: Если в меню выбрать не 1,2,3,4,0, а другое значение, по идее должно выйти сообщение wrong choice (неправильный выбор), а этого не происходит. В общем, кто чем может. Жду конструктивной критики и/или исправлений.

Решение задачи: «Работа с двусвязным списком - создание, просмотр, добавление и редактирование записей»

textual
Листинг программы
#include <stdio.h>
 
int main(){
    int c;
    for(;;){
    // или while(1); 
        printf("Вид издания: Газета - 1; Журнал - 2: ");
        scanf("%d%*c", &c);
        if(c == 1 || c == 2){
            break;
        } else {
            printf("Некорректный выбор\n");
        }
    }
    return 0;
}

Объяснение кода листинга программы

  1. Подключение стандартной библиотеки для работы с консолью (stdio.h).
  2. Объявление переменной типа int с именем c.
  3. Запуск бесконечного цикла while(1), который будет выполняться до тех пор, пока не будет введено корректное значение.
  4. Внутри цикла выводится сообщение с запросом ввода значения переменной c.
  5. При помощи функции scanf() происходит считывание значения переменной c.
  6. Если значение переменной c равно 1 или 2, то цикл прерывается.
  7. Если значение переменной c не равно 1 или 2, то выводится сообщение об ошибке.
  8. После выхода из цикла происходит возврат в основную программу и завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5
Похожие ответы