#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct node
{
int id;//номер элемента
char *string;// строка
struct node *next;// ссылка на следующий элемент
}ITEM;
typedef struct hnode
{
int number;//количество элементов в списке
ITEM *first;//ссылка на первый
}HITEM;
HITEM *head=NULL;
int LastID=0;
void EmptyList();
void ViewList();
void AddList();
void main(void)
{
int key;
EmptyList();
for(;;)
{
puts("ENTER - добавление");
puts("V - просмотр");
puts("ESC - выход");
key=getch();
if(key==27) //ESC
{
break;
}
else
{
switch(key)
{
case 13: //ENTER
AddList();
break;
case 118: //V
ViewList();
break;
default:
break;
}
}
}
}
void EmptyList()//создание головы. можно не заморачиваться и просто скопировать
{
if((head=(HITEM *)malloc(sizeof(HITEM)))!=NULL)
{
head->number=0;
head->first=NULL;
}
else
{
puts("Memory error");
}
}
void ViewList()
{
ITEM *current=head->first;
if(head->number==0)//проверяем пуст ли список
{
puts("List is empty");
}
else//если в списке есть элементы
{
while(current!=NULL)
{
printf("%d. ", current->id);//вывод элемента
puts(current->string);//вывод элемента
current=current->next;// (текущий элемент)=(следующему элементу)
}
}
}
void AddList()
{
ITEM *current=head->first, *new_node;
char *str;
puts("Введите строку: ");
gets(str);
if((new_node=(ITEM *)malloc(sizeof(ITEM)))==NULL)//выделение памяти под новый элемент списка
{
puts("Memory error");
}
else
{
strcpy(new_node->string, str);// копипирование информационной части в список
new_node->id=++LastID;//номер информационной части
new_node->next=NULL;//ссылка на следующий элемент
if(head->number==0)//проверяем пуст ли список
{//если пуст
head->first=new_node;// ссылка на первый элемент списка = новому элементу
head->number=1;// количество элементов
}
else
{//если есть элементы
while(current->next!=NULL)//пока ссылка на следующий не пуста
{
current=current->next;// (текущий элемент)=(следующему элементу)
}
current->next=new_node;//(ссылка на следующий)=(новому элементу элементу)
}
}
}