Помогите переделать задания из линейного списка в двусвязный список. Тут вроде бы как переделывать немножко совсем, но сам я ну просто никак ... не получается...
Вот задания и код , сделанный по методу линейного списка - его и нужно редактировать чуток... учту ваш труд

1) одно число целого типа (уникальный номер) и один символ
2) Создать функцию для добавления элементов в упорядоченный по убыванию список исключающий добавление повторяющихся элементов
3) Удаление всех элементов в списке по переданным данным
4) Последовательный поиск до конца
5) Функция вывода списка (последовательный проход по списку с выводом значений элементов на экран)
6) Дополнительная функция: Функция которая выводит на печать список в обратном порядке (использовать рекурсию).
Код программы:
Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
typedef struct node
{ int data;
char data1;
struct node *next;
} ITEM;
ITEM* add_node(ITEM* head, int new_data, char new_data1)
{
ITEM *new_item,*prev,*next1;
new_item=(ITEM *)malloc(sizeof(ITEM));
if(new_item==NULL)
{
puts("Oshibka vydeleniya pamyati");
return head;
}
new_item->data=new_data;
new_item->data1=new_data1;
new_item->next=NULL;
if(head==NULL)
{
puts("Spisok sozdan");
return new_item;}
else
{
prev=head;
next1=head->next;
if (prev->data<new_data)
{
new_item->next=head;
printf("Element wstawlen w nachalo");
return new_item;
}
while((prev->next->data>new_data)&&(next1!=NULL))
{
prev=next1;
next1=next1->next;
}
if(prev->data==new_data)
{
printf("Takoj element uze est'");
return head;}
else
{
new_item->next=next1;
prev->next=new_item;
printf("Element dobawlen");
return head;
}
}
}
ITEM* udal_node(ITEM* head, int udal_data)
{
ITEM *cur=head, *prev=NULL;
while((cur!=NULL) && (cur->data>=udal_data))
if(cur->data==udal_data)
if (cur==head)
{
prev=cur->next;
free(cur);
printf("Udalena golowa spiska");
return prev;
}
else{
prev->next=cur->next;
free(cur);
printf("Element udalen");
return head;
}
else
{
prev=cur;
cur=cur->next;
}
printf("Element otsutstwuet w spiske");
return head;
}
ITEM* poisk_node(ITEM* head, int find_data)
{
ITEM *cur=head;
while((cur!=NULL) && (cur->data>=find_data))
{
if(cur->data==find_data)
return cur;
cur=cur->next;
}
return NULL;
}
ITEM* vyvod_node(ITEM* head)
{ ITEM *cur=head;
clrscr();
if (cur==NULL)
{
puts("Spisok ne sozdan");
return cur;
}
else
{
printf("Spisok\n");
while(cur!=NULL)
{
printf("%5d%3c\n",cur->data,cur->data1);
cur=cur->next;
}
}
return head;
}
void recurs_node(ITEM* head)
{ ITEM *cur=head;
if (cur->next!=NULL)
recurs_node(cur->next);
printf("%5d%3c\n",cur->data,cur->data1);
return 0;
}
int main()
{
ITEM *Head=NULL,*search;
char data1;
char key;
int data;
while(1)
{
clrscr();
puts("1 - Dobavit' element");
puts("2 - Udalit' element");
puts("3 - Naiti element");
puts("4 - Vyvod spiska");
puts("5 - Spec. funkciya");
puts("ESC - Quit");
key=getch();
switch(key)
{
case '1':
clrscr();
printf("Vvedite chislo\n");
fflush(stdin);
scanf("%d",&data);
printf("Vvedite simvol\n");
fflush(stdin);
scanf("%c",&data1);
Head=add_node(Head,data,data1);
break;
case '2':
clrscr();
printf("Vvedite chislo\n");
fflush(stdin);
scanf("%d",&data);
Head=udal_node(Head,data);
break;
case '3':
clrscr();
if (Head==NULL)
printf("Spisok ne sozdan");
else{
printf("Vvedite chislo\n");
fflush(stdin);
scanf("%d",&data);
clrscr();
if((search=poisk_node(Head,data))==NULL)
printf("Element ne naiden\n");
else{
printf("Element naiden\n");
printf("%5d%3c",search->data,search->data1);
search=NULL;}}
break;
case '4':
Head=vyvod_node(Head);
break;
case '5':
clrscr();
if (Head==NULL)
printf("Spisok ne sozdan\n");
else
{
printf("Spisok w obratnom porjadke\n");
recurs_node(Head);
}
break;
case 27:
puts("Quit");
return 0;
} getch();
} return 0; }