Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdlib.h>
- #define list1 struct list1
- #define list2 struct list2
- using namespace std;
- int n, k;
- list1 //Односвязная
- {
- int info;
- list1 *next;
- list2 *down;
- }; list1 *head;
- list2
- {
- int info;
- list2 *next;
- list1 *back;
- };
- int menu_select()
- {
- int c;
- cout << " \n\t\t Меню:"<<endl;
- cout << "\n1. Ввод списочный структуры\n";
- cout << "2. Отобразить содержимое структуры\n";
- cout << "3. Перемещение по структуре\n";
- cout << "4. Справка\n";
- cout << "5. Выход\n";
- do
- {
- cout << "\nВаш выбор: ";
- cin >> c;
- }
- while(c < 0 || c > 6);
- return c;
- }
- list1 *appendFirst(int x) //d –число добавляемое в список
- {
- list1 *t=new list1;
- t->down=0;
- t->info=0;
- t->next=0;
- list2 *p=new list2;
- p->info=x;
- p->next=0;
- p->back=0;
- t->down=p;
- return t;
- }
- void appendOfList2(list1 **s, int x)
- {
- list1 *start = *s;
- list2 *downEl = start->down;
- list2 *dadd=new list2;
- dadd->info=x;
- dadd->back=0;
- dadd->next=0;
- downEl->next=dadd;
- start->down=dadd;
- list1 *nadd=new list1;
- nadd->info=0;
- nadd->next=0;
- if (start->next)
- nadd->next=start->next;
- start->next=nadd;
- nadd->down=downEl;
- }
- void appendOfList1(list1 **s, int x)
- {
- list1 *start = *s;
- while (start->info != 0)
- {
- start=start->next;
- }
- start->info=x;
- }
- void list1display(list1 *s)
- {
- list1 *t = s;
- if (t)
- {
- list1display(t->next);
- if (t->next)
- cout << "<-";
- cout << t->info;
- }
- }
- void list2display(list1 *s)
- {
- list1 *t = s;
- if (t && t->down !=0)
- {
- list2display(t->next);
- if (t->next && t->next->down !=0)
- { cout << "->";}
- cout << t->down->info;
- }
- }
- void display(list1 *s, int z, int y) //выводит в том порядке, что и в задании на картинке
- {
- list1 *t = s; int i; int m = y-z;
- list1display(s);
- cout << endl; //вывод первого списка в обратном направлении
- // ниже идет оформление списка, для большей наглядности
- if (m > 0)
- for (i = 0; i<m; i++)
- cout << " ";
- for (i =0; i <z; i++)
- {
- cout <<"| ";
- }
- cout << endl;
- if (m > 0)
- for (i = 0; i<m; i++)
- cout << " ";
- for (i =0; i <z; i++)
- {
- cout <<"v ";
- }
- cout << endl;
- if (m > 0)
- for (i = 0; i<m; i++) cout << " ";
- list2display(t); // вывод второго списка
- }
- void append3(list1 **s, int x)
- {
- list1 *t = *s;
- list1 *newEl = new list1;
- newEl->info=x;
- newEl->next=0;
- newEl->down=0;
- while (t->next)
- {
- t=t->next;
- }
- t->next=newEl;
- }
- void input()
- {
- int a;
- cout << "Введите элементы первого списка:" << endl;
- cin >> a;
- n=0;
- if (a == 0)
- cout << "Первый список пуст" << endl;
- else
- {
- head=appendFirst(a);
- }
- cin >>a;
- n++;
- while (a !=0)
- {
- appendOfList2(&head, a);
- n++;
- cin>>a;
- }
- cout << "Введите элементы второго списка:" << endl;
- cin >> a;
- k=0;
- while (a !=0)
- {
- if ( n > k)
- appendOfList1(&head, a);
- else
- append3(&head, a);
- k++;
- cin>>a;
- }
- cout << endl;
- }
- void moving(list1 **s)
- {
- list1 *start =*s;
- list1 *current =*s;
- bool down = 0;
- bool up =1;
- int state = up;
- list2 *m =0;
- int c;
- cout << "Первый элемент: \n"<< current->info << "\nНажмите кнопку для выбора направления \n";
- cin >> c;
- while (c != 0)
- {
- if (current == start)
- {
- if (c == 6 )
- {
- cout << "Нельзя двигаться в этом направлении\nВернуться к началу?(1 если да)" << endl ;
- cin >> c;
- if (c ==1)
- moving(&start);
- }
- else if (c == 2)
- {
- m=current->down;
- cout << m->info << " Это последний элемент второго списка, дальше нельзя продолжить обход\nВернуться к началу?(1 если да)" << endl ;
- cin >> c;
- if (c ==1)
- moving(&start);
- state = down;
- }
- else if (c == 4 && current->next)
- {
- current=current->next;
- cout << current->info << "\n";
- }
- }
- cin >> c; //второй шаг
- if (c == 2 && state == up)
- {
- if (current->down)
- {
- m=current->down;
- cout << m->info << endl;
- state=down;
- }
- else cout << "Нет элементов во втором списке";
- }
- else if (c == 4 && state == up)
- {
- if (current->next)
- {
- current=current->next;
- cout << current->info << endl;
- }
- else if (current->down)
- cout << "Это последний первого элемент списка, Возможно продолжить движение вниз (по второму списку). Для этого нажмите 2." << endl ;
- else
- {
- cout << "Это последний элемент первого списка, дальше нельзя продолжить обход\nВернуться к началу?(1 если да)" << endl ;
- cin >> c;
- if (c ==1)
- moving(&start);
- }
- }
- else if (c ==6 && state == down)
- {
- if (m && m->next)
- {
- m=m->next;
- cout << m->info << endl;
- }
- else
- cout << m->info << " Это последний элемент второго списка, дальше нельзя продолжить обход\nВернуться к началу?(1 если да)" << endl ;
- }
- else if (2 && state == down)
- cout << "Невозможно продолжить путь в этом направлении " << endl ;
- else
- {
- cout << "Это последний первого элемент списка, Возможно продолжить движение вниз (по второму списку). Для этого нажмите 2." << endl ;
- cin >> c;
- if (c ==1)
- moving(&start);
- }
- }
- }
- void move(list1 **s)
- {
- list1 *start =*s;
- cout << "*************" << endl;
- cout << "* 4 <-- *" << endl;
- cout << "* 6 --> *" << endl;
- cout << "* 2 | *" << endl;
- cout << "* v *" << endl;
- cout << "*************" << endl;
- cout << "для возврата в меню нажмите кнопку '0'" << endl;
- moving(&start);
- }
- void help()
- {
- cout << " Что бы создать списочную структуру необходимо выбрать первый пункт меню, и \nввести элементы первого и второго списков. Для окончания"
- " ввода числовой\nпоследовательности следует нажать кнопку '0'.\n После завершения формирования первого списка (изначально вводится второй\n(нижний) список), "
- "будет совершен автоматический возврат в меню программы.\nТам можно будет выбрать пункты 'Отобразить содержимое структуры' и\n'Перемещение по структуре'. Также можно будет"
- " вновь открыть справочный\nматериал.\n Перемещение по структуре осуществляется клавишами 4 (влево), 2 (вниз) и 6\n(вправо)."
- " Если движение в заданном направлении невозможно, то будет выведено\nпредупреждение. Пункты 2 и 3 недоступны до того как сформирован список." << endl;
- }
- using namespace std;
- int main()
- {
- setlocale (0, "Rus");
- head = NULL;
- for(;;)
- {
- switch(menu_select()) {
- case 1: input();
- break;
- case 2: display(head,n,k);
- break;
- case 3: move(&head);
- break;
- case 4: help();
- break;
- case 5: exit(0);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement