LibertyPaul

5lab

Mar 18th, 2012
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.69 KB | None | 0 0
  1. //Эта программа написана только для демонстрации синтаксиса
  2. //и не применима на практике из за чудовищной неэффективности!
  3. //1 элемент хранит в себе 4 байта полезной информации(int) и (32 или 64 бита) * 2 = 8 или 16 байт для указателей, в зависимости от разрядности системы.
  4. //получается, что полезная информация занимает 33% или 20% всей занимаемой программой памяти.
  5. #include <iostream>
  6. #include <conio.h>
  7. #include <windows.h>
  8. using namespace std;
  9. struct ELEM{
  10. int info;
  11. ELEM *next, *back;
  12. };
  13. char mainmenu[][50]={
  14.     "Создать список\0",
  15.     "Вывести список на экран\0",
  16.     "Вставить элемент в произвольное место\0",
  17.     "Удалить произвольный элемент\0",
  18.     "Удалить список, очистить память\0",
  19.     "Выйти\0",
  20.      "\0"};
  21. char submenu2[][50]={
  22.     "Вывести весь список\0",
  23.     "Вывести часть списка\0",
  24.     "Вывести один элемент\0",
  25.     "Выйти\0",
  26.     "\0"};
  27.  
  28.  
  29. void gotoxy(int x, int y){
  30.     COORD coord;
  31.     coord.X = x;
  32.     coord.Y = y;
  33.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
  34. }
  35.  
  36.  
  37. void writemenu(int kursorpos, char str[][50]){
  38.     int i=0;
  39.     while(str[i][0]!=0){
  40.         gotoxy(5,i*2+1);
  41.         cout<<i+1<<": "<<str[i];
  42.         i++;
  43.     }
  44.     gotoxy(3,kursorpos*2-1);//размещаем курсор около нужного пункта меню
  45.     cout<<">";
  46. }
  47. void check(int& a, int max){
  48.     if(a>max){
  49.         a=1;
  50.     }
  51.     if(a<1){
  52.         a=max;
  53.     }
  54. }
  55. int position(ELEM *Begq, ELEM *p){
  56.     int t=1;
  57.     while(Begq!=p){
  58.         Begq=Begq->next;
  59.         t++;
  60.     }
  61.     return t;
  62. }
  63.    
  64. ELEM *position2(int x, ELEM *Begq){
  65.     if(Begq->next==NULL)return NULL;
  66.     for(int i=1;i<x;i++)Begq=Begq->next;
  67.     return Begq;
  68. }
  69.  
  70.  
  71.  
  72. int elemout(ELEM *p){//выводит информацию
  73.     return p->info;
  74. }
  75.  
  76.  
  77.  
  78. //*************************************************************#1
  79. void mkfirst(ELEM **Begq, ELEM **Endq, ELEM **p){//создает первый элемент списка
  80.     (*p)=new ELEM;
  81.     (*p)->back=NULL;
  82.     (*Begq)=(*p);
  83.     (*Endq)=(*p);
  84. }
  85.  
  86.    
  87. int infin(int x, ELEM **Begq, ELEM **Endq, ELEM **p){//добавляет информацию из переменной x в конец списка
  88.     if(*Begq==NULL)
  89.         mkfirst(Begq, Endq, p);
  90.     else {
  91.         *p=new ELEM;
  92.         (*Endq)->next=(*p);
  93.         (*p)->back=(*Endq);
  94.     }
  95.     (*p)->info=x;
  96.     (*Endq)=(*p);
  97.     (*Endq)->next=NULL;
  98.     return 0;
  99. }
  100.  
  101.  
  102. void mklist(ELEM **Begq, ELEM **Endq, ELEM **p){
  103.     cout<<"Введите ряд положительных чисел\nЧтобы закончить ввод введите любое отрицательное число\n";
  104.     int t=0;
  105.     while(t>=0){
  106.         cin>>t;
  107.         infin(t, Begq, Endq, p);
  108.     }
  109.     cout<<"\nСписок создан\n\nДля выхода нажмите любую клавишу";
  110.     getch();
  111. }
  112. //******************************************************End of #1
  113. //*************************************************************#2
  114. void allout(ELEM *Begq, ELEM *Endq){
  115.     //if(Begq->back==NULL)Begq=Begq->next;
  116.     do{
  117.         cout<<Begq->info<<endl;
  118.         Begq=Begq->next;
  119.     }
  120.     while(Begq!=Endq);
  121. }
  122.  
  123.    
  124.  
  125.  
  126. void sub2(ELEM *Begq, ELEM *Endq, ELEM *p){
  127.     int kurs=1;
  128.     char c;
  129.     while(true){
  130.         system("CLS");
  131.         writemenu(kurs, submenu2);
  132.         switch(c=getch()){
  133.             case VK_RETURN:
  134.                 system("CLS");
  135.                 switch(kurs){
  136.                     case 1:{
  137.                         allout(Begq, Endq);
  138.                         break;
  139.                     }
  140.                     case 2:{
  141.                         int b, e;
  142.                         cout<<"Введите границы диапазона: ";
  143.                         cin>>b>>e;
  144.                         allout(position2(b, Begq), position2(e+1, Begq));
  145.                         break;
  146.                     }
  147.                     case 3:{
  148.                         int num;
  149.                         cout<<"Введите номер элемента: ";
  150.                         cin>>num;
  151.                         cout<<endl<<elemout(position2(num, Begq));
  152.                         break;
  153.                     }
  154.                     case 4:{
  155.                         goto endout;
  156.                     }
  157.                 }
  158.             case -32:
  159.                 switch(getch()){
  160.                     case 72:{
  161.                         kurs--;
  162.                         break;
  163.                     }
  164.                     case 80:{
  165.                         kurs++;
  166.                         break;
  167.                     }
  168.                 }
  169.             }
  170.         check(kurs, 4);
  171.     }
  172.     endout:;
  173. }          
  174.    
  175. //******************************************************End of #2
  176. //*************************************************************#3
  177. int onein(ELEM *sth, ELEM *p){//вставляет элемент после эл-та p
  178.     p->next->back=sth;
  179.     sth->next=p->next;
  180.     sth->back=p;
  181.     p->next=sth;
  182.     return 0;
  183. }
  184.  
  185. void inmiddle(ELEM *Begq, ELEM *Endq){
  186.     cout<<"Введите номер элемента, после которого хотите вставить новый\n";
  187.     int x;
  188.     do{
  189.         cin>>x;
  190.         if((x>0) || (x<position(Begq, Endq)))
  191.             break;
  192.         else
  193.             cout<<"Элемента с таким номером не существует\nПовторите ввод\n";
  194.     }
  195.     while(0);
  196.     cout<<"Введите число типа \"int\"\n";
  197.     int t;
  198.     cin>>t;
  199.     ELEM *temp=new ELEM;
  200.     temp->info=t;
  201.     onein(temp, position2(x, Begq));
  202.     cout<<"\nЭлемент вставлен\n\nДля выхода нажмите любую клавишу";
  203.     getch();
  204. }
  205. //******************************************************End of #3
  206. //*************************************************************#4
  207. ELEM *delmiddle(int x, ELEM *Begq){//Удаляет эдемент из середины списка
  208.     ELEM *p=position2(x, Begq);
  209.     ELEM *temp=p->back;
  210.     p->back->next=p->next;
  211.     p->next->back=p->back;
  212.     delete p;
  213.     return temp;
  214. }
  215.  
  216. void deleteone(ELEM *Begq){
  217.     cout<<"Введите номер удаляемого элемента: \n";
  218.     int n;
  219.     cin>>n;
  220.     delmiddle(n, Begq);
  221.     cout<<"\nЭлемент удален\n\nДля выхода нажмите любую клавишу";
  222.     getch();
  223. }
  224. //*****************************************************End of #4
  225. //************************************************************#5
  226. void freeall(ELEM **Begq, ELEM **Endq, ELEM **p){//удаляет элементы от Begq до Endq. Использовать рекомендовано только для уничтожения всего списка, а не части, иначе будет утечка памяти!!!
  227.     ELEM *temp;
  228.     while(*Begq!=NULL){
  229.         temp=(*Begq)->next;
  230.         delete(*Begq);
  231.         (*Begq)=temp;
  232.     }
  233.     (*Begq)=(*Endq)=(*p)=NULL;
  234.     cout<<"\nСписок удален, памть очищена.\n\nДля выхода нажмите любую клавишу";
  235.     getch();
  236. }
  237. //*****************************************************End of #5
  238.  
  239.  
  240.  
  241. void quit(){
  242.     system("CLS");
  243.     exit(1);
  244. }
  245.  
  246.  
  247. int main(){
  248.     setlocale (LC_ALL, "Rus");
  249.     ELEM *Begq=NULL, *Endq=NULL, *p=NULL;
  250.     char c=0;
  251.     int kurs=1;
  252.     while(true){
  253.     system("CLS");
  254.     writemenu(kurs, mainmenu);
  255.     switch(c=getch()){
  256.         case VK_RETURN:
  257.             system("CLS");
  258.             switch(kurs){
  259.                 case 1:
  260.                     mklist(&Begq, &Endq, &p);
  261.                     break;
  262.                 case 2:
  263.                     if(Begq!=NULL)
  264.                         sub2(Begq, Endq, p);
  265.                     else
  266.                         cout<<"Список еще не создан";
  267.                     break;
  268.                 case 3:
  269.                     if(Begq!=NULL)
  270.                         inmiddle(Begq, Endq);
  271.                     else
  272.                         cout<<"Список еще не создан";
  273.                     break;
  274.                 case 4:
  275.                     if(Begq!=NULL)
  276.                         deleteone(Begq);
  277.                     else
  278.                         cout<<"Список еще не создан";
  279.                     break;
  280.                 case 5:
  281.                     if(Begq!=NULL)
  282.                         freeall(&Begq, &Endq, &p);
  283.                     else
  284.                         cout<<"Список еще не создан";
  285.                     break;
  286.                 case 6:
  287.                     quit();
  288.                     break;
  289.             }
  290.         case -32:
  291.             switch(getch()){
  292.                 case 72:
  293.                     kurs--;
  294.                     break;
  295.                 case 80:
  296.                     kurs++;
  297.                     break;
  298.             }
  299.     }
  300.     check(kurs, 6);
  301.     }
  302.     return 0;
  303. }
Advertisement
Add Comment
Please, Sign In to add comment