Задание
Реализоватьбазу данных на основе двунаправленного динамического списка, содержащегофамилию, имя, отчество человека, дату его рождения и знак зодиака по западномукалендарю.
Впрограммном изделии предусмотреть работу со списком, которая включает в себя:
1. Ввод данных;
2. Удаление данных из списка;
3. Вывод списка на дисплей;
4. Сортировку списка по фамилии.
Написатьпрограммное изделие на двух языках программирования: C, Pascal.Описание алгоритма программы соструктурой данных
Взаимодействие программы с пользователемдолжно быть реализовано по следующему алгоритму:
Выбор из главного меню одной изследующих функций:
а) Добавить;
б) Удалить;
в) Просмотреть;
г) Сортировать;
д) Выход.
После выполнения каждой функциинеобходимо обеспечить возврат в главное меню и выбор любой другой функции.
При выборе функции «Выход» работапрограммы завершается.
Привыборе функции «Добавить», выделяется память для хранения данных, затемпользователю предлагается ввести фамилию, имя, отчество и дату рождениячеловека, эти данные заносятся в память, после чего автоматически определяетсязнак зодиака по западному календарю и заносится в память.
Привыборе функции «Удалить», проверяется наличие данных в списке. Если списокпуст, на дисплей выводится соответствующее сообщение; иначе пользователюпредлагается ввести фамилию, имя и отчество человека, после чего происходит егопоиск в списке. Если данные на человекавнесены в список, то происходит удаление этих данных и освобождение памяти;иначе на дисплей выводится надпись об их отсутствии.
Привыборе функции «Просмотреть», поверяется наличие данных в списке. Если данные отсутствуют, на дисплей выводитсясоответствующее сообщение; иначе выводится таблица, содержащая фамилию, имя,отчество, дату рождения человека и его знак зодиака по западному гороскопу.
Привыборе функции «Сортировать», происходит сортировка списка по фамилии. Если всписке встречаются две одинаковые фамилии, тогда сравниваются имена; при совпаденииимён сравниваются отчества.
Описаниепрограммы
Дляреализации динамического списка в программе применён тип указателей,указывающий на запись ”Inform”,содержащую фамилию ”fam”, имя ”name”, отчество ”fanem”, деньрождения ”bethday”, знакзодиака ”zodiak” иуказатели на следующий ”next” ипредыдущий ”prev” элементысписка.
Спомощью этого типа ”Ukazat” описаныпеременные: “temp” – дляхранения указателя на текущий элемент; “first” – для хранения указателя на первый элемент в списке; “cut” – для хранения на последний элемент в списке. Переменная“ch” используется для выборапроцедуры; “s1”, “s2”, “n” – длявычисления знака зодиака; “m” – дляпроверки условия, при сортировке; “ffam”, “fname”, “ffanem” – длявременного хранения фамилии, имени, отчества, при удалении элемента из списка.
Программаначинает выполняться с присвоения указателю на первый элемент (first) значения “nil”. Послеэтого пользователю предлагается выбрать действие: «1-Добавить», «2-Удалить», «3-Просмотреть»,«4-Сортировать», «0-Выход». В зависимости от того, какое действие выберетпользователь, начнёт выполняться та или иная процедура, или произойдёт выход изпрограммы. Это реализовано с помощью операции выбора “case”.После выполнения некоторой процедуры пользователю вновьпредлагается выбрать одно из вышеуказанных действий, пока не будет выбран выходиз программы. Это реализовано с помощью цикла “repeatuntil”.
Процедура добавления “Dobav”.
Сначалавыделяется память под текущий элемент (new(temp)), затем вэтот элемент записывается фамилия, имя, отчество и дата рождения. По датерождения вычисляется знак зодиака. Для этого в s2 записывается число рождения, а в s1 первые три буквы месяца рождения, затем, путём сравненияэтих переменных с числами и частями слов находится соответствующий знакзодиака, и заносится в текущий элемент. После ввода информации, проверяетсяналичие элементов в списке. Если они отсутствуют, то в текущем элементе,указателям на следующий (next) ипредыдущий (prev) элементыприсваивается значение “nil”; а указательна сам элемент (temp) присваиваетсяуказателям на первый (first) ипоследний (cut) элементыв списке. Если список не пустой, то в текущем элементе, указателю на следующийэлемент (next)присваивается значение “nil”, ауказателю на предыдущий элемент (prev)присваивается указатель на последний элемент (cut) в списке; а указателю на следующий элемент (next) последнего элемента в списке и указателю напоследний элемент (cut) присваиваетсяуказатель на текущий элемент (temp). После чего процедура добавления завершается.
Процедура удаления “Udal”.
Вэтой процедуре сначала проверяется наличие элементов в списке. Если списокпуст, то выводится сообщение: «Таблица пуста». Если же список содержитэлементы, то пользователю предлагается ввести фамилию, имя и отчество удаляемого,записывая их в ffam, fname, ffanemсоответственно. После происходит поиск удаляемого элемента в списке. Этореализовано с помощью цикла, который выполняется, пока элемент не найден или непросмотрен весь список. Если искомый элемент отсутствует, то выводитсясообщение: «Такого нет». Если же искомый элемент найден, то текущий указатель (temp) показывает на него, и происходит его удаление.
Еслиуказатели на первый (first) ипоследний (cut) элементыне равны, то происходит поиск местонахождения элемента в списке. Если внутритекущего элемента указатель на предыдущий элемент (prev) равен nil, тогдауказателю на предыдущий элемент (prev) внутриследующего за текущим элементом присваивается указатель на предыдущий элементвнутри текущего, а указателю на первый элемент (first) в списке присваивается указатель на следующий элемент. Есливнутри текущего элемента указатель на следующий элемент (next) равен nil,тогда указателю на следующий элемент (next) внутри предыдущего перед текущим элементом присваиваетсяуказатель на следующий элемент внутри текущего, а указателю на последнийэлемент (cut) в спискеприсваивается указатель на предыдущий элемент. Если текущий элемент оказался«внутри» списка, тогда указателю на следующий элемент (next) внутри предыдущего перед текущим элементом присваиваетсяуказатель на следующий элемент внутри текущего, а указателю на предыдущийэлемент (prev) внутриследующего за текущим элементом присваивается указатель на предыдущий элементвнутри текущего.
Еслиже указатели на первый (first) ипоследний (cut) элементыравны, то указателю на первый элемент в списке (first) присваивается nil.
Посленекоторых преобразований внутри списка происходит освобождение памяти текущегоэлемента (dispose(temp)). На этом процедура удаления завершается.
Процедура просмотра “Prosm”.
Этапроцедура выполняет вывод содержимого списка в виде таблицы.
Сначалана дисплей выводится шапка таблицы, содержащая: «Фамилия Имя Отчество», «Датарождения» и «Знак зодиака». После вывода шапки проверяется наличие элементов всписке.
Еслисписок содержит элементы, то происходит их построчный вывод. Это реализовано спомощью цикла, который выполняется, пока указатель на текущий элемент (temp) не переберёт все элементы списка. В циклевычисляется длина фамилии, имени и отчества, после чего они выводятся надисплей, а за ними выводятся дата рождения и знак зодиака; затем указателю натекущий элемент (temp)присваивается указатель на следующий за ним элемент.
Еслисписок окажется пуст, то выводится сообщение: «Таблица пуста».
Послезавершения цикла или вывода сообщения, процедура просмотра завершается.
Процедура сортировки “Sortir”.
Дляэтой процедуры применена локальная переменная “tmp” типа “ukazat”. Здесьсначала проверяется наличие элементов в списке.
Еслисписок содержит элементы, то переменной “m” присваивается значение “true”, затем выполняется цикл, пока “m=true”. В циклепеременной “m” присваиваетсязначение “false”,указателю на текущий элемент (temp)присваивается указатель на первый элемент в списке (first), и выполняется вложенный цикл, пока указатель на следующийэлемент внутри текущего не равен “nil”. В этом цикле проверяется какой элемент больше.
Еслитекущий элемент окажется больше чем следующий за ним элемент, тогда переменной “m” присваивается значение “true”, и проверяется местонахождение текущего элемента в списке.Если он окажется в начале списка, то указателю на первый элемент в списке (first) присваивается указатель на следующий элемент затекущим, а иначе указателю на следующий элемент (next) внутри предыдущего перед текущим элементом присваиваетсяуказатель на следующий элемент внутри текущего. Если же текущий элементокажется в конце списка, тогда указателю на последний элемент в спискеприсваивается указатель на текущий элемент, а локальной переменной “tmp” присваивается значение “nil”, а иначе указателю на предыдущий элемент (prev) следующего элемента после следующего за текущимэлементом присваивается указатель на текущий элемент, а локальной переменной (tmp) присваивается указатель на следующий элемент послеследующего за текущим элементом. После выяснения местоположения и выполнениянекоторых команд, указателю на следующий элемент после следующего за текущимэлементом присваивается указатель на текущий элемент, указателю на предыдущийэлемент следующего за текущим элементом присваивается указатель на предыдущийэлемент перед текущим; а внутри текущего элемента указателю на предыдущий передтекущим присваивается указатель на следующий элемент за текущим, и указателю наследующий элемент за текущим присваивается локальная переменная “tmp”. Если же текущий элемент окажется не больше чем следующийза ним элемент, тогда указателю на текущий элемент (temp) присваивается указатель на следующий за ним элемент (next). На этом выполнение вложенного цикла завершается.
Переменной“m” снова присваивается значение “false”, а указателю на текущий элемент (temp) присваивается указатель на последний элемент всписке (cut), ивыполняется ещё один вложенный цикл, пока указатель на предыдущий элементвнутри текущего не равен “nil”. В этом цикле проверяется какой элемент меньше.
Еслитекущий элемент окажется меньше чем предыдущий перед ним элемент, тогдапеременной “m”присваивается значение “true”, ипроверяется местонахождение текущего элемента в списке. Если он окажется вконце списка, то указателю на последний элемент в списке (cut) присваивается указатель на предыдущий элемент передтекущим, а иначе указателю на предыдущий элемент (prev) внутри следующего за текущим элементом присваиваетсяуказатель на предыдущий элемент внутри текущего. Если же текущий элементокажется в начале списка, тогда указателю на первый элемент в спискеприсваивается указатель на текущий элемент, а локальной переменной “tmp” присваивается значение “nil”, а иначе указателю на следующий элемент (next) предыдущего элемента перед предыдущим до текущегоэлемента присваивается указатель на текущий элемент, а локальной переменной (tmp) присваивается указатель на предыдущий элемент передпредыдущим до текущего элемента. После выяснения местоположения и выполнениянекоторых команд, указателю на предыдущий элемент перед предыдущим до текущегоэлемента присваивается указатель на текущий элемент, указателю на следующийэлемент предыдущего перед текущим элементом присваивается указатель наследующий после текущего; а внутри текущего элемента указателю на следующийэлемент присваивается указатель на предыдущий элемент, и указателю напредыдущий элемент присваивается локальная переменная “tmp”. Если же текущий элемент окажется не меньше чем предыдущийперед ним элемент, тогда указателю на текущий элемент (temp) присваивается указатель на предыдущий перед ним элемент (prev). На этом выполнение вложенного цикла завершается.
Есливо время поверки наличия элементов в списке окажется, что он пуст, то выводитсясообщение: «Таблица пуста».
Послезавершения цикла или вывода сообщения, процедура сортировки завершается.
Листингпрограммного изделия на языке программирования “Pascal”.
Program kursovik;
uses crt;
type Ukazat=^Inform;
Inform=record fam:string[15];
name:string[15];
fanem:string[15];
bethday:string[21];
zodiak:string[8];
next:Ukazat;
prev:Ukazat;
end;
var temp,first,cut:Ukazat;
ch:char;
s1,s2:string;
n:integer;
m:boolean;
ffam,fname,ffanem:string[10];
ProcedureDobav;
begin
ClrScr;
new(temp);
write(‘Введитефамилию: ‘);
readln(temp^.fam);
write(‘Введитеимя:’);
readln(temp^.name);
write(‘Введитеотчество: ‘);
readln(temp^.fanem);
write(‘Введитедату рождения: ‘);
readln(temp^.bethday);
n:=1;
s2:=copy(temp^.bethday,n,1);
while ((s2’9′)) and(n
begin
inc(n);
s2:=copy(temp^.bethday,n,1);
end;
inc(n);
s1:=copy(temp^.bethday,n,1);
if (s1>=’0′) and (s1
elses2:=’0’+s2;
while ((s1’я’))and (n
begin
inc(n);
s1:=copy(temp^.bethday,n,1);
end;
s1:=copy(temp^.bethday,n,3);
temp^.zodiak:=’ ‘;
if s1=’апр’ then
ifs2
elsetemp^.zodiak:=’телец’;
if s1=’мая’ then
ifs2
elsetemp^.zodiak:=’близнецы’;
if s1=’июн’ then
ifs2
elsetemp^.zodiak:=’рак’;
if s1=’июл’ then
ifs2
else temp^.zodiak:=’лев’;
if s1=’авг’ then
ifs2
elsetemp^.zodiak:=’дева’;
if s1=’сен’ then
ifs2
elsetemp^.zodiak:=’весы’;
if s1=’окт’ then
ifs2
elsetemp^.zodiak:=’скорпион’;
if s1=’ноя’ then
ifs2
elsetemp^.zodiak:=’стрелец’;
if s1=’дек’ then
ifs2
elsetemp^.zodiak:=’козерог’;
if s1=’янв’ then
ifs2
elsetemp^.zodiak:=’водолей’;
if s1=’фев’
thenif s2
elsetemp^.zodiak:=’рыбы’;
if s1=’мар’
thenif s2
elsetemp^.zodiak:=’овен’;
if first=nil then
begin
temp^.prev:=nil;
temp^.next:=nil;
first:=temp;
cut:=temp;
end
else begin
temp^.next:=nil;
temp^.prev:=cut;
cut^.next:=temp;
cut:=temp;
end;
end;{procedure}
Procedure Udal;
begin
ClrScr;
{1}if first=nil then
begin
writeln(‘Таблицапуста’);
readln;
end
else
begin{else1}
write(‘Введитефамилию: ‘);
readln(ffam);
write(‘Введитеимя:’);
readln(fname);
write(‘Введитеотчество: ‘);
readln(ffanem);
temp:=first;
while((ffamtemp^.fam) or (fnametemp^.name) or
(ffanemtemp^.fanem)) and (tempnil) do
temp:=temp^.next;
{2}iftemp=nil then
begin
write(‘Такогонет’);
readln;
end
else
begin{else2}
{3}if firstcut then
{4}if temp^.prev=nil then
begin
temp^.next^.prev:=temp^.prev;
first:=temp^.next;
end
else{4}
{5}if temp^.next=nil then
begin
temp^.prev^.next:=temp^.next;
cut:=temp^.prev;
end
else begin{else5}
temp^.prev^.next:=temp^.next;
temp^.next^.prev:=temp^.prev;
end{else5}
else {3} first:=nil;
dispose(temp);
end;{else2}
end;{else1}
end;{procedure}
ProcedureProsm;
begin
ClrScr;
temp:=first;
writeln(‘Фамилия Имя Отчество’:27, ‘Датарождения’:27,’Знакзодиака’:20);
write(‘________________________________________________________________’);
if firstnil then
begin
while tempnil do
begin
n:=length(temp^.fam)+length(temp^.name)+length(temp^.fanem);
writeln(temp^.fam,’ ‘,temp^.name,”,temp^.fanem,
temp^.bethday:55-n,temp^.zodiak:15);
temp:=temp^.next;
end;
end
else writeln(‘Таблицапуста’:40);
readln;
end;
ProcedureSortir;
var
tmp:ukazat;
begin
ClrScr;
if firstnil then
begin
m:=true;
{0}while m=true do
begin
m:=false;
temp:=first;
while temp^.nextnil do
begin{1}
if (temp^.fam>temp^.next^.fam) or
(temp^.fam=temp^.next^.fam) and
(temp^.name>temp^.next^.name) or
(temp^.fam=temp^.next^.fam)and
(temp^.name=temp^.next^.name)and
(temp^.fanem=temp^.next^.fanem) then
begin{2}
m:=true;
if temp=first then
first:=temp^.next
else temp^.prev^.next:=temp^.next;
if temp^.next=cut then
begin
cut:=temp;
tmp:=nil;
end
else begin{3}
temp^.next^.next^.prev:=temp;
tmp:=temp^.next^.next;
end;{3}
temp^.next^.next:=temp;
temp^.next^.prev:=temp^.prev;
temp^.prev:=temp^.next;
temp^.next:=tmp;
end{2}
else temp:=temp^.next;
end;{1}
m:=false;
temp:=cut;
while temp^.prevnil do
begin{2.1}
if (temp^.fam
(temp^.fam=temp^.prev^.fam) and
(temp^.name
(temp^.fam=temp^.prev^.fam)and
(temp^.name=temp^.prev^.name)and
(temp^.fanem
begin{2.2}
m:=true;
if temp=cut then cut:=temp^.prev
else temp^.next^.prev:=temp^.prev;
if temp^.prev=first then
begin
first:=temp;
tmp:=nil;
end
else
begin{2.3}
temp^.prev^.prev^.next:=temp;
tmp:=temp^.prev^.prev;
end;{2.3}
temp^.prev^.prev:=temp;
temp^.prev^.next:=temp^.next;
temp^.next:=temp^.prev;
temp^.prev:=tmp;
end{2.2}
else temp:=temp^.prev;
end;{2.1}
end;{0}
end
else begin
writeln(‘Таблицапуста’);
readln;
end;
end;
begin
first:=nil;
repeat
ClrScr;
writeln(‘Выберите действие:’);
writeln(‘1-Добавить’);
writeln(‘2-Удалить’);
writeln(‘3-Просмотреть’);
writeln(‘4-Сортировать’);
writeln(‘0-Выход’);
readln(ch);
case ch of
‘1’:Dobav;
‘2’:Udal;
‘3’:Prosm;
‘4’:Sortir;
end;
until ch=’0′;
end.
Листингпрограммного изделия на языке программирования “С”.
#include
#include
#include
#include
typedef
struct inform
{charname[15],fam[15],fanem[15],b_day[3],b_manth[10],b_year[5],zodiak[8];
struct inform *next,*prev;};
struct inform *first,*cut,*temp;
int n,i;
char s1[10],s2[10];
/*************************************************************/
voidDobav ( )
{
clrscr();
if((temp=(struct inform*)malloc(sizeof(struct inform)))==NULL)exit(1);
printf(“Введитефамилию: “);
scanf(“%s”,(*temp).fam);
printf(“Введитеимя:”);
scanf(“%s”,(*temp).name);
printf(“Введитеотчество: “);
scanf(“%s”,(*temp).fanem);
printf(«Введите деньрождения: „);
scanf(“%s»,(*temp).b_day);
printf(«Введите месяц рождения: „);
scanf(“%s»,(*temp).b_manth);
printf(“Введитегодрождения: “);
scanf(“%s”,(*temp).b_year);
strcpy(s2,(*temp).b_day);
strncpy(s1,(*temp).b_manth,3);
strcpy((*temp).zodiak,” “);
if(strcmp(s1,”апр”)==0)
if(strcmp(s2,«21»)
elsestrcpy((*temp).zodiak,”телец”);
if(strcmp(s1,”мая”)==0)
if(strcmp(s2,«21»)
elsestrcpy((*temp).zodiak,”близнецы”);
if(strcmp(s1,”июн”)==0)
if(strcmp(s2,«22»)
elsestrcpy((*temp).zodiak,”рак”);
if(strcmp(s1,”июл”)==0)
if(strcmp(s2,«23»)
elsestrcpy((*temp).zodiak,”лев”);
if(strcmp(s1,”авг”)==0)
if(strcmp(s2,«24»)
elsestrcpy((*temp).zodiak,”дева”);
if(strcmp(s1,”сен”)==0)
if(strcmp(s2,«24»)
elsestrcpy((*temp).zodiak,”весы”);
if(strcmp(s1,”окт”)==0)
if(strcmp(s2,«24»)
elsestrcpy((*temp).zodiak,«скорпион»);
if (strcmp(s1,«ноя»)==0)
if (strcmp(s2,«23»)
elsestrcpy((*temp).zodiak,«стрелец»);
if (strcmp(s1,«дек»)==0)
if (strcmp(s2,«22»)
elsestrcpy((*temp).zodiak,«козерог»);
if (strcmp(s1,«янв»)==0)
if (strcmp(s2,«21»)
elsestrcpy((*temp).zodiak,«водолей»);
if (strcmp(s1,«фев»)==0)
if (strcmp(s2,«21»)
elsestrcpy((*temp).zodiak,«рыбы»);
if (strcmp(s1,«мар»)==0)
if (strcmp(s2,«21»)
elsestrcpy((*temp).zodiak,«овен»);
if (first==NULL)
{
(*temp).next=NULL;
(*temp).prev=NULL;
first=temp;
cut=temp;
}
else
{
(*temp).next=NULL;
(*temp).prev=cut;
(*cut).next=temp;
cut=temp;
}
}
/*************************************************************/
voidUdal ( )
{
char ffam[10],fname[10],ffanem[10];
clrscr();
if (first==NULL) printf(«Таблицапустаn»);
else
{
printf(«Введите фамилию: „);
scanf(“%s»,ffam);
printf(«Введите имя: „);
scanf(“%s»,fname);
printf(«Введите отчество: „);
scanf(“%s»,ffanem);
temp=first;
while((strcmp(ffam, (*temp).fam) ||strcmp(fname,(*temp).name) ||
strcmp(ffanem,(*temp).fanem)) && temp!=NULL)
temp=(*temp).next;
if (temp==NULL) printf(«Неттакого»);
else
{
if (first!=cut)
if ((*temp).prev==NULL)
{
(*(*temp).next).prev=(*temp).prev;
first=(*temp).prev;
}
else
if ((*temp).next==NULL)
{
(*(*temp).prev).next=(*temp).next;
cut=(*temp).prev;
}
else
{
(*(*temp).prev).next=(*temp).next;
(*(*temp).next).prev=(*temp).prev;
}
else first=NULL;
free(temp);
}
}
scanf(“%s”);
}
/*************************************************************/
voidProsm ( )
{
clrscr();
if (first==NULL) printf(«Таблицапуста»);
else
{
printf(«Фамилия Имя Отчество Дата рождения»);
printf(” ‡Знак зодиака”);
printf(«n——————————————————————————–»);
temp=first;
do
{
n=strlen((*temp).fam)+strlen((*temp).name)+strlen((*temp).fanem);
printf(«n%s %s %s»,(*temp).fam,(*temp).name,(*temp).fanem);
i=1;
while (i
{
printf(” “);
i++;
}
printf(“%s “,(*temp).b_day);
printf(“%s “,(*temp).b_manth);
printf(“%s “,(*temp).b_year);
n=n+i+strlen((*temp).b_day)+strlen((*temp).b_manth)+strlen((*temp).b_year);
i=1;
while (i
{
printf(” “);
i++;
}
printf(“%s”,(*temp).zodiak);
temp=(*temp).next;
}
while (temp!=NULL);
}
scanf(“%s”);
}
/*************************************************************/
voidSortir ( )
{
structinform *tmp;
intm;
clrscr();
if(first!=NULL)
{
m=1;
while(m==1)
{
m=0;
temp=first;
while((*temp).next!=NULL)
{
if((strcmp((*temp).fam,(*(*temp).next).fam)>0)||
(strcmp((*temp).fam,(*(*temp).next).fam)==0) &&
(strcmp((*temp).name,(*(*temp).next).name)>0) ||
(strcmp((*temp).fam,(*(*temp).next).fam)==0) &&
(strcmp((*temp).name,(*(*temp).next).name)==0)&&
(strcmp((*temp).fanem,(*(*temp).next).fanem)>0))
{
m=1;
if (temp==first) first=(*temp).next;
else (*(*temp).prev).next=(*temp).next;
if ((*temp).next==cut)
{
cut=temp;
tmp=NULL;
}
else
{
(*(*(*temp).next).next).prev=temp;
tmp=(*(*temp).next).next;
}
(*(*temp).next).next=temp;
(*(*temp).next).prev=(*temp).prev;
(*temp).prev=(*temp).next;
(*temp).next=tmp;
}
else temp=(*temp).next;
}
m=0;
temp=cut;
while((*temp).prev!=NULL)
{
if((strcmp((*temp).fam,(*(*temp).prev).fam)
(strcmp((*temp).fam,(*(*temp).prev).fam)==0) &&
(strcmp((*temp).name,(*(*temp).prev).name)
(strcmp((*temp).fam,(*(*temp).prev).fam)==0) &&
(strcmp((*temp).name,(*(*temp).prev).name)==0) &&
(strcmp((*temp).fanem,(*(*temp).prev).fanem)
{
m=1;
if (temp==cut) cut=(*temp).prev;
else (*(*temp).next).prev=(*temp).prev;
if ((*temp).prev==first)
{
first=temp;
tmp=NULL;
}
else
{
(*(*(*temp).prev).prev).next=temp;
tmp=(*(*temp).prev).prev;
}
(*(*temp).prev).prev=temp;
(*(*temp).prev).next=(*temp).next;
(*temp).next=(*temp).prev;
(*temp).prev=tmp;
}
else temp=(*temp).prev;
}
}
}
else printf(«Таблица пуста»);
scanf(“%s”);
}
/*************************************************************/
voidmain()
{
char ch;
first=NULL;
do
{
clrscr();
printf(«Выбертедействиеn1-Добавитьn2-Удалитьn»);
printf(«3-Просмотретьn4-Сортироватьn0-Выход»);
scanf(“%d”,&ch);
switch(ch)
{
case 1:Dobav();break;
case 2:Udal();break;
case 3:Prosm();break;
case 4:Sortir();break;
}
}
while(ch);
}