sultan

andrei_func

May 30th, 2012
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.10 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.  
  144.   printf("1. Ввод имени\n");
  145.   printf("2. Удаление имени\n");
  146.   printf("3. Отображение содержимого списка\n");
  147.   printf("4. Поиск\n");
  148.   printf("5. Сохранить в файл\n");
  149.   printf("6. Загрузить из файла\n");
  150.   printf("7. Ввести односвязный список\n");
  151.   printf("8. Вывести односвязный список\n");
  152.   printf("9. Преобразовать в двусвязный список\n");
  153.   printf("0. Выход\n");
  154.   do
  155.   {
  156.     printf("\nВаш выбор: ");
  157.     gets(s);
  158.     c = atoi(s);
  159.   } while(c<0 || c>9);
  160.   return c;
  161. }
  162.  
  163.  
  164. void mldelete(list_t **start, list_t **last)
  165. {
  166.   list_t *info;
  167.   char s[80];
  168.  
  169.   inputs("Введите имя: ", s, 30);
  170.   info = find(s);
  171.   if(info!=NULL)
  172.   {
  173.     if(*start==info)
  174.     {
  175.       *start=info->next;
  176.       if(*start) (*start)->prior = NULL;
  177.       else *last = NULL;
  178.     }
  179.     else
  180.     {
  181.       info->prior->next = info->next;
  182.       if(info!=*last)
  183.           info->next->prior = info->prior;
  184.       else
  185.         *last = info->prior;
  186.     }
  187.     free(info);  /* освободить память */
  188.   }
  189. }
  190.  
  191. list_t *find( char *name)
  192. {
  193.   list_t *info;
  194.  
  195.   info = newBegin;
  196.   while(info!=NULL)
  197.   {
  198.     if((strcmp(name, info->name))==0)
  199.         return info;
  200.     info = info->next;
  201.   }
  202.   printf("Имя не найдено.\n");
  203.   return NULL;
  204. }
  205.  
  206. void display(list_t *info)
  207. {
  208.     printf("%s\n", info->name);
  209.     printf("%s\n", info->model);
  210.     printf("%s\n", info->color);
  211.     printf("%s\n", info->power);
  212.     printf("%s\n", info->year);
  213.     printf("\n\n");
  214. }
  215.  
  216.  
  217. void list()
  218. {
  219.   list_t *info;
  220.  
  221.   info = newBegin;
  222.   while(info!=NULL)
  223.   {
  224.     display(info);
  225.     info = info->next;  /* перейти к следующему адресу */
  226.   }
  227.   printf("\n\n");
  228. }
  229.  
  230.  
  231. void search(void)
  232. {
  233.   char name[40];
  234.   list_t *info;
  235.  
  236.   printf("Введите имя: ");
  237.   gets(name);
  238.   info = find(name);
  239.   if(info==NULL)
  240.     printf("Не найдено\n");
  241.   else
  242.     display(info);
  243. }
  244.  
  245.  
  246. void save(void)
  247. {
  248.   list_t *info;
  249.  
  250.   FILE *fp;
  251.  
  252.   fp = fopen("list.txt", "wb");
  253.   if(fp==NULL)
  254.   {
  255.     printf("Невозможно открыть файл.\n");
  256.     exit(1);
  257.   }
  258.   printf("\nСохранение в файл\n");
  259.  
  260.   info = newBegin;
  261.   while(info!=NULL)
  262.   {
  263.     fwrite(info, sizeof(list_t), 1, fp);
  264.     info = info->next;  /* перейти к следующему адресу */
  265.   }
  266.   fclose(fp);
  267. }
  268.  
  269.  
  270. void load()
  271. {
  272.   list_t *info;
  273.   FILE *fp;
  274.  
  275.   fp = fopen("list.txt", "rb");
  276.   if(fp==NULL)
  277.   {
  278.     printf("Невозможно открыть файл.\n");
  279.     exit(1);
  280.   }
  281.  
  282.   /* освободить память, если в памяти уже есть список */
  283.   while(newBegin!=NULL)
  284.   {
  285.     info = newBegin->next;
  286.     free(info);
  287.     newBegin = info;
  288.   }
  289.  
  290.   /* сбросить указатели на начало и конец */
  291.   newBegin = newLast = NULL;
  292.  
  293.   printf("\nЗагрузка из файла\n");
  294.   while(!feof(fp))
  295.   {
  296.     info = (list_t*) malloc(sizeof(list_t));
  297.     if(info==NULL)
  298.     {
  299.       printf("Нет свободной памяти");
  300.       return;
  301.     }
  302.     if(1 != fread(info, sizeof(list_t), 1, fp))
  303.         break;
  304.     dls_store(info, &newBegin, &newLast);
  305.   }
  306.   fclose(fp);
  307. }
  308.  
  309. //сортировка односвязного списка
  310. void dls_store_od(l_t *newEl, l_t **oldBegin, l_t **oldLast)
  311. {
  312.   l_t *p, *old;
  313.  
  314.   if(*oldLast==NULL)
  315.   {  /* первый элемент списка */
  316.     newEl->next = NULL;
  317.     //newEl->prior = NULL;
  318.     *oldLast = newEl;
  319.     *oldBegin = newEl;
  320.     return;
  321.   }
  322.   p = *oldBegin; /* начать с начала списка */
  323.  
  324.   old = NULL;
  325.   while(p!=NULL)
  326.   {
  327.     if(strcmp(p->name, newEl->name)<0)
  328.     {
  329.       old = p;
  330.       p = p->next;
  331.     }
  332.     else
  333.     {
  334.       if(old)
  335.       {
  336.         old->next = newEl;
  337.         newEl->next = p;
  338.         return;
  339.       }
  340.       newEl->next = p; /* новый первый элемент */
  341.       old = newEl;
  342.       *oldBegin = newEl;
  343.       return;
  344.     }
  345.   }
  346.   old->next = newEl; /* вставка в конец */
  347.   newEl->next = NULL;
  348.   //newEl->prior = old;
  349.   *oldLast = newEl;
  350. }
  351.  
  352.  
  353. void enter_od(void)
  354. {
  355.   l_t *info;
  356.   int i, n;
  357.   puts("Введите количество элементов");
  358.   scanf("%d", &n);
  359.   getchar();
  360.   for(i=0;i<n;i++)
  361.   {
  362.     info = (l_t*)malloc(sizeof(l_t)+sizeof(char)*62);
  363.     if(info==NULL)
  364.     {
  365.       printf("\nНет свободной памяти");
  366.       return;
  367.     }
  368.     inputs("Введите марку: ", info->name, 20);
  369.     inputs("Введите модель: ", info->model, 20);
  370.     inputs("Введите цвет: ", info->color, 15);
  371.     inputs("Введите мощность: ", info->power, 6);
  372.     inputs("Введите год выпуска: ", info->year, 5);
  373.     dls_store_od(info, &oldBegin, &oldLast);
  374.   }
  375. }
  376.  
  377. void list_od()
  378. {
  379.   l_t *info;
  380.  
  381.   info = oldBegin;
  382.   while(info)
  383.   {
  384.     //display(info);
  385.     printf("%s\n", info->name);
  386.     printf("%s\n", info->model);
  387.     printf("%s\n", info->color);
  388.     printf("%s\n", info->power);
  389.     printf("%s\n", info->year);
  390.     printf("\n\n");
  391.     info = info->next;  /* перейти к следующему адресу */
  392.   }
  393.   printf("\n\n");
  394. }
  395.  
  396. //l_t* new_list(int exc)
  397. //{
  398. //    list_t *info;// *newEl;
  399. //    l_t *newEl;
  400. //    while(newBegin!=NULL)
  401. //    {
  402. //        info = newBegin->next;
  403. //        free(info);
  404. //        newBegin = info;
  405. //    }
  406. //    int i = 1;
  407. //    newEl = info;
  408. //    while (oldBegin != NULL)
  409. //    {
  410. //        if(i++ ==exc)
  411. //            oldBegin = oldBegin->next;
  412. //        else
  413. //        {
  414. //            dlstore(newEL, newLast);
  415. //            oldBegin = oldBegin->next;
  416. //        }
  417. //
  418. //    }
  419. //    return newBegin;
  420. //}
  421.  
  422. //преобразуем элемент односвязного списка в двусвязный
  423. list_t *prisv(l_t *stp,l_t *left, l_t *right)
  424. {
  425.     list_t *tm;
  426.     tm = (list_t*)malloc(sizeof(list_t));
  427.     strcpy(tm->name, stp->name);
  428.     strcpy(tm->color, stp->color);
  429.     strcpy(tm->power, stp->power);
  430.     strcpy(tm->year, stp->year);
  431.     strcpy(tm->model, stp->model);
  432.     tm->prior = left;
  433.     tm->next = right;
  434.     free(stp);
  435.     return tm;
  436. }
  437.  
  438. //вывод преобразованного двусвязного списка
  439. void print_two_sp()
  440. {
  441.     list_t *t = twoBegin;
  442.     while (t != NULL)
  443.     {
  444.         display(t);
  445.         t = t->next;
  446.     }
  447. }
  448.  
  449. //перевод односвязного списка в двухсвязный
  450. void transfer()
  451. {
  452.     if (oldLast == NULL)
  453.     {
  454.         puts("Нет односвязного списка");
  455.         return;
  456.     }
  457.  
  458.     l_t *p = oldBegin->next;
  459.     twoLast = prisv(oldBegin, oldBegin->next, NULL);
  460.     list_t *l = twoLast, *tmp;
  461.  
  462.     while (p->next != NULL )
  463.     {
  464.         tmp = l->prior;
  465.         tmp = prisv(p, p->next, l);
  466.         l = tmp;
  467.         p = p->next;
  468.     }
  469.  
  470.     twoBegin = prisv(p, NULL, l);
  471.     printf("Преобразование завершено успешно\n");
  472.     print_two_sp();
  473.     return;
  474. }
  475.  
  476.  
  477. int main(void)
  478. {
  479.     setlocale(LC_CTYPE,"Russian");
  480.   newLast = newBegin = NULL;
  481.   oldBegin = oldLast = NULL;
  482.   for(;;)
  483.   {
  484.     switch(menu_select())
  485.     {
  486.         case 1:
  487.             enter();
  488.             break;
  489.         case 2:
  490.             mldelete(&newBegin, &newLast);
  491.             break;
  492.         case 3:
  493.             list();
  494.             break;
  495.         case 4:
  496.             search();
  497.             break;
  498.         case 5:
  499.             save();
  500.             break;
  501.         case 6:
  502.             load();
  503.             break;
  504.         case 7:
  505.             enter_od();
  506.             break;
  507.         case 8:
  508.             list_od();
  509.             break;
  510.         case 9:
  511.             transfer();
  512.             break;
  513.         case 0:
  514.             exit(0);
  515.     }
  516.   }
  517.   return 0;
  518. }
Advertisement
Add Comment
Please, Sign In to add comment