Advertisement
Val_Kir

2lab11

Oct 5th, 2016
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.90 KB | None | 0 0
  1. /*  Создать двунаправленный список с ключом строкой.
  2.     Ввести с клавиатуры строку, если
  3.     она есть в списке, удалить все её вхождения,
  4.     иначе добавить её в начало списка.
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10.  
  11. struct Node {
  12.     Node *next,*prev;
  13.     char k[256];
  14. };
  15.  
  16. Node *add_to_list(Node *l, char *k) //добавление нового элемента
  17. {
  18.     Node *n=new Node, *rest; //новый элемент, остаток
  19.     if(l!=0) //если список не пуст
  20.     {
  21.         n->next=l;
  22.         l->prev=n;
  23.         n->prev=0;//заносим 0, тк добавление в начало списка
  24.         l=n;//переназначаем вершину
  25.         strcpy(l->k,k); //копируем значение в инф поле
  26.         return l;
  27.     }
  28.     else
  29.     {
  30.         strcpy(n->k,k);//копируем значение
  31.         n->next=0;
  32.         n->prev=0;
  33.         return n;
  34.     }
  35. }
  36.  
  37. void print_and_del(Node *l)//вывести и удалить
  38. {
  39.     Node *rest;//остаток
  40.     while(l!=0)//если список не пуст
  41.     {
  42.         printf("%s\n",l->k); //выводим значения
  43.         rest=l->next;//переприсваиваем вершину
  44.         delete l;//удаляем старую вершину
  45.         l=rest;//записываем новую
  46.     }
  47. }
  48.  
  49. Node *del(Node *l)//удаление
  50. {
  51.     Node *rest=0;
  52.     if(l!=0)
  53.     {
  54.         rest=l->next;//остаток
  55.         if(l->prev!=0)
  56.         {
  57.             l->prev->next=rest;
  58.             if(rest!=0)rest->prev=l->prev; //если елемент не последний
  59.         }
  60.         else
  61.             if(rest!=0) rest->prev=0;
  62.  
  63.         delete l;
  64.     }
  65.     return rest;
  66. }
  67.  
  68.  
  69. void main(void)
  70. {
  71.     Node *list=0,*next,*cur; //список, следующий узел, текущий узел
  72.     bool f=false;//для проверки наличия вхождений
  73.     char s[256]; //строка
  74.     printf("Enter a string (finish string .end.): ");
  75.     scanf("%s", s);
  76.     while(strcmp(s,"end"))
  77.     {
  78.         list=add_to_list(list,s);
  79.         scanf("%s",s);
  80.     }
  81.     printf("string: ");
  82.     scanf("%s", s);//строка
  83.  
  84.     cur=list; //присваиваем текущему элементу значение вершины
  85.     while(cur!=0) //пока тек. эл. не равен 0
  86.     {
  87.         if(!strcmp(cur->k,s)) //если тек.эл. равен строке
  88.         {
  89.             if(cur==list)// если тек. эл. равен вершине
  90.                 list=next=del(cur); //удаляем
  91.             else
  92.                 next=del(cur);//удаляем тек.эл.
  93.             f=true; //ставим флажок, что было вхождение
  94.         }
  95.         else
  96.         {
  97.             next=cur->next; //идес к след. узлу
  98.         }
  99.         cur=next; //тек.эл. становится след.
  100.     }
  101.    
  102.     if (!f) list=add_to_list(list,s); //если вхождений не было, то заносим строку в начало списка
  103.     print_and_del(list); //выводим и удаляем
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement