Программа 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 и программа завершает работу.
«Вывод программы представляет собой введённые имена в обратном порядке. Это происходит потому, что добавление элементов выполняется в начало списка. Возможна вставка элементов в конец списка, однако эта задача посложнее.»
[Советы]
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