Отсортировать структуры по цене и удалить машины с EGA монитором - C (СИ)
Формулировка задачи:
#define KONF struct konfigur //описание структуры "конфигурация" в структуре "ЭВМ"
KONF
{ char type [50];
int operat, disk; //peremennie strukturi
char monik [50]; //monitor
};
#define EVM struct komputer //struktura peremennoi kompiytera EVM
EVM
{ char marka [50];
int price;
char proizv [50];
KONF konfig;
};
#define KOMP struct komp //struktura polia EVM
KOMP
{ EVM info;
KOMP *llink, *rlink; //pole sleva i pole sprava
};Решение задачи: «Отсортировать структуры по цене и удалить машины с EGA монитором»
#include "stdio.h"
#include "stdlib.h"
typedef struct NODE
{
int a;
struct NODE *next;
struct NODE *prev;
}Node;
typedef struct LIST
{
Node *head;
Node *last;
int l;
}List;
List * CreateList()
{
List* res=(List *)malloc(sizeof(List));
res->head=res->last=NULL;
res->l=0;
}
Node * CreateNode(int a)
{
Node *res=(Node *)malloc(sizeof(Node));
res->a=a;
res->next=NULL;
res->prev=NULL;
}
void AddNode(List *student_list, int a)
{
Node* node = CreateNode(a);
if(student_list->head == NULL)
{
node->next=NULL;
node->prev=NULL;
student_list->head = node;
}
else
{
node->next=NULL;
node->prev=student_list->last;
student_list->last->next = node;
}
student_list->last = node;
student_list->l++;
}
int DeleteNode(List* a_list, int num)
{
if((num > a_list->l)||(num <= 0))
{
printf("Wrong number.\n");
return 0;
}
Node *iter=NULL,*temp=NULL;
if(a_list->l == 0)
{
printf("List is empty - nothing to delete.\n");
return 0;
}
iter = a_list->head;
num--;
while(num != 0)
{
iter = iter->next;
num--;
}
if(a_list->l == 1)
{
free(iter);
a_list->head = a_list->last = NULL;
}
else if(iter == a_list->head)
{
a_list->head = a_list->head->next;
a_list->head->prev = NULL;
free(iter);
}
else if(iter == a_list->last)
{
a_list->last = a_list->last->prev;
a_list->last->next = NULL;
free(iter);
}
else
{
iter->prev->next=iter->next;
iter->next->prev=iter->prev;
free(iter);
}
a_list->l --;
return 1;
}
void PrintList(List* a_list)
{
Node *iter = NULL;
int num=0;
if(a_list->l == 0)
{
printf("List is empty\n");
}
else
{
printf("<br>\n");
iter = a_list->head;
while(iter != NULL)
{
num++;
printf("%d)%d\n",num,iter->a);
iter = iter->next;
}
printf("<br>\n");
}
}
int main()
{
List *list=CreateList();
//Добавляем че хотим в list и удаляем че хотим из list (подаем номер элемента на удаление)
}
Объяснение кода листинга программы
Код представляет собой реализацию односвязного списка в языке C.
Список содержит структуры, которые включают в себя целочисленное значение a и указатели на следующий и предыдущий элементы.
В функции CreateList создается новый список, его голова и хвост указывают на NULL.
Функция CreateNode создает новый узел со значением a и указывает его указатели на NULL.
Функция AddNode добавляет новый узел в список. Если список пуст, новый узел становится головой и хвостом списка. В противном случае новый узел добавляется в конец списка.
Функция DeleteNode удаляет указанный узел из списка. Если список пуст или указанный номер больше размера списка или меньше 1, выводится сообщение об ошибке. В противном случае указанный узел удаляется из списка, а его соседи переустанавливаются, чтобы избежать дыр в списке.
Функция PrintList выводит содержимое списка. Если список пуст, выводится сообщение об ошибке. В противном случае выводится список в формате номер элемента)значение элемента.
В функции main создается новый список, в который добавляются и удаляются элементы по желанию.
Код не содержит прямого указания на сортировку структур по цене или удаление машин с EGA монитором. Возможно, эти операции должны были быть реализованы, но код, который их выполняет, отсутствует.