рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

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

Работа сделанна в 2001 году

Двунаправленный динамический список - Курсовая Работа, раздел Программирование, - 2001 год - Казанский Государственный Технический Университет Им. А.н. Туполева Курсовая...

Казанский Государственный Технический Университет им. А.Н. Туполева Курсовая работа по дисциплине Алгоритмические языки и программирование. Тема Двунаправленный динамический список . Выполнил студент гр. Проверил Ст. преподаватель Каф. ПМИ Оценка отлично Казань 2001 Задание Реализовать базу данных на основе двунаправленного динамического списка, содержащего фамилию, имя, отчество человека, дату его рождения и знак зодиака по западному календарю.В программном изделии предусмотреть работу со списком, которая включает в себя 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. После выполнения некоторой процедуры пользователю вновь предлагается выбрать одно из вышеуказанных действий, пока не будет выбран выход из программы.

Это реализовано с помощью цикла repeat until. Процедура добавления Dobav. Сначала выделяется память под текущий элемент newtemp, затем в этот элемент записывается фамилия, имя, отчество и дата рождения. По дате рождения вычисляется знак зодиака.Для этого в 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. После некоторых преобразований внутри списка происходит освобождение памяти текущего элемента disposetemp. На этом процедура удаления завершается. Процедура просмотра Prosm. Эта процедура выполняет вывод содержимого списка в виде таблицы.Сначала на дисплей выводится шапка таблицы, содержащая Фамилия Имя Отчество, Дата рождения и Знак зодиака. После вывода шапки проверяется наличие элементов в списке.

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

Если список окажется пуст, то выводится сообщение Таблица пуста. После завершения цикла или вывода сообщения, процедура просмотра завершается. Процедура сортировки Sortir. Для этой процедуры применена локальная переменная tmp типа ukazat. Здесь сначала проверяется наличие элементов в списке. Если список содержит элементы, то переменной m присваивается значение true, затем выполняется цикл, пока mtrue.В цикле переменной 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. На этом выполнение вложенного цикла завершается.

Если во время поверки наличия элементов в списке окажется, что он пуст, то выводится сообщение Таблица пуста. После завершения цикла или вывода сообщения, процедура сортировки завершается.

Листинг программного изделия на языке программирования С. include stdio.h include stdlib.h include conio.h include alloc.h typedef struct inform char name15,fam15,fanem15,bday3,bmanth10,byea r5,zodiak8 struct inform next,prev struct inform first,cut,temp int n,i char s110,s210 void Dobav clrscr if tempstruct informmallocsizeofstruct informNULLexit1 printfВведите фамилию scanfs,temp. fam printfВведите имя scanfs,temp.name printfВведите отчество scanfs,temp.fanem printfВведите день рождения scanfs,temp.bday printfВведите месяц рождения scanfs,temp.bmanth printfВведите год рождения scanfs,temp.byear strcpys2,temp.bday strncpys1,temp.bmanth,3 strcpytemp.zodiak, if strcmps1,апр0 if strcmps2,21 0 strcpytemp.zodiak,овен else strcpytemp.zodiak,телец if strcmps1,мая0 if strcmps2,21 0 strcpytemp.zodiak,телец else strcpytemp.zodiak,близнецы if strcmps1,июн0 if strcmps2,22 0 strcpytemp.zodiak,близнецы else strcpytemp.zodiak,рак if strcmps1,июл0 if strcmps2,23 0 strcpytemp.zodiak,рак else strcpytemp.zodiak,лев if strcmps1,авг0 if strcmps2,24 0 strcpytemp.zodiak,лев else strcpytemp.zodiak,дева if strcmps1,сен0 if strcmps2,24 0 strcpytemp.zodiak,дева else strcpytemp.zodiak,весы if strcmps1,окт0 if strcmps2,24 0 strcpytemp.zodiak,весы else strcpytemp.zodiak,скорпион if strcmps1,ноя0 if strcmps2,23 0 strcpytemp.zodiak,скорпион else strcpytemp.zodiak,стрелец if strcmps1,дек0 if strcmps2,22 0 strcpytemp.zodiak,стрелец else strcpytemp.zodiak,козерог if strcmps1,янв0 if strcmps2,21 0 strcpytemp.zodiak,козерог else strcpytemp.zodiak,водолей if strcmps1,фев0 if strcmps2,21 0 strcpytemp.zodiak,водолей else strcpytemp.zodiak,рыбы if strcmps1,мар0 if strcmps2,21 0 strcpytemp.zodiak,рыбы else strcpytemp.zodiak,овен if firstNULL temp.nextNULL temp.prevNULL firsttemp cuttemp else temp.nextNULL temp.prevcut cut.nexttemp cuttemp void Udal char ffam10,fname10,ffanem10 clrscr if firstNULL printfТаблица пустаn else printfВведите фамилию scanfs,ffam printfВведите имя scanfs,fname printfВведите отчество scanfs,ffanem tempfirst whilestrcmpffam, temp.fam strcmpfname,temp.name strcmpffanem,temp.fanem tempNULL temptemp.next if tempNULL printfНет такого else if firstcut if temp.prevNULL temp.next.prevtemp.prev firsttemp.prev else if temp.nextNULL temp.prev.nexttemp.next cuttemp.prev else temp.prev.nexttemp.next temp.next.prevtemp.prev else firstNULL freetemp scanfs void Prosm clrscr if firstNULL printfТаблица пуста else printfФамилия Имя Отчество Дата рождения printf Знак зодиака printfn tempfirst do nstrlentemp.famstrlentemp.namestrlentemp .fanem printfns s s ,temp.fam,temp.name,temp.fanem i1 while i 39-n printf i printfs ,temp.bday printfs ,temp.bmanth printfs ,temp.byear nnistrlentemp.bdaystrlentemp.bmanthstrle ntemp.byear i1 while i 61-n printf i printfs,temp.zodiak temptemp.next while tempNULL scanfs void Sortir struct inform tmp int m clrscr if firstNULL m1 whilem1 m0 tempfirst whiletemp.nextNULL ifstrcmptemp. fam,temp.next.fam 0 strcmptemp.fam,temp.next.fam0 strcmptemp.name,temp.next.name 0 strcmptemp.fam,temp.next.fam0 strcmptemp.name,temp.next.name0 strcmptemp.fanem,temp.next.fanem 0 m1 if tempfirst firsttemp.next else temp.prev.nexttemp.next if temp.nextcut cuttemp tmpNULL else temp.next.next.prevtemp tmptemp.next.next temp.next.nexttemp temp.next.prevtemp.prev temp.prevtemp.next temp.nexttmp else temptemp.next m0 tempcut whiletemp.prevNULL ifstrcmptemp.fam,temp.prev.fam 0 strcmptemp.fam,temp.prev.fam0 strcmptemp. name,temp.prev.name 0 strcmptemp.fam,temp.prev.fam0 strcmptemp.name,temp.prev.name0 strcmptemp.fanem,temp.prev.fanem 0 m1 if tempcut cuttemp.prev else temp.next.prevtemp.prev if temp.prevfirst firsttemp tmpNULL else temp.prev.prev.nexttemp tmptemp.prev.prev temp.prev.prevtemp temp.prev.nexttemp.next temp.nexttemp.prev temp.prevtmp else temptemp.prev else printfТаблица пуста scanfs void main char ch firstNULL do clrscr printfВыберте действиеn1-Добавитьn2-Удалитьn printf3-Просмотретьn4-Сортироватьn0-Выхо д scanfd, ch switchch case 1Dobavbreak case 2Udalbreak case 3Prosmbreak case 4Sortirbreak whilech Листинг программного изделия на языке программирования Pascal.

Program kursovik uses crt type UkazatInform Informrecord famstring15 namestring15 fanemstring15 bethdaystring21 zodiakstring8 nextUkazat prevUkazat end var temp,first,cutUkazat chchar s1,s2string ninteger mboolean ffam,fname,ffanemstring10 Procedure Dobav begin ClrScr newtemp writeВведите фамилию readlntemp.fam writeВведите имя readlntemp.name writeВведите отчество readlntemp.fanem writeВведите дату рождения readlntemp.bethday n1 s2copytemp.bethday,n,1 while s2 0 or s2 9 and n 10 do begin incn s2copytemp.bethday,n,1 end incn s1copytemp.bethday,n,1 if s1 0 and s1 9 then s2s2s1 else s20s2 while s1 А or s1 я and n 10 do begin incn s1copytemp.bethday,n,1 end s1copytemp.bethday,n,3 temp.zodiak if s1апр then if s2 21 then temp.zodiakовен else temp.zodiakтелец if s1мая then if s2 21 then temp.zodiakтелец else temp.zodiakблизнецы if s1июн then if s2 22 then temp.zodiakблизнецы else temp.zodiakрак if s1июл then if s2 23 then temp.zodiakрак else temp.zodiakлев if s1авг then if s2 24 then temp.zodiakлев else temp.zodiakдева if s1сен then if s2 24 then temp.zodiakдева else temp.zodiakвесы if s1окт then if s2 24 then temp.zodiakвесы else temp.zodiakскорпион if s1ноя then if s2 23 then temp.zodiakскорпион else temp. zodiakстрелец if s1дек then if s2 22 then temp.zodiakстрелец else temp.zodiakкозерог if s1янв then if s2 21 then temp.zodiakкозерог else temp.zodiakводолей if s1фев then if s2 21 then temp.zodiakводолей else temp.zodiakрыбы if s1мар then if s2 21 then temp.zodiakрыбы else temp.zodiakовен if firstnil then begin temp.prevnil temp.nextnil firsttemp cuttemp end else begin temp.nextnil temp.prevcut cut.nexttemp cuttemp end endprocedure Procedure Udal begin ClrScr 1if firstnil then begin writelnТаблица пуста readln end else begin else1 writeВведите фамилию readlnffam writeВведите имя readlnfname writeВведите отчество readlnffanem tempfirst while ffam temp.fam or fname temp.name or ffanem temp.fanem and temp nil do temptemp.next 2if tempnil then begin writeТакого нет readln end else beginelse2 3if first cut then 4if temp.prevnil then begin temp.next.prevtemp.prev firsttemp.next end else4 5if temp.nextnil then begin temp.prev.nexttemp.next cuttemp.prev end else beginelse5 temp.prev.nexttemp.next temp.next.prevtemp.prev endelse5 else 3 firstnil disposetemp endelse2 endelse1 endprocedure Procedure Prosm begin ClrScr tempfirst writelnФамилия Имя Отчество27, Дата рождения27,Знак зодиака20 write if first nil then begin while temp nil do begin nlengthtemp.famlengthtemp.namelengthtemp .fanem writelntemp.fam, ,temp.name, ,temp.fanem, temp.bethday55-n,temp.zodiak15 temptemp.next end end else writelnТаблица пуста40 readln end Procedure Sortir var tmpukazat begin ClrScr if first nil then begin mtrue 0while mtrue do begin mfalse tempfirst while temp.next nil do begin1 if temp.fam temp.next.fam or temp.famtemp.next.fam and temp.name temp.next.name or temp.famtemp.next.fam and temp.nametemp.next.name and temp.fanemtemp.next.fanem then begin2 mtrue if tempfirst then firsttemp.next else temp.prev.nexttemp.next if temp.nextcut then begin cuttemp tmpnil end else begin3 temp.next.next.prevtemp tmptemp.next.next end3 temp.next.nexttemp temp.next.prevtemp.prev temp.prevtemp.next temp.nexttmp end2 else temptemp.next end1 mfalse tempcut while temp.prev nil do begin2.1 if temp.fam temp.prev.fam or temp.famtemp.prev.fam and temp.name temp.prev.name or temp.famtemp.prev.fam and temp.nametemp.prev.name and temp.fanem temp.prev.fanem then begin2.2 mtrue if tempcut then cuttemp.prev else temp.next.prevtemp.prev if temp.prevfirst then begin firsttemp tmpnil end else begin2.3 temp.prev.prev.nexttemp tmptemp.prev.prev end2.3 temp.prev.prevtemp temp.prev. nexttemp.next temp.nexttemp.prev temp.prevtmp end2.2 else temptemp.prev end2.1 end0 end else begin writelnТаблица пуста readln end end begin firstnil repeat ClrScr writelnВыберите действие writeln1-Добавить writeln2-Удалить writeln3-Просмотреть writeln4-Сортировать writeln0-Выход readlnch case ch of 1Dobav 2Udal 3Prosm 4Sortir end until ch0 end.

– Конец работы –

Используемые теги: Двунаправленный, динамический, Список0.065

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Двунаправленный динамический список

Что будем делать с полученным материалом:

Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Еще рефераты, курсовые, дипломные работы на эту тему:

Динамически размещаемые данные:память для них выделяется по операции new, существуют они пока эта память не будет освобождена
Замечание В языке С были рассмотрены данные простых и сложных типов Перед новой темой можно привести некоторую классификацию данных... по структуре... данные статической структуры которые получают структуру при описании и сохраняют е не нарушая до конца программы...

Динамические испытания изделий МЭМС
На сайте allrefs.net читайте: Динамические испытания изделий МЭМС.

Динамические характеристики микромеханического акселерометра
Динамические характеристики микромеханического акселерометра... Рассмотрим блок схему измерительной цепи акселерометра...

Линейный список –совокупность однотипных элементов, расположенных последовательно друг за другом, количество элементов в списке не фиксируется
Линейный список совокупность однотипных элементов расположенных последовательно друг за другом количество элементов в списке не фиксируется...

Динамически загружаемые библиотеки (DLL)
Структура DLL библиотеки... Library имя заголовок библиотеки... Uses раздел модулей...

ДИНАМИЧЕСКИЕ НАСОСЫ
ДИНАМИЧЕСКИЕ НАСОСЫ... Центробежный...

Стандартные процедуры размещения и освобождения динамической памяти
Динамическая память... Указатель... Стандартные процедуры размещения и освобождения динамической памяти...

Обеспечения движения автомобиля и снижения динамических нагрузок, действующих на автомобиль при его движении по неровностям дороги.
На сайте allrefs.net читайте: · обеспечения движения автомобиля и снижения динамических нагрузок, действующих на автомобиль при его движении по неровностям дороги....

1.Построить эпюры изгибающих моментов: динамических (от вибрационной нагрузки) и эпюру полных изгибающих моментов.
На сайте allrefs.net читайте: 1.Построить эпюры изгибающих моментов: динамических (от вибрационной нагрузки) и эпюру полных изгибающих моментов....

Для заданной системы построить эпюры изгибающих моментов: динамических (от вибрационной нагрузки) и эпюру полных изгибающих моментов.
На сайте allrefs.net читайте: Для заданной системы построить эпюры изгибающих моментов: динамических (от вибрационной нагрузки) и эпюру полных изгибающих моментов....

0.035
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам