Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] динамические структуры


Автор: mego4el 3.2.2011, 21:50
Доброго вечера. Пожалуйста помогите разобраться с заданием на структуры, и подскажите с чего здесь начинать?

1) Кольцевой двунаправленный список (добавление/удаление в произвольное место списка, отличное от начала (например после звена, указатель на которое задан). Проверка, пуст ли список, очистка списка, печать списка в направлении от верха к низу \ низа к верху.

Необходимо написать программу на С++.

Спасибо всем, заранее! 

Автор: mes 3.2.2011, 23:29
Цитата(mego4el @  3.2.2011,  20:50 Найти цитируемый пост)
и подскажите с чего здесь начинать?

с поиска.. подобные темы поднимались не один раз и рассмотрены  со всех сторон.. 

Автор: Earnest 4.2.2011, 08:09
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: mego4el 13.2.2011, 00:31
Собственно вот, что получилось:
Код

#include <iostream.h>
#include <windows.h>
 
const int NotUsed=system("color F0");
int menu();
 
struct list
{
        char sn[50];  //student name
        int sid;      //student number
        list *next;
        list *prev;
};
 
list *list_end=NULL;          //sozdanie pustogo spiska
list *dobav_nach(list *p);  //dobavit v nachalo
list *udal_nach(list *p);    //udalit iz nachala
list *dobav_proizv(list *p);  //dobavit v proizvolnoe mesto
list *udal_proizv(list *p);  //udalit iz proizvolnogo mesta
void proverka(list *p);     //proverka, pust li spisok
list *clean_list(list *p);    //ochistit spisok
void print(list *p);        //vyiti
 
//------------------------------------------------------------
 
int main()
{
        list *l=NULL;
        bool ex=true;
        while (ex)
        {
                switch(menu())
                {
                case 1:
                        l=dobav_nach(l);
                        break;
                case 2:
                        l=udal_nach(l);
                        break;
                case 3:
                        dobav_proizv(l);
                        break;
                case 4:
                        if (udal_proizv(l)==NULL)
                        l=NULL;
                        break;
                case 5:
                        proverka(l);
                        break;
                case 6:
                        l=clean_list(l);
                        break;
                case 7:
                        print(l);
                        break;
                case 0: ex=false;
                        break;
                default: cout<<"Vyberite punkt!"<<endl;
                        break;
                }
        }
        return 0;
}
 
//-----------------------------------------------
 
int menu()
{
        int m;
        cout<<" --------------------------------"<<endl;
        cout<<" Vyberite punkt: \n\n";
        cout<<" 1 - dobavit v nachalo\n";
        cout<<" 2 - udalit iz nachala\n";
        cout<<" 3 - dobavit v proizvolnoe mesto\n";
        cout<<" 4 - udalit iz proizvolnogo mesta\n";
        cout<<" 5 - proverit, pust li spisok\n";
        cout<<" 6 - ochistit spisok\n";
        cout<<" 7 - pechat spiska\n";
        cout<<" 0 - vyiti\n";
        cout<<" --------------------------------"<<endl<<endl;
    cin>>m;
        return m;
}
 
//-----------------------------------------------
 
list *dobav_nach(list *p)
{
        list *t;
        t=new list;
        cout<<endl<<" Vvedite imya studenta: ";
        cin>>(t->sn);
        cout<<" Vvedite nomer studenta: ";
        cin>>t->sid;
        if(p==NULL)
        {
                list_end=t;
                t->next=t;
                cout<<endl<<" ...Added successfully!\n\n";
        }
        else
        {
        t->next=p;
        list_end->next=t;
        cout<<endl<<" ...Added successfully!\n\n";
        }
        return t;
}
 
//-----------------------------------------------
 
list *udal_nach(list *p)
{
        list *t;
        if(p==NULL)
                cout<<" Spisok pyst!";
        else
        {
                if(p==list_end)
                {
                        delete p;
                        p=NULL;
                        list_end=NULL;
                        cout<<endl<<" ...Deleted successfully!\n\n";
                }
                else
                {
                        t=p;
                        p=p->next;
                        list_end->next=p;
                        delete t;
                        cout<<endl<<" ...Deleted successfully!\n\n";
                }
        }
        return p;
}
 
//-----------------------------------------------
 
list *dobav_proizv(list *p)
{
        int sd;
        list *s,*t;
        if(p==NULL)
                cout<<" Spisok pyst!";
        else
        {
                t=p;
                cout<<endl<<"Vvedite nomer studenta, posle kotorogo budet vstavlen etot: ";
                cin>>sd;
                do
                {
                if(t->sid==sd)
                        {
                        s=new list;
                        cout<<"Vvedite imya studenta: ";
                        cin>>(s->sn);
                        cout<<"Vvedite nomer studenta: ";
                        cin>>s->sid;
                        s->next=t->next;
                        t->next=s;
                        cout<<endl<<" ...Added successfully!\n\n";
                        if(s->next==p)
                        list_end=s;
                        break;
                        }
                t=t->next;
                }
        while(t!=p);
        }
        return s;
}
 
//-----------------------------------------------
 
list *udal_proizv(list *p)
{
        int sd;
        list *s,*t;
        if(p==NULL)
        cout<<" Spisok pyst!";
        else
        {
                t=p;
                cout<<endl<<"Vvedite nomer studenta, kotoruy budet udalen: ";
                cin>>sd;
        while(t->next!=p)
        {
                if(t->next->sid==sd)
                {
 
                        s=t->next;
                        t->next=s->next;
                        delete s;
                        cout<<endl<<" ...Deleted successfully!\n\n";
                        if(t->next==p)
                        {
                                list_end=t;
                        }
                        break;
                }
                t=t->next;
        }
        }
        return t;
}
 
//-----------------------------------------------
 
void proverka(list *p)
{
        if(p==NULL)
                cout<<endl<<" Spisok pyst!\n\n";
        else
                cout<<endl<<" Spisok ne pyst!\n\n";
}
 
//-----------------------------------------------
 
list *clean_list(list *p)
{
        list *t;
        if(p==NULL)
                cout<<" Spisok pyst!";
        else
        {
                while(p!=list_end)
                {
                        t=p;
                        p=p->next;
                        delete t;
                }
                delete p;
                p=NULL;
                list_end=NULL;
                cout<<endl<<" ...Cleaned successfully!\n\n";
        }
        return p;
 
}
 
//-----------------------------------------------
 
void print(list *p)
{
        list *t_p=p;
        if(t_p)
        {
                do
                {
                cout<<" ---------------------------"<<endl;
                cout<<" Imya studenta: "<<t_p->sn<<endl;
                cout<<" Nomer studenta: "<<t_p->sid<<endl;
                cout<<" ---------------------------\n\n";
                t_p=t_p->next;
                }
        while(t_p!=list_end->next);
        }
        else
        cout<<" Spisok pyst!\n\n";
}


пожалуйста подскажите, как сделать что бы имя студента можно было записывать с пробелами, а так же что бы номер был максимум 10 символов. и еще интересует, правильно ли вообще составлен "кольцевой двунаправленный список", и что здесь не так?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)