Программа LinkedListData...178

Программа LinkedListData использует связанный список для хранения списка объектов, содержащих имена людей. Программу очень легко расширить, добавив, например, номера социального страхования или вес. Просто я старался сделать программу максимально простой.

    /* LinkedListData — хранение данных в связанном списке */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    #include <string.h>

    using namespace std ;

    /* NameDataSet — хранит имя человека ( этот объект можно легко расширить для хранения другой информации ). */

    class NameDataSet

    {

        public :

            char szName[ 128 ] ;

            /* Указатель на следующую запись в списке */

            NameDataSet* pNext ;

    } ;

    /* Указатель на первую запись списка */

    NameDataSet* pHead = 0 ;

    /* Добавление нового члена в список */

    void add( NameDataSet* pNDS )

    {

        pNDS -> pNext = pHead ;

        /* Заголовок указывает на новую запись */

        pHead = pNDS ;

    }

    /* getData — чтение имени */

    NameDataSet* getData( )

    {

_________________

178 стр. Часть 3. Введение в классы

        // Читаем имя

        char nameBuffer [ 128 ] ;

        cout << " Введите имя:" ;

        cin >> nameBuffer ;

        /* Если это имя — 'exit'... */

        if ( ( stricmp( nameBuffer , "exit" ) == 0 ) )

        {

            /* ...вернуть нулевое значение */

            return 0 ;

        }

        /* Новая запись для заполнения */

        NameDataSet* pNDS = new NameDataSet ;

        /* Заполнение поля имени и обнуление указателя */

        strncpy( pNDS -> szName , nameBuffer , 128 ) ;

        pNDS -> szName[ 127 ] = '' ;

        pNDS -> pNext = 0 ;

        /* Возврат адреса созданного объекта */

        return pNDS ;

    }

    int main( int nNumberofArgs , char* pszArgs[ ] )

    {

        setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */

        cout << "Читаем имена студентов "

              << "Введите 'exit' для выхода " ;

        /* Создание объекта NameDataSet */

        NameDataSet* pNDS ;

        while ( pNDS = getData( ) )

        {

            /* Добавление в конец списка */

            add( pNDS ) ;

        }

        /* Итерация списка для вывода записей */

        cout << "Записи: " ;

        pNDS = pHead ;

        while ( pNDS )

        {

            /* Вывод текущей записи */

            cout << pNDS -> szName << " " ;

            /* Получение следующей записи */

            pNDS = pNDS -> pNext ;

        }

        /* Пауза для того, чтобы посмотреть на результат работы программы */

        system( "PAUSE" ) ; return 0 ;

    }

Несмотря на внушительную длину, программа LinkedListData относительно проста. Функция main( ) начинается с вызова функции getData( ), которая считывает элемент NameDataSet с клавиатуры. Если пользователь вводит строку "exit", getData( ) возвращает нуль. Функция main( ) вызывает функцию add( ), чтобы добавить элемент, который вернула getData( ), в конец связанного списка.

_________________

179 стр. Глава 14. Указатели на объекты

Если от пользователя больше не поступает элементов NameDataSet, функция main( ) выводит на экран все элементы списка, используя функцию displayData( ).

Функция getData( ) выделяет из кучи пустой объект класса NameDataSet. После этого getData( ) ожидает ввода имени для записи его в соответствующее поле нового объекта. Если пользователь вводит в поле имени строку "exit", функция уничтожает последний созданный объект и возвращает 0. В противном случае getData( ) считывает фамилию и номер социального страхования, после чего обнуляет указатель pNext и передаёт управление вызывающей функции.

«Никогда не оставляйте связывающие указатели не проинициализированными! Старая поговорка программистов гласит: "Не уверен — обнули".»

[Помни!]

Функция getData( ) возвращает адрес объекта.

Каждый объект, который возвращает функция getData( ), добавляется в начало списка, на который указывает глобальная переменная-указатель pHead. Когда функция getData( ) возвращает нулевое значение, происходит выход из цикла while, после чего в следующем цикле while осуществляется проход по списку с выводом информации о каждом элементе списка. По достижении последнего элемента списка происходит выход из второго цикла while и программа завершает работу.

«Вывод программы представляет собой введённые имена в обратном порядке. Это происходит потому, что добавление элементов выполняется в начало списка. Возможна вставка элементов в конец списка, однако эта задача посложнее.» 

[Советы]