Реферат: Двунаправленный динамический список

Задание

Реализоватьбазу данных на основе двунаправленного динамического списка, содержащегофамилию, имя, отчество человека, дату его рождения и знак зодиака по западномукалендарю.

Впрограммном изделии предусмотреть работу со списком, которая включает в себя:

1.<span Times New Roman"">    

Ввод данных;

2.<span Times New Roman"">    

Удаление данных из списка;

3.<span Times New Roman"">    

Вывод списка на дисплей;

4.<span Times New Roman"">    

Сортировку списка по фамилии.

Написатьпрограммное изделие на двух языках программирования: C, Pascal.

Описание алгоритма программы                                                                                  соструктурой данных

<span Times New Roman",«serif»">Взаимодействие программы с пользователемдолжно быть реализовано по следующему алгоритму:

<span Times New Roman",«serif»">Выбор из главного меню одной изследующих функций:

<span Times New Roman",«serif»">а) Добавить;

<span Times New Roman",«serif»">б)

Удалить<span Times New Roman",«serif»">;

<span Times New Roman",«serif»">в) П

росмотреть;<span Times New Roman",«serif»">

<span Times New Roman",«serif»">г) С

ортировать<span Times New Roman",«serif»">;

<span Times New Roman",«serif»">д) Выход.

<span Times New Roman",«serif»">После выполнения каждой функциинеобходимо обеспечить возврат в главное меню и выбор любой другой функции.

<span Times New Roman",«serif»">При выборе функции «Выход» работапрограммы завершается.

Привыборе функции «Добавить», выделяется память для хранения данных, затемпользователю предлагается ввести фамилию, имя, отчество и дату рождениячеловека, эти данные заносятся в память, после чего автоматически определяетсязнак зодиака по западному календарю и заносится в память.

Привыборе функции «Удалить», проверяется наличие данных в списке. Если списокпуст, на дисплей выводится соответствующее сообщение; иначе пользователюпредлагается ввести фамилию, имя и отчество человека, после чего происходит егопоиск в списке. Если данные на  человекавнесены в список, то происходит удаление этих данных и освобождение памяти;иначе на дисплей выводится надпись об их отсутствии.

Привыборе функции «Просмотреть», поверяется наличие данных в списке. Если  данные отсутствуют, на дисплей выводитсясоответствующее сообщение; иначе выводится таблица, содержащая фамилию, имя,отчество, дату рождения человека и его знак зодиака по западному гороскопу.

Привыборе функции «Сортировать», происходит сортировка списка по фамилии. Если всписке встречаются две одинаковые фамилии, тогда сравниваются имена; при совпаденииимён сравниваются отчества.

Описаниепрограммы

Дляреализации динамического списка в программе применён тип указателей,указывающий на запись ”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<'0') or (s2>'9')) and(n<10) do

                                 begin

inc(n);

s2:=copy(temp^.bethday,n,1);

                                 end;

inc(n);

s1:=copy(temp^.bethday,n,1);

if (s1>='0') and (s1<='9') then s2:=s2+s1

   elses2:='0'+s2;

while ((s1<'А') or (s1>'я'))and (n<10) do

                                     begin

inc(n);

s1:=copy(temp^.bethday,n,1);

                                     end;

s1:=copy(temp^.bethday,n,3);

temp^.zodiak:=' ';

if s1='апр' then

   ifs2<'21' then temp^.zodiak:='овен'

   elsetemp^.zodiak:='телец';

if s1='мая' then

   ifs2<'21' then temp^.zodiak:='телец'

   elsetemp^.zodiak:='близнецы';

if s1='июн' then

   ifs2<'22' then temp^.zodiak:='близнецы'

   elsetemp^.zodiak:='рак';

if s1='июл' then

   ifs2<'23' then temp^.zodiak:='рак'

   else temp^.zodiak:='лев';

if s1='авг' then

   ifs2<'24' then temp^.zodiak:='лев'

   elsetemp^.zodiak:='дева';

if s1='сен' then

   ifs2<'24' then temp^.zodiak:='дева'

   elsetemp^.zodiak:='весы';

if s1='окт' then

   ifs2<'24' then temp^.zodiak:='весы'

   elsetemp^.zodiak:='скорпион';

if s1='ноя' then

   ifs2<'23' then temp^.zodiak:='скорпион'

   elsetemp^.zodiak:='стрелец';

