sultan

dorabotanaya_func

Jun 3rd, 2012
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale.h>
  5.  
  6.  
  7. typedef struct sp
  8. {
  9.     char name[20];
  10.     char model[20];
  11.     char color[15];
  12.     char power[6];
  13.     char year[5];
  14.     struct sp *next;
  15. }l_t;
  16.  
  17. typedef struct list
  18. {
  19.   char name[20];
  20.   char model[20];
  21.   char color[15];
  22.   char power[6];
  23.   char year[5];
  24.   struct list *next;
  25.   struct list *prior;
  26. }list_t;
  27.  
  28. list_t *newBegin;
  29. list_t *newLast;
  30. list_t *find(char *);
  31. list_t *twoBegin; // преобразованный двусвязный список
  32. list_t *twoLast;
  33. l_t *oldBegin;
  34. l_t *oldLast;
  35.  
  36.  
  37. //ввод одного поля в элемент списка
  38. void inputs(char *prompt, char *s, int count)
  39. {
  40.   char p[255];
  41.  
  42.   do
  43.   {
  44.     printf(prompt);
  45.     fgets(p, 254, stdin);
  46.     if(strlen(p) > count)
  47.         printf("\nСлишком длинная строка\n");
  48.   }
  49.   while(strlen(p) > count);
  50.  
  51.   p[strlen(p)-1] = '\0'; /* удалить символ перевода строки */
  52.   strcpy(s, p);
  53. }
  54.  
  55. //добавление элемента в двусвязный список по алфавиту
  56. void dls_store(list_t *newEl, list_t **newBegin, list_t **newLast)
  57. {
  58.   list_t *old, *p;
  59.  
  60.   if(*newLast==NULL)
  61.   {  /* первый элемент списка */
  62.     newEl->next = NULL;
  63.     newEl->prior = NULL;
  64.     *newLast = newEl;
  65.     *newBegin = newEl;
  66.     return;
  67.   }
  68.   p = *newBegin; /* начать с начала списка */
  69.  
  70.   old = NULL;
  71.   while(p!=NULL)
  72.   {
  73.     if(strcmp(p->name, newEl->name)<0)
  74.     {
  75.       old = p;
  76.       p = p->next;
  77.     }
  78.     else
  79.     {
  80.       if(p->prior)
  81.       {
  82.         p->prior->next = newEl;
  83.         newEl->next = p;
  84.         newEl->prior = p->prior;
  85.         p->prior = newEl;
  86.         return;
  87.       }
  88.       newEl->next = p; /* новый первый элемент */
  89.       newEl->prior = NULL;
  90.       p->prior = newEl;
  91.       *newBegin = newEl;
  92.       return;
  93.     }
  94.   }
  95.   old->next = newEl; /* вставка в конец */
  96.   newEl->next = NULL;
  97.   newEl->prior = old;
  98.   *newLast = newEl;
  99. }
  100.  
  101. //void dlstore(l_t *newEl, list_t **newLast)
  102. //{
  103. //
  104. //  if(*newLast==NULL)
  105. //    *newLast = newEl; /* вставка первого элемента */
  106. //  else
  107. //    (*newLast)->next = newEl;
  108. //  newEl->next = NULL;
  109. //  newEl->prior = *newLast;
  110. //  *newLast = newEl;
  111. //}
  112.  
  113.  
  114. //ввод двусвязного списка
  115. void enter(void)
  116. {
  117.   list_t *info;
  118.   int i, n;
  119.   puts("Введите количество элементов");
  120.   scanf("%d", &n);
  121.   getchar();
  122.   for(i=0;i<n;i++)
  123.   {
  124.     info = (list_t*)malloc(sizeof(list_t)+sizeof(char)*62);
  125.     if(info==NULL)
  126.     {
  127.       printf("\nОшибка выделения памяти");
  128.       return;
  129.     }
  130.     inputs("Введите марку: ", info->name, 20);
  131.     inputs("Введите модель: ", info->model, 20);
  132.     inputs("Введите цвет: ", info->color, 15);
  133.     inputs("Введите мощность: ", info->power, 6);
  134.     inputs("Введите год выпуска: ", info->year, 5);
  135.     dls_store(info, &newBegin, &newLast);
  136.   }
  137. }
  138.  
  139. int menu_select(void)
  140. {
  141.   char s[80];
  142.   int c;
  143.   fflush(stdin);
  144.  
  145.   printf("1. Ввод имени\n");
  146.   printf("2. Удаление имени\n");
  147.   printf("3. Отображение содержимого списка\n");
  148.   printf("4. Поиск\n");
  149.   printf("5. Сохранить в файл\n");
  150.   printf("6. Загрузить из файла\n");
  151.   printf("7. Ввести односвязный список\n");
  152.   printf("8. Вывести односвязный список\n");
  153.   printf("9. Преобразовать в двусвязный список\n");
  154.   printf("0. Выход\n");
  155.   do
  156.   {
  157.     printf("\nВаш выбор: ");
  158.     gets(s);
  159.     c = atoi(s);
  160.   } while(c<0 || c>9);
  161.   return c;
  162. }
  163.  
  164.  
  165. void mldelete(list_t **start, list_t **last)
  166. {
  167.   list_t *info;
  168.   char s[80];
  169.  
  170.   inputs("Введите имя: ", s, 30);
  171.   info = find(s);
  172.   if(info!=NULL)
  173.   {
  174.     if(*start==info)
  175.     {
  176.       *start=info->next;
  177.       if(*start) (*start)->prior = NULL;
  178.       else *last = NULL;
  179.     }
  180.     else
  181.     {
  182.       info->prior->next = info->next;
  183.       if(info!=*last)
  184.           info->next->prior = info->prior;
  185.       else
  186.         *last = info->prior;
  187.     }
  188.     free(info);  /* освободить память */
  189.   }
  190. }
  191.  
  192. list_t *find( char *name)
  193. {
  194.   list_t *info;
  195.  
  196.   info = newBegin;
  197.   while(info!=NULL)
  198.   {
  199.     if((strcmp(name, info->name))==0)
  200.         return info;
  201.     info = info->next;
  202.   }
  203.   printf("Имя не найдено.\n");
  204.   return NULL;
  205. }
  206.  
  207. void display(list_t *info)
  208. {
  209.     printf("%s\n", info->name);
  210.     printf("%s\n", info->model);
  211.     printf("%s\n", info->color);
  212.     printf("%s\n", info->power);
  213.     printf("%s\n", info->year);
  214.     printf("\n\n");
  215. }
  216.  
  217.  
  218. void list()
  219. {
  220.   list_t *info;
  221.  
  222.   info = newBegin;
  223.   while(info!=NULL)
  224.   {
  225.     display(info);
  226.     info = info->next;  /* перейти к следующему адресу */
  227.   }
  228.   printf("\n\n");
  229. }
  230.  
  231.  
  232. void search(void)
  233. {
  234.   char name[40];
  235.   list_t *info;
  236.  
  237.   printf("Введите имя: ");
  238.   gets(name);
  239.   info = find(name);
  240.   if(info==NULL)
  241.     printf("Не найдено\n");
  242.   else
  243.     display(info);
  244. }
  245.  
  246.  
  247. void save(void)
  248. {
  249.   list_t *info;
  250.  
  251.   FILE *fp;
  252.  
  253.   fp = fopen("list.txt", "wb");
  254.   if(fp==NULL)
  255.   {
  256.     printf("Невозможно открыть файл.\n");
  257.     exit(1);
  258.   }
  259.   printf("\nСохранение в файл\n");
  260.  
  261.   info = newBegin;
  262.   while(info!=NULL)
  263.   {
  264.     fwrite(info, sizeof(list_t), 1, fp);
  265.     info = info->next;  /* перейти к следующему адресу */
  266.   }
  267.   fclose(fp);
  268. }
  269.  
  270.  
  271. void load()
  272. {
  273.   list_t *info;
  274.   FILE *fp;
  275.  
  276.   fp = fopen("list.txt", "rb");
  277.   if(fp==NULL)
  278.   {
  279.     printf("Невозможно открыть файл.\n");
  280.     exit(1);
  281.   }
  282.  
  283.   /* освободить память, если в памяти уже есть список */
  284.   while(newBegin!=NULL)
  285.   {
  286.     info = newBegin->next;
  287.     free(info);
  288.     newBegin = info;
  289.   }
  290.  
  291.   /* сбросить указатели на начало и конец */
  292.   newBegin = newLast = NULL;
  293.  
  294.   printf("\nЗагрузка из файла\n");
  295.   while(!feof(fp))
  296.   {
  297.     info = (list_t*) malloc(sizeof(list_t));
  298.     if(info==NULL)
  299.     {
  300.       printf("Нет свободной памяти");
  301.       return;
  302.     }
  303.     if(1 != fread(info, sizeof(list_t), 1, fp))
  304.         break;
  305.     dls_store(info, &newBegin, &newLast);
  306.   }
  307.   fclose(fp);
  308. }
  309.  
  310. //сортировка односвязного списка
  311. void dls_store_od(l_t *newEl, l_t **oldBegin, l_t **oldLast)
  312. {
  313.   l_t *p, *old;
  314.  
  315.   if(*oldLast==NULL)
  316.   {  /* первый элемент списка */
  317.     newEl->next = NULL;
  318.     //newEl->prior = NULL;
  319.     *oldLast = newEl;
  320.     *oldBegin = newEl;
  321.     return;
  322.   }
  323.   p = *oldBegin; /* начать с начала списка */
  324.  
  325.   old = NULL;
  326.   while(p!=NULL)
  327.   {
  328.     if(strcmp(p->name, newEl->name)<0)
  329.     {
  330.       old = p;
  331.       p = p->next;
  332.     }
  333.     else
  334.     {
  335.       if(old)
  336.       {
  337.         old->next = newEl;
  338.         newEl->next = p;
  339.         return;
  340.       }
  341.       newEl->next = p; /* новый первый элемент */
  342.       old = newEl;
  343.       *oldBegin = newEl;
  344.       return;
  345.     }
  346.   }
  347.   old->next = newEl; /* вставка в конец */
  348.   newEl->next = NULL;
  349.   //newEl->prior = old;
  350.   *oldLast = newEl;
  351. }
  352.  
  353.  
  354. void enter_od(void)
  355. {
  356.   l_t *info;
  357.   int i, n;
  358.   puts("Введите количество элементов");
  359.   scanf("%d", &n);
  360.   getchar();
  361.   for(i=0;i<n;i++)
  362.   {
  363.     info = (l_t*)malloc(sizeof(l_t)+sizeof(char)*62);
  364.     if(info==NULL)
  365.     {
  366.       printf("\nНет свободной памяти");
  367.       return;
  368.     }
  369.     inputs("Введите марку: ", info->name, 20);
  370.     inputs("Введите модель: ", info->model, 20);
  371.     inputs("Введите цвет: ", info->color, 15);
  372.     inputs("Введите мощность: ", info->power, 6);
  373.     inputs("Введите год выпуска: ", info->year, 5);
  374.     dls_store_od(info, &oldBegin, &oldLast);
  375.   }
  376. }
  377.  
  378. void list_od()
  379. {
  380.   l_t *info;
  381.  
  382.   info = oldBegin;
  383.   while(info)
  384.   {
  385.     //display(info);
  386.     printf("%s\n", info->name);
  387.     printf("%s\n", info->model);
  388.     printf("%s\n", info->color);
  389.     printf("%s\n", info->power);
  390.     printf("%s\n", info->year);
  391.     printf("\n\n");
  392.     info = info->next;  /* перейти к следующему адресу */
  393.   }
  394.   printf("\n\n");
  395. }
  396.  
  397. //l_t* new_list(int exc)
  398. //{
  399. //    list_t *info;// *newEl;
  400. //    l_t *newEl;
  401. //    while(newBegin!=NULL)
  402. //    {
  403. //        info = newBegin->next;
  404. //        free(info);
  405. //        newBegin = info;
  406. //    }
  407. //    int i = 1;
  408. //    newEl = info;
  409. //    while (oldBegin != NULL)
  410. //    {
  411. //        if(i++ ==exc)
  412. //            oldBegin = oldBegin->next;
  413. //        else
  414. //        {
  415. //            dlstore(newEL, newLast);
  416. //            oldBegin = oldBegin->next;
  417. //        }
  418. //
  419. //    }
  420. //    return newBegin;
  421. //}
  422.  
  423. //преобразуем элемент односвязного списка в двусвязный
  424. list_t *prisv(l_t *stp,list_t *left, list_t *right)
  425. {
  426.     list_t *tm;
  427.     tm = (list_t*)malloc(sizeof(list_t));
  428.     strcpy(tm->name, stp->name);
  429.     strcpy(tm->color, stp->color);
  430.     strcpy(tm->power, stp->power);
  431.     strcpy(tm->year, stp->year);
  432.     strcpy(tm->model, stp->model);
  433.     tm->prior = left;
  434.     tm->next = right;
  435.     free(stp);
  436.     return tm;
  437. }
  438.  
  439. //вывод преобразованного двусвязного списка
  440. void print_two_sp()
  441. {
  442.     list_t *t = twoBegin;
  443.     while (t != NULL)
  444.     {
  445.         display(t);
  446.         t = t->next;
  447.     }
  448. }
  449.  
  450. //перевод односвязного списка в двухсвязный
  451. void transfer()
  452. {
  453.     printf("Введите номер элемента в односвязном списке: ");
  454.     int num, kol;
  455.     scanf("%d", &num);
  456.     if (oldLast == NULL)
  457.     {
  458.         puts("Нет односвязного списка");
  459.         return;
  460.     }
  461.  
  462.     kol=1;
  463.     l_t *p;
  464.     list_t *l,*tmp;
  465.     if ( kol!= num)
  466.     {
  467.         p = oldBegin->next;
  468.         twoLast = prisv(oldBegin, NULL, NULL);
  469.         l = twoLast;
  470.     }
  471.     else
  472.     {
  473.         if ( oldBegin->next == NULL)
  474.         {
  475.             twoBegin=NULL;
  476.             twoLast=NULL;
  477.             printf("Создан пустой список\n");
  478.         }
  479.         p = oldBegin->next->next;
  480.         twoLast = prisv(oldBegin->next, NULL, NULL);
  481.         l = twoLast;
  482.     }
  483.     while (p->next != NULL )
  484.     {
  485.         kol++;
  486.         if ( num == kol)
  487.         {
  488.             p = p->next;
  489.             continue;
  490.         }
  491.         tmp = prisv(p, NULL, l);
  492.         l->prior = tmp;
  493.         l = tmp;
  494.         p = p->next;
  495.     }
  496.  
  497.     kol++;
  498.     if ( kol ==  num)
  499.     {
  500.         twoBegin = l;
  501.     }
  502.     else
  503.     {
  504.         twoBegin = prisv(p, NULL, l);
  505.         l->prior = twoBegin;
  506.     }
  507.     printf("Преобразование завершено успешно\n");
  508.     print_two_sp();
  509.     return;
  510. }
  511.  
  512.  
  513. int main(void)
  514. {
  515.     setlocale(LC_CTYPE,"Russian");
  516.   newLast = newBegin = NULL;
  517.   oldBegin = oldLast = NULL;
  518.   for(;;)
  519.   {
  520.     switch(menu_select())
  521.     {
  522.         case 1:
  523.             enter();
  524.             break;
  525.         case 2:
  526.             mldelete(&newBegin, &newLast);
  527.             break;
  528.         case 3:
  529.             list();
  530.             break;
  531.         case 4:
  532.             search();
  533.             break;
  534.         case 5:
  535.             save();
  536.             break;
  537.         case 6:
  538.             load();
  539.             break;
  540.         case 7:
  541.             enter_od();
  542.             break;
  543.         case 8:
  544.             list_od();
  545.             break;
  546.         case 9:
  547.             transfer();
  548.             break;
  549.         case 0:
  550.             exit(0);
  551.     }
  552.   }
  553.   return 0;
  554. }
Advertisement
Add Comment
Please, Sign In to add comment