#include <iostream>
using namespace std;
struct uzel {
int info;
uzel *next;
};
#define exit -1
int main()
{
uzel *start=new uzel;
cout<<"Enter new number: ";
cin>>start->info;
if(start->info==exit)
{
delete start;
return 0;
}
uzel *p=start;
do
{
p->next=new uzel;
cout<<"Enter new number: ";
cin>>p->next->info;
if(p->next->info==exit)
{
delete p->next;
p->next=start;
}
p=p->next;
}while(p!=start);
p=start;
do
{
cout<<p->info<<endl;
p=p->next;
}while(p!=start);
cout<<"The end!"<<endl;
cin>>start->info;
return 0;
}
(c)Кольцевой список.
Вообщем вопрос состоит в том как создать такой список и внести в него N-ое количество эллементов.
2Shtirlitz: Язык программирования указан в заголовке вполне явно. Да и твой вариант применения С++ в данном контексте вызывает массу возражений. Одумайся! Одумайся и исправься!!! :D
Код:
// структура элемента списка
typedef struct
{
struct list_item* _next;
int _data;
} list_item;
// структура списка
typedef struct
{
struct list_item* _begin;
long _count;
} list;
typedef struct
{
struct list_item* _next;
int _data;
} list_item;
// структура списка
typedef struct
{
struct list_item* _begin;
long _count;
} list;
Функции добавления\удаления\изменения\вставки\перемещения сам напишешь, или...?
Хотя возможно функции добавления хватит, т.к. со списками немного знаком и по "аналогии" должно что нибудь получитсья.
Код:
// структура элемента списка
typedef struct node
{
struct node* _next;
int _data;
} list_item;
// структура списка
typedef struct
{
list_item* _begin;
long _count;
} list;
typedef struct node
{
struct node* _next;
int _data;
} list_item;
// структура списка
typedef struct
{
list_item* _begin;
long _count;
} list;
Функция добавления элемента в список.
Код:
int add( lst, data )
list* lst;
int data;
{
list_item* p;
list_item* item = NULL;
// если память не выделена, возвращаем ошибку
if( !(item = (list_item*)malloc( sizeof(list_item) )) )
return -1;
item->_data = data;
if( !lst->_begin ) // если запись первая, то создаем первый узел
{
lst->_begin = item;
p = lst->_begin;
}
else // иначе - двигаемся в конец списка
{
p = lst->_begin;
while( p->_next != lst->_begin )
p = p->_next;
p->_next = item; // ... и добавляем узел в конец
}
p->_next = lst->_begin; // зацикливаем
lst->_count++;
return 0;
}
list* lst;
int data;
{
list_item* p;
list_item* item = NULL;
// если память не выделена, возвращаем ошибку
if( !(item = (list_item*)malloc( sizeof(list_item) )) )
return -1;
item->_data = data;
if( !lst->_begin ) // если запись первая, то создаем первый узел
{
lst->_begin = item;
p = lst->_begin;
}
else // иначе - двигаемся в конец списка
{
p = lst->_begin;
while( p->_next != lst->_begin )
p = p->_next;
p->_next = item; // ... и добавляем узел в конец
}
p->_next = lst->_begin; // зацикливаем
lst->_count++;
return 0;
}
Такая структура (односвязный список) не совсем удобна для добавления элементов, потому что каждый раз приходится бегать по списку. Можно ввести элемент - указатель на предшествующий [FONT="Courier New"]_begin[/FONT]'у узел. Расходов немного, а производительность при составлении списка - максимальна.
P.S. Главное, не забывать освобождать память при разрушении списка!