if s1='дек' then

   ifs2<'22' then temp^.zodiak:='стрелец'

   elsetemp^.zodiak:='козерог';

if s1='янв' then

   ifs2<'21' then temp^.zodiak:='козерог'

   elsetemp^.zodiak:='водолей';

if s1='фев'

   thenif s2<'21' then temp^.zodiak:='водолей'

   elsetemp^.zodiak:='рыбы';

if s1='мар'

   thenif s2<'21' then temp^.zodiak:='рыбы'

   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((ffam<>temp^.fam) or (fname<>temp^.name) or

              (ffanem<>temp^.fanem)) and (temp<>nil) do

                                                                           temp:=temp^.next;

   {2}iftemp=nil then

    begin

   write('Такогонет');

   readln;

    end

      else

       begin{else2}

       {3}if first<>cut 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 first<>nil then

begin

while temp<>nil 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 first<>nil then

   begin

   m:=true;

   {0}while m=true  do

      begin

       m:=false;

       temp:=first;

        while temp^.next<>nil 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^.prev<>nil do

       begin{2.1}

        if (temp^.fam<temp^.prev^.fam) or

              (temp^.fam=temp^.prev^.fam) and

              (temp^.name<temp^.prev^.name) or

                  (temp^.fam=temp^.prev^.fam)and

                  (temp^.name=temp^.prev^.name)and

                  (temp^.fanem<temp^.prev^.fanem)then

         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<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<alloc.h>

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»)<0) strcpy((*temp).zodiak,"овен");

    elsestrcpy((*temp).zodiak,"телец");

 if(strcmp(s1,"мая")==0)

    if(strcmp(s2,«21»)<0) strcpy((*temp).zodiak,"телец");

    elsestrcpy((*temp).zodiak,"близнецы");

 if(strcmp(s1,"июн")==0)

    if(strcmp(s2,«22»)<0) strcpy((*temp).zodiak,"близнецы");

    elsestrcpy((*temp).zodiak,"рак");

 if(strcmp(s1,"июл")==0)

    if(strcmp(s2,«23»)<0) strcpy((*temp).zodiak,"рак");

    elsestrcpy((*temp).zodiak,"лев");

 if(strcmp(s1,"авг")==0)

    if(strcmp(s2,«24»)<0) strcpy((*temp).zodiak,"лев");

    elsestrcpy((*temp).zodiak,"дева");

 if(strcmp(s1,"сен")==0)

    if(strcmp(s2,«24»)<0) strcpy((*temp).zodiak,"дева");

    elsestrcpy((*temp).zodiak,"весы");

 if(strcmp(s1,"окт")==0)

    if(strcmp(s2,«24»)<0) strcpy((*temp).zodiak,"весы");

    elsestrcpy((*temp).zodiak,«скорпион»);

 if (strcmp(s1,«ноя»)==0)

    if (strcmp(s2,«23»)<0)strcpy((*temp).zodiak,«скорпион»);

    elsestrcpy((*temp).zodiak,«стрелец»);

 if (strcmp(s1,«дек»)==0)

    if (strcmp(s2,«22»)<0)strcpy((*temp).zodiak,«стрелец»);

    elsestrcpy((*temp).zodiak,«козерог»);

 if (strcmp(s1,«янв»)==0)

    if (strcmp(s2,«21»)<0)strcpy((*temp).zodiak,«козерог»);

    elsestrcpy((*temp).zodiak,«водолей»);

 if (strcmp(s1,«фев»)==0)

    if (strcmp(s2,«21»)<0)strcpy((*temp).zodiak,«водолей»);

    elsestrcpy((*temp).zodiak,«рыбы»);

 if (strcmp(s1,«мар»)==0)

    if (strcmp(s2,«21»)<0)strcpy((*temp).zodiak,«рыбы»);

    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<39-n)

    {

     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<61-n)

    {

     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)<0) ||

        (strcmp((*temp).fam,(*(*temp).prev).fam)==0) &&

               (strcmp((*temp).name,(*(*temp).prev).name)<0) ||

        (strcmp((*temp).fam,(*(*temp).prev).fam)==0) &&

               (strcmp((*temp).name,(*(*temp).prev).name)==0) &&

                    (strcmp((*temp).fanem,(*(*temp).prev).fanem)<0))

     {

      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);

}

еще рефераты
Еще работы по программированию, базе данных