Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Эта программа написана только для демонстрации синтаксиса
- //и не применима на практике из за чудовищной неэффективности!
- //1 элемент хранит в себе 4 байта полезной информации(int) и (32 или 64 бита) * 2 = 8 или 16 байт для указателей, в зависимости от разрядности системы.
- //получается, что полезная информация занимает 33% или 20% всей занимаемой программой памяти.
- #include <iostream>
- #include <conio.h>
- #include <windows.h>
- using namespace std;
- struct ELEM{
- int info;
- ELEM *next, *back;
- };
- char mainmenu[][50]={
- "Создать список\0",
- "Вывести список на экран\0",
- "Вставить элемент в произвольное место\0",
- "Удалить произвольный элемент\0",
- "Удалить список, очистить память\0",
- "Выйти\0",
- "\0"};
- char submenu2[][50]={
- "Вывести весь список\0",
- "Вывести часть списка\0",
- "Вывести один элемент\0",
- "Выйти\0",
- "\0"};
- void gotoxy(int x, int y){
- COORD coord;
- coord.X = x;
- coord.Y = y;
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
- }
- void writemenu(int kursorpos, char str[][50]){
- int i=0;
- while(str[i][0]!=0){
- gotoxy(5,i*2+1);
- cout<<i+1<<": "<<str[i];
- i++;
- }
- gotoxy(3,kursorpos*2-1);//размещаем курсор около нужного пункта меню
- cout<<">";
- }
- void check(int& a, int max){
- if(a>max){
- a=1;
- }
- if(a<1){
- a=max;
- }
- }
- int position(ELEM *Begq, ELEM *p){
- int t=1;
- while(Begq!=p){
- Begq=Begq->next;
- t++;
- }
- return t;
- }
- ELEM *position2(int x, ELEM *Begq){
- if(Begq->next==NULL)return NULL;
- for(int i=1;i<x;i++)Begq=Begq->next;
- return Begq;
- }
- int elemout(ELEM *p){//выводит информацию
- return p->info;
- }
- //*************************************************************#1
- void mkfirst(ELEM **Begq, ELEM **Endq, ELEM **p){//создает первый элемент списка
- (*p)=new ELEM;
- (*p)->back=NULL;
- (*Begq)=(*p);
- (*Endq)=(*p);
- }
- int infin(int x, ELEM **Begq, ELEM **Endq, ELEM **p){//добавляет информацию из переменной x в конец списка
- if(*Begq==NULL)
- mkfirst(Begq, Endq, p);
- else {
- *p=new ELEM;
- (*Endq)->next=(*p);
- (*p)->back=(*Endq);
- }
- (*p)->info=x;
- (*Endq)=(*p);
- (*Endq)->next=NULL;
- return 0;
- }
- void mklist(ELEM **Begq, ELEM **Endq, ELEM **p){
- cout<<"Введите ряд положительных чисел\nЧтобы закончить ввод введите любое отрицательное число\n";
- int t=0;
- while(t>=0){
- cin>>t;
- infin(t, Begq, Endq, p);
- }
- cout<<"\nСписок создан\n\nДля выхода нажмите любую клавишу";
- getch();
- }
- //******************************************************End of #1
- //*************************************************************#2
- void allout(ELEM *Begq, ELEM *Endq){
- //if(Begq->back==NULL)Begq=Begq->next;
- do{
- cout<<Begq->info<<endl;
- Begq=Begq->next;
- }
- while(Begq!=Endq);
- }
- void sub2(ELEM *Begq, ELEM *Endq, ELEM *p){
- int kurs=1;
- char c;
- while(true){
- system("CLS");
- writemenu(kurs, submenu2);
- switch(c=getch()){
- case VK_RETURN:
- system("CLS");
- switch(kurs){
- case 1:{
- allout(Begq, Endq);
- break;
- }
- case 2:{
- int b, e;
- cout<<"Введите границы диапазона: ";
- cin>>b>>e;
- allout(position2(b, Begq), position2(e+1, Begq));
- break;
- }
- case 3:{
- int num;
- cout<<"Введите номер элемента: ";
- cin>>num;
- cout<<endl<<elemout(position2(num, Begq));
- break;
- }
- case 4:{
- goto endout;
- }
- }
- case -32:
- switch(getch()){
- case 72:{
- kurs--;
- break;
- }
- case 80:{
- kurs++;
- break;
- }
- }
- }
- check(kurs, 4);
- }
- endout:;
- }
- //******************************************************End of #2
- //*************************************************************#3
- int onein(ELEM *sth, ELEM *p){//вставляет элемент после эл-та p
- p->next->back=sth;
- sth->next=p->next;
- sth->back=p;
- p->next=sth;
- return 0;
- }
- void inmiddle(ELEM *Begq, ELEM *Endq){
- cout<<"Введите номер элемента, после которого хотите вставить новый\n";
- int x;
- do{
- cin>>x;
- if((x>0) || (x<position(Begq, Endq)))
- break;
- else
- cout<<"Элемента с таким номером не существует\nПовторите ввод\n";
- }
- while(0);
- cout<<"Введите число типа \"int\"\n";
- int t;
- cin>>t;
- ELEM *temp=new ELEM;
- temp->info=t;
- onein(temp, position2(x, Begq));
- cout<<"\nЭлемент вставлен\n\nДля выхода нажмите любую клавишу";
- getch();
- }
- //******************************************************End of #3
- //*************************************************************#4
- ELEM *delmiddle(int x, ELEM *Begq){//Удаляет эдемент из середины списка
- ELEM *p=position2(x, Begq);
- ELEM *temp=p->back;
- p->back->next=p->next;
- p->next->back=p->back;
- delete p;
- return temp;
- }
- void deleteone(ELEM *Begq){
- cout<<"Введите номер удаляемого элемента: \n";
- int n;
- cin>>n;
- delmiddle(n, Begq);
- cout<<"\nЭлемент удален\n\nДля выхода нажмите любую клавишу";
- getch();
- }
- //*****************************************************End of #4
- //************************************************************#5
- void freeall(ELEM **Begq, ELEM **Endq, ELEM **p){//удаляет элементы от Begq до Endq. Использовать рекомендовано только для уничтожения всего списка, а не части, иначе будет утечка памяти!!!
- ELEM *temp;
- while(*Begq!=NULL){
- temp=(*Begq)->next;
- delete(*Begq);
- (*Begq)=temp;
- }
- (*Begq)=(*Endq)=(*p)=NULL;
- cout<<"\nСписок удален, памть очищена.\n\nДля выхода нажмите любую клавишу";
- getch();
- }
- //*****************************************************End of #5
- void quit(){
- system("CLS");
- exit(1);
- }
- int main(){
- setlocale (LC_ALL, "Rus");
- ELEM *Begq=NULL, *Endq=NULL, *p=NULL;
- char c=0;
- int kurs=1;
- while(true){
- system("CLS");
- writemenu(kurs, mainmenu);
- switch(c=getch()){
- case VK_RETURN:
- system("CLS");
- switch(kurs){
- case 1:
- mklist(&Begq, &Endq, &p);
- break;
- case 2:
- if(Begq!=NULL)
- sub2(Begq, Endq, p);
- else
- cout<<"Список еще не создан";
- break;
- case 3:
- if(Begq!=NULL)
- inmiddle(Begq, Endq);
- else
- cout<<"Список еще не создан";
- break;
- case 4:
- if(Begq!=NULL)
- deleteone(Begq);
- else
- cout<<"Список еще не создан";
- break;
- case 5:
- if(Begq!=NULL)
- freeall(&Begq, &Endq, &p);
- else
- cout<<"Список еще не создан";
- break;
- case 6:
- quit();
- break;
- }
- case -32:
- switch(getch()){
- case 72:
- kurs--;
- break;
- case 80:
- kurs++;
- break;
- }
- }
- check(kurs, 6);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment