Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

Void newHead( //прототип функции создающей узел

PtrNode& head, //адрес головного узла

char name[], int year //данные нового узла

);

main(){

SetConsoleOutputCP(1251); //руссие буквы при выводе

SetConsoleCP(1251); //руссие буквы при ввводе

PtrNode head;//указатель на текущий узел, он будет изменяться

//создаем первый узел

head=new sotrudnik;//указатель первый узел объемом=sotrudnik

strcpy(head->name,"Иванов Иван Иванович");

head->year_b=1991;

head->link=NULL;

//первый узел готов

char str[30];

int year;

for(int i=0;i<4;i++){ //создаем еще 4 узла

cout<<endl<<"Имя: ";

cin>>str;

cout<<"Год рождения: ";

cin>>year;

newHead(head, str, year); /* вызываем функцию создания узла и

каждый раз передаем в нее адрес предадущего узла*/

}

//все узлы подготовлены и находятся в памяти

char z;

cin>>z;

}

//Функция для вставки нового головного узла

void newHead(PtrNode& head, char name[], int year){

PtrNode tempPtr=new sotrudnik;

strcpy(tempPtr->name,name);

tempPtr->year_b=year;

tempPtr->link=head;

head=tempPtr;

}

Для просмотра введенных всего списка нужно добавить функцию

PtrNode review(PtrNode head){

PtrNode h=head; //указателю присваивается значение головного узла

if(h==NULL){ //Случай пустого списка

return NULL;

}

else{

cout<<"ФИО:"<<h->name<<endl<<"Годрождения:"<<h->year_b<<endl;

return h->link; //возвращаем указатель

}

}

Тогда вся программа принимает вид

#include<windows.h>

#include<iostream.h>

struct sotrudnik{

char name[30];

int year_b;

sotrudnik *link;

};

typedef sotrudnik *PtrNode;

PtrNode review(PtrNode head); //прототип функции просмотра

Void newHead(//прототип функции создания узла

PtrNode& head, //адрес предыдущего узла

char name[], int year //данные нового узла

);

main(){

SetConsoleOutputCP(1251);

SetConsoleCP(1251);

PtrNode head, poisk;

head=new sotrudnik;

strcpy(head->name,"Иванов Иван Иванович");

head->year_b=1980;

head->link=NULL;

char str[30];

int year;

for(int i=0;i<4;i++){

cout<<endl<<"Имя: ";

cin>>str;

cout<<"Год рождения: ";

cin>>year;

newHead(head, str, year);

}

poisk= head;

for(int i=0;i<5;i++){

poisk=review(poisk); // просмотр и получение следующего адреса

}

char z;

cin>>z;

}

//Функция для вставки нового головного узла

void newHead(PtrNode& head, char name[], int year){

PtrNode tempPtr=new sotrudnik;

strcpy(tempPtr->name,name);

tempPtr->year_b=year;

tempPtr->link=head;

head=tempPtr;

}

PtrNode review(PtrNode head){

PtrNode h=head; //указателю присваивается значение головного узла

if(h==NULL){ //Случай пустого списка

return NULL;

}

else{

cout<<"ФИО:"<<h->name<<endl<<"Годрождения:"<<h->year_b<<endl;

return h->link; //возвращается указатель на следующий узел

}

}

Поиск в связанных списках

Поиск нужного уздла осуществляется путем просматривания всех узлов, начиная с головного.

Создадим функцию для поиска нужного узла. Функция должна иметь 2 параметра: адрес головного узла и какую-нибудь величину по которой происходит поиск, например год рождения, т.е. прототип функции имеет вид:

NodePtr(NodePtr head, int target);

Код самой функции выглядит так:

NodePtr search(NodePtr head, int target){

NodePtr h=head; //указателю присваивается значение головного узла

if(h==NULL){ //Случай пустого списка

return NULL;

}

else{

while(h->year_b!=target && h->link!=NULL) //год не соответствует

h=h->link; //переход к следующему узлу

if(here->year_b==target) //год соответствует

return h; //возвращаем указатель

else

return NULL;

}

}

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

#include<windows.h>

#include<iostream.h>

struct sotrudnik{

char name[30];

int year_b;

sotrudnik *link;

};

typedef sotrudnik *PtrNode;

PtrNode review(PtrNode head);

PtrNode search(PtrNode head, int target);