Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Создать двунаправленный список с ключом строкой.
- Ввести с клавиатуры строку, если
- она есть в списке, удалить все её вхождения,
- иначе добавить её в начало списка.
- */
- #include <stdio.h>
- #include <string.h>
- struct Node {
- Node *next,*prev;
- char k[256];
- };
- Node *add_to_list(Node *l, char *k) //добавление нового элемента
- {
- Node *n=new Node, *rest; //новый элемент, остаток
- if(l!=0) //если список не пуст
- {
- n->next=l;
- l->prev=n;
- n->prev=0;//заносим 0, тк добавление в начало списка
- l=n;//переназначаем вершину
- strcpy(l->k,k); //копируем значение в инф поле
- return l;
- }
- else
- {
- strcpy(n->k,k);//копируем значение
- n->next=0;
- n->prev=0;
- return n;
- }
- }
- void print_and_del(Node *l)//вывести и удалить
- {
- Node *rest;//остаток
- while(l!=0)//если список не пуст
- {
- printf("%s\n",l->k); //выводим значения
- rest=l->next;//переприсваиваем вершину
- delete l;//удаляем старую вершину
- l=rest;//записываем новую
- }
- }
- Node *del(Node *l)//удаление
- {
- Node *rest=0;
- if(l!=0)
- {
- rest=l->next;//остаток
- if(l->prev!=0)
- {
- l->prev->next=rest;
- if(rest!=0)rest->prev=l->prev; //если елемент не последний
- }
- else
- if(rest!=0) rest->prev=0;
- delete l;
- }
- return rest;
- }
- void main(void)
- {
- Node *list=0,*next,*cur; //список, следующий узел, текущий узел
- bool f=false;//для проверки наличия вхождений
- char s[256]; //строка
- printf("Enter a string (finish string .end.): ");
- scanf("%s", s);
- while(strcmp(s,"end"))
- {
- list=add_to_list(list,s);
- scanf("%s",s);
- }
- printf("string: ");
- scanf("%s", s);//строка
- cur=list; //присваиваем текущему элементу значение вершины
- while(cur!=0) //пока тек. эл. не равен 0
- {
- if(!strcmp(cur->k,s)) //если тек.эл. равен строке
- {
- if(cur==list)// если тек. эл. равен вершине
- list=next=del(cur); //удаляем
- else
- next=del(cur);//удаляем тек.эл.
- f=true; //ставим флажок, что было вхождение
- }
- else
- {
- next=cur->next; //идес к след. узлу
- }
- cur=next; //тек.эл. становится след.
- }
- if (!f) list=add_to_list(list,s); //если вхождений не было, то заносим строку в начало списка
- print_and_del(list); //выводим и удаляем
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement