Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
госы / KonspLkStrukturnoe_programmirovanie_na_C__311.doc
Скачиваний:
45
Добавлен:
10.04.2015
Размер:
559.1 Кб
Скачать

Void main()

{

ref list=NULL, cur=NULL; // указатели на первый и текущий элемент

list=new node; //инициализация первого элемента

cout <<"\ninput number: "; cin >>(* list).el; //ввод первого числа

(*list).next=NULL; //указатель на следующий элемент

cur=list; //указатель на текущий элемент списка

while (a!=0) { // последнее число равно нулю – признак конца ввода

(*cur).next=new node; //инициализация следующего элемента

cur=(*cur).next; //перевод указателя на следующий элемент

cout <<"\ninput number: "; cin >>(*cur).el; //ввод следующего числа

}

(*cur).next=NULL;//поле-указатель последнего элемента

cur=list; //указатель на первый элемент

while (cur!=NULL){ //элемент существует

cout <<=(*cur).el <<' '; //вывод числа на экран

cur=(*cur).next; //переход к следующему элементу списка

}

}

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

Алгоритм формирования и вывода линейного однонаправленного списка с заглавным элементом может быть записан в следующем виде:

#include <iostream.h>

struct node;

typedef node* ref;

struct node{

ref next;

int el;

};

Void main()

{

ref list=NULL, cur=NULL; // указатели на заглавный и текущий элемент

list=new node; //инициализация заглавного элемента

cur=list; //указатель на текущий элемент списка

(*list).next=NULL; //указатель на следующий элемент

do{

(*cur).next=new node; //инициализация следующего элемента

cur=(*cur).next; //перевод указателя на следующий элемент

cout <<"\ninput number: "; cin >>(*cur).el; //ввод следующего числа

} while (a!=0); // последнее число равно нулю – признак конца ввода

(*cur).next=NULL;//поле-указатель последнего элемента

cur=(*list).next; //указатель на первый элемент после заглавного

while (cur!=NULL){ //элемент существует

cout <<(*cur).el <<' '; //вывод числа на экран

cur=(*cur).next; //переход к следующему элементу списка

}

}

Здесь использован цикл с постусловием, поскольку признак конца вводимой последовательности (число 0) входит в эту последовательность, т.е. является ее последним членом.

Аналогично может быть определена любая операция над линейным однонаправленным списком: инициализация, поиск, вставка и удаление элемента. Будем обозначать эти операции InitList, SeekList, InsList и DelList соответственно. Будем рассматривать эти операции применительно к списку с заглавным элементом в предположении, что типы ref и node определены глобально.

void InsertList(ref &cur, int a){ //вставка после cur значения a

ref q;

q=new node; //новый элемент

q->el=a; //занесение значения a в новый элемент

q->next=cur->next;

cur->next=q; //включение нового элемента в список

}

Соседние файлы в папке госы