Добавил:
FluffyUnicorn
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Структуры данных примеры / Линейный связанный список / d_list
.c//двусвязный линейный список
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
struct element
{
DataType data;
struct element * next, *prev;
};
struct List
{
struct element * begin, * end;
};
void makenull (struct List *list)
{
list->begin = list->end = NULL;
}
struct List add_begin (struct List list, DataType x) //добавление в начало
{
struct element * temp;
temp = (struct element *) malloc (sizeof (struct element));
temp->data = x;
temp->next = list.begin;
temp->prev = NULL;
if (list.begin) //если добавляем в непустой список
list.begin->prev = temp;
else //если добавляемый элемент единственный в списке
list.end = temp;
list.begin = temp;
return list;
}
struct List add_end (struct List list, DataType x) //добавление в конец
{
struct element * temp;
temp = (struct element *) malloc (sizeof (struct element));
temp->data = x;
temp->next = NULL;
temp->prev = list.end;
if (list.end) //если добавляем в непустой список
list.end->next = temp;
else //если добавляемый элемент единственный в списке
list.begin = temp;
list.end = temp;
return list;
}
void insert (struct element * cur, DataType x) //вставка после текущего (не последнего!)
{
struct element * temp;
temp = (struct element *) malloc (sizeof (struct element));
temp->data = x;
temp->next = cur->next;
temp->prev = cur;
cur->next = temp;
temp->next->prev = temp; //указателю prev следующего элемента присваиваем адрес добавляемого
}
void del_list (struct List list) //удаление списка
{
struct element * temp;
while (list.begin) //пока в списке есть элементы
{
temp = list.begin;
list.begin = list.begin->next; //переставляем указатель на следующий элемент
free (temp); //первый удаляем
}
}
struct List del_begin (struct List list) //удаление первого элемента
{
struct element * temp;
if (list.begin) //если в списке есть элементы
{
temp = list.begin;
list.begin = list.begin->next; //переставляем указатель на следующий элемент
list.begin->prev = NULL; //обнуляем указатель на удаляемый элемент
free (temp); //первый удаляем
}
if (list.begin == NULL) //если удаляемый элемент был единственным
list.end = NULL;
return list;
}
struct List del_end (struct List list) //удаление первого элемента
{
struct element * temp;
if (list.end) //если в списке есть элементы
{
temp = list.end;
list.end = list.end->prev; //переставляем указатель на предыдущий элемент
list.end->next = NULL; //обнуляем указатель на удаляемый элемент
free (temp); //первый удаляем
}
if (list.end == NULL) //если удаляемый элемент был единственным
list.begin = NULL;
return list;
}
void del_element (struct element * cur) //удаление текущего (важно(!) не первого и не последнего)
{
cur->next->prev = cur->prev; //указателю prev следующего элемента присваиваем адрес предшествующего удаляемому
cur->prev->next = cur->next; //указателю next предыдущего элемента присваиваем адрес следующего за удаляемым
free (cur);
}
void print_list (struct List list) //печать списка
{
while (list.begin) //пока в списке есть элементы
{
printf ("%d ", list.begin->data);
list.begin = list.begin->next; //переставляем указатель на следующий элемент
}
}
void print_list_back (struct List list) //печать списка в обратном порядке
{
while (list.end) //пока в списке есть элементы
{
printf ("%d ", list.end->data);
list.end = list.end->prev; //переставляем указатель на следующий элемент
}
}
int main(int argc, char *argv[])
{
struct List list;
int x;
makenull (&list);
for (x=1; x<5; x++)
list = add_begin (list, x);
print_list (list);
printf ("\n");
for (x=10; x<15; x++)
list = add_end (list, x);
print_list (list);
printf ("\n");
print_list_back (list);
printf ("\n");
insert (list.begin->next, 1000); //вставка числа 1000 после второго элемента списка
print_list (list);
printf ("\n");
list = del_begin(list); //удаление первого элемента
print_list (list);
printf ("\n");
list = del_end (list); //удаление последнего элемента
print_list (list);
printf ("\n");
del_element (list.end->prev); //удаление предпоследнего элемента
print_list (list);
printf ("\n");
del_list (list);
system("PAUSE");
return 0;
}
Соседние файлы в папке Линейный связанный список