NickAndNick

Линейный двусвязный список. Ввод. Сортировка. Вывод

Nov 18th, 2012
438
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale.h>
  5. #include <Windows.h>
  6. #include <tchar.h>
  7. #include <limits.h>
  8.  
  9. #define DATE_SIZE 11
  10. #define FIO_SIZE 21
  11.  
  12. typedef struct Node{
  13.     int number;
  14.     int summa;
  15.     char date[DATE_SIZE];
  16.     char fio[FIO_SIZE];
  17.     struct Node * prev;
  18.     struct Node * next;
  19. } NODE;
  20. typedef NODE * PNODE;
  21.  
  22. enum ui {
  23.     MENU,
  24.     ERROR_INPUT,
  25.     NEW_RECORD,
  26.     FIO_INPUT,
  27.     WAYBILL_NUMBER_INPUT,
  28.     DATE_INPUT,
  29.     SUMMA_INPUT,
  30.     SHOW_TABLE,
  31.     HEADERS,
  32.     LINE_HEAD,
  33.     LINE
  34. };
  35.  
  36. PNODE add_list(PNODE);
  37. void menu(PNODE);
  38. void sort(PNODE);
  39. void print(PNODE);
  40. PNODE clear(PNODE);
  41. void msg(int);
  42.  
  43. int main() {
  44.    
  45.     PNODE beg = NULL;
  46.     system("color 9B");
  47.     SetConsoleTitleW(_T("Линейный двусвязный список"));
  48.     menu(beg);
  49.     return 0;
  50. }
  51.  
  52. void menu(PNODE beg) {
  53.  
  54.     int k;
  55.  
  56.     do {
  57.  
  58.         k = INT_MAX;
  59.  
  60.         msg(MENU);
  61.  
  62.         scanf_s("%i", &k);
  63.  
  64.         switch (k) {
  65.             case 1 :
  66.                 beg = add_list(beg);
  67.                 break;
  68.             case 2 :
  69.                 print(beg);
  70.                 break;
  71.             case 3 :
  72.                 sort(beg);
  73.                 print(beg);
  74.                 break;
  75.             case 4 :
  76.                 beg = clear(beg);
  77.                 beg = NULL;
  78.                 exit(0);
  79.             default:
  80.                 msg(ERROR_INPUT);
  81.                 fflush(stdin);
  82.         }
  83.  
  84.     } while (k);
  85. }
  86.  
  87. PNODE clear(PNODE beg) {
  88.  
  89.     PNODE p = beg;
  90.  
  91.     while (p != NULL) {
  92.         beg = p->next;
  93.         free (p);
  94.         p = beg;
  95.     }
  96.  
  97.     return beg;
  98. }
  99.  
  100. PNODE add_list(PNODE beg){
  101.  
  102.     PNODE p = (PNODE)malloc(sizeof(NODE));
  103.     PNODE r;
  104.  
  105.     if (beg == NULL) {
  106.  
  107.         msg(NEW_RECORD);
  108.  
  109.         msg(FIO_INPUT);
  110.         fflush(stdin);
  111.         gets_s(p->fio, FIO_SIZE);
  112.         if (p->fio[0] == '\0') return beg;
  113.  
  114.         msg(WAYBILL_NUMBER_INPUT);
  115.         scanf_s("%d", &p->number);
  116.  
  117.         msg(DATE_INPUT);
  118.         fflush(stdin);
  119.         gets_s(p->date, DATE_SIZE);
  120.  
  121.         msg(SUMMA_INPUT);
  122.         scanf_s("%i", &p->summa);
  123.  
  124.         p->next = NULL;
  125.         p->prev = NULL;
  126.         beg = p;
  127.  
  128.     } else {
  129.  
  130.         r = (PNODE)malloc(sizeof(NODE));
  131.         r = beg;
  132.  
  133.         while (r->next != NULL) r = r->next;
  134.  
  135.             msg(NEW_RECORD);
  136.  
  137.             msg(FIO_INPUT);
  138.             fflush(stdin);
  139.             gets_s(p->fio, FIO_SIZE);
  140.             if (p->fio[0] == '\0') return beg;
  141.  
  142.             msg(WAYBILL_NUMBER_INPUT);
  143.             scanf_s("%d", &p->number);
  144.  
  145.             msg(DATE_INPUT);
  146.             fflush(stdin);
  147.             gets_s(p->date, DATE_SIZE);
  148.  
  149.             msg(SUMMA_INPUT);
  150.             scanf_s("%i", &p->summa);
  151.  
  152.             r->next = p;
  153.             p->prev = r;
  154.             p->next = NULL;
  155.  
  156.     }
  157.  
  158.     return beg;
  159. }
  160.  
  161. void print(PNODE beg) {    
  162.  
  163.     PNODE p = beg;
  164.     int k = 0;
  165.  
  166.     if (p == NULL) return;
  167.  
  168.     msg(SHOW_TABLE);
  169.     msg(LINE_HEAD);
  170.     msg(HEADERS);
  171.     msg(LINE_HEAD);
  172.  
  173.     while (p != NULL) {
  174.  
  175.         if (k++) printf("\n");
  176.  
  177.         printf("|%9i", p->number);
  178.         printf("|%12s|", p->date);
  179.         printf("%13i|", p->summa);
  180.         printf("%38s|\n", p->fio);
  181.         msg(LINE);
  182.  
  183.         p = p->next;
  184.  
  185.     }
  186.  
  187.     return;
  188. }
  189.  
  190. void sort(PNODE beg) {
  191.  
  192.     PNODE tmp;
  193.     PNODE a;
  194.     int _number;
  195.     int _summa;
  196.     char _date[DATE_SIZE];
  197.     char _fio[FIO_SIZE];
  198.     int flag = 1;
  199.  
  200.     if (beg == NULL) return;
  201.  
  202.     while (flag == 1) {
  203.  
  204.         tmp = beg;
  205.         a = tmp->next;
  206.         flag = 0;
  207.  
  208.         while (a) {
  209.  
  210.             if ((tmp->number) > (a->number)) {
  211.  
  212.                 _number = tmp->number;
  213.                 tmp->number = a->number;
  214.                 a->number = _number;
  215.  
  216.                 _summa = tmp->summa;
  217.                 tmp->summa = a->summa;
  218.                 a->summa = _summa;
  219.  
  220.                 strcpy_s(_date, DATE_SIZE, tmp->date);
  221.                 strcpy_s(tmp->date, DATE_SIZE, a->date);
  222.                 strcpy_s(a->date, DATE_SIZE, _date);
  223.  
  224.                 strcpy_s(_fio, FIO_SIZE, tmp->fio);
  225.                 strcpy_s(tmp->fio, FIO_SIZE, a->fio);
  226.                 strcpy_s(a->fio, FIO_SIZE, _fio);
  227.  
  228.                 flag = 1;
  229.             }
  230.  
  231.             tmp = tmp->next;
  232.             a = a->next;
  233.         }
  234.     }
  235. }
  236.  
  237. void msg(int command) {
  238.     setlocale(LC_CTYPE, "Russian_Russia.1251");
  239.     switch (command) {
  240.         case MENU: printf("\n 1. Добавить запись\n 2. Показать список\n 3. Сортировать список\n 4. Выход из программы\n\tВыбор: "); break;
  241.         case ERROR_INPUT: printf("\a\t Ошибка!\n\t"); break;
  242.         case NEW_RECORD: printf("\t\t\tДобавление новой записи\n"); break;
  243.         case FIO_INPUT:    printf("\n Введите ФИО:         "); break;
  244.         case WAYBILL_NUMBER_INPUT: printf(" Введите № накладной: "); break;
  245.         case DATE_INPUT: printf(" Введите дату:        "); break;
  246.         case SUMMA_INPUT: printf(" Введите сумму:       "); break;
  247.         case SHOW_TABLE: printf("\t\t\tСводная таблица\n"); break;
  248.         case HEADERS: printf("|  Номер  |    Дата    |    Сумма    |               ФИО                    |\n"); break;
  249.         case LINE_HEAD: printf("-----------------------------------------------------------------------------\n"); break;
  250.         case LINE: printf("-----------------------------------------------------------------------------"); break;
  251.     }
  252.     setlocale(LC_CTYPE, "English_United States.866");
  253. }
RAW Paste Data