#include <stdio.h>
#include <stdlib.h>
typedef struct _node
{
int data, index;
struct _node* next;
} node_t, *pnode;
typedef struct _list
{
int size;
pnode begin, end;
} list_t, *plist;
// Поместить элемент в конец списка
int push_data( plist _lst, int _data )
{
pnode new_node = (pnode)malloc( sizeof(node_t) );
new_node->next = NULL;
new_node->data = _data;
new_node->index = _lst->size++;
if (NULL == _lst->begin)
_lst->begin = _lst->end = new_node;
else
{
_lst->end->next = new_node;
_lst->end = new_node;
}
return _lst->size;
}
// Извлечь элемент с конца списка (с удалением)
int pop_data( plist _lst )
{
int result;
pnode ptr;
if (!_lst->size)
return -1;
ptr = _lst->begin;
result = _lst->end->data;
if (ptr == _lst->end)
{
free( ptr );
_lst->begin = _lst->end = NULL;
}
else
{
while (ptr->next != _lst->end)
ptr = ptr->next;
ptr->next = NULL;
free( _lst->end );
_lst->end = ptr;
}
_lst->size--;
return result;
}
// Получить значение элемент списка по индексу
int get_data( plist _lst, int _index )
{
int i;
pnode ptr;
if (_index >= _lst->size)
return -1;
i = _index;
ptr = _lst->begin;
while (i--)
ptr = ptr->next;
return ptr->data;
}
// Установить значение элемента по индексу
int set_data( plist _lst, int _index, int _data )
{
int i;
pnode ptr;
if (_index >= _lst->size)
return -1;
i = _index;
ptr = _lst->begin;
while (i--)
ptr = ptr->next;
return (ptr->data = _data);
}
// Инициализация списка
void init( plist _lst )
{
_lst->size = 0;
_lst->begin = _lst->end = NULL;
}
int main()
{
int i;
plist lst;
lst = (plist)malloc( sizeof(list_t) );
init( lst );
push_data( lst, 1 );
push_data( lst, 2 );
push_data( lst, 3 );
push_data( lst, 4 );
push_data( lst, 5 );
for (i = 0; i < lst->size; i++)
printf( "%d\n", get_data( lst, i ) );
while (lst->size)
printf( "%d\n", pop_data( lst ) );
free( lst );
return 0;
}
Реализовать структуру данных список на основе массива.Язык C.
в ФАКе нашёл через классы, мне нужно без них.
Цитата: P.S.
Реализовать структуру данных список на основе массива. В случае если длинна массива недостаточна, следует динамически увеличивать длину массива.
в ФАКе нашёл через классы, мне нужно без них.
в ФАКе нашёл через классы, мне нужно без них.
Сколько связок в списке?
Цитата: Lerkin
Сколько связок в списке?
в условии чётко не написано. Думаю можно односвязный.
Односвязный список:
Хотелось бы ещё процедуры удаления все встречи элемента в списке,
удаления элемента с указанным индексом и изменения порядка элементов на обратный
Цитата: P.S.
Lerkin,большое спасибо.
Хотелось бы ещё процедуры удаления все встречи элемента в списке,
удаления элемента с указанным индексом и изменения порядка элементов на обратный
Хотелось бы ещё процедуры удаления все встречи элемента в списке,
удаления элемента с указанным индексом и изменения порядка элементов на обратный
Первое и второе - для самостоятельной работы. По поводу третьей: такие вещи в двусвязном списке легко делать, всего два указателя [FONT="Courier New"][SIZE="2"]begin [/SIZE][/FONT]и [FONT="Courier New"][SIZE="2"]next [/SIZE][/FONT]надо было бы обменять. Да и в данном списке - все не так сложно.
Короче, 20 WMZ в Фонд Викимедии, и все решения у тебя на кармане. ;)
Цитата: Lerkin
Первое и второе - для самостоятельной работы.
окей) разберёмся с этим. Ещё раз спасибо.
[COLOR="White"]Жаль решение не пригодилось, экзамен так сдал)[/COLOR]