Форум программистов, компьютерный форум CyberForum.ru

Односвязный список, запись и чтение из файла - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Графика, очень нужно... http://www.cyberforum.ru/cpp-beginners/thread309020.html
Прошу Вас помогите мне с задачей(((( В рисованных мультфильмах иллюзия движения создается последовательной сменой кадров, каждый из которых фиксирует очередное положение движущего объекта. Используя этот принцип, получить мультфильм, показывающий спротивный мультфильм ТЕННИСА. Построение отдельных кадров выполнить на основе олимпийской символики...
C++ структура написать структуру point с координатами целыми (x,y) написать функцию,которая суммирует координаты двух точек http://www.cyberforum.ru/cpp-beginners/thread309016.html
C++ оператор swith
Составить программу с использованием оператора swith и блок-схему для решения следующей задачи: даны натуральные числа n и m. Вычислить m2(квадрат), если n=0, m3(куб), если n=1, корень m, если n=2 и 1/m в остальных случаях
Как можно заменить в первой строке вхождение второй строки на третью C++
Даны три строки. Как можно заменить в первой строке вхождение второй строки на третью, не используя таких операторов как например delete, pos, insert, length как в паскале? Помогите пожалуйста. Добавлено через 1 минуту знаю что стринга в Си нет, сказали через char в массиве искать совпадения
C++ Задание по C++ http://www.cyberforum.ru/cpp-beginners/thread308993.html
ЗАДАНИЕ Затабулировать функцию Z=f(x,y) с шагами (треугольник)x и (треугольник)y внутри прямоугольника и области существования данной функции. Значения функции Z округлить до двух знаков после десятичной точки. Результаты вывести на экран в виде двумерной таблицы, вместо несуществующих значений вывести астериск (*) или любой другой символ. Составить универсальную программу для произвольных...
C++ программа в виде тетриса(нарды, шашки) или вращения планет по орбите Мне нужна граффическая программа в виде тетриса(нарды, шашки) или вращения планет по орбите. Кому не сложно или есть определенные наработки, выложите пожалуйста. подробнее

Показать сообщение отдельно
UKOL
112 / 64 / 7
Регистрация: 17.11.2009
Сообщений: 258

Односвязный список, запись и чтение из файла - C++

31.05.2011, 11:16. Просмотров 4211. Ответов 0
Метки (Все метки)

Здравствуйте уважаемые форумчане.

Имееться реализация односвязного списка из книги Дейтлов "Как программировать на С++"

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// test.cpp
// Тестовая программа для класса List.
#include <iostream>
#include <string.h>
#include <fstream>
#include <cstdlib>
 
using namespace std;
#include "List.h"   // определение класса List
 
// функция для тестирования списка
template <typename T>
void testList(List <T> &listObject, const string &typeName)
{
    cout << "Добро пожаловать в телефонный справочник!\n";
    instructions(); // вывести инструкции
    fstream File_db;
    int choice; // хранит выбор пользователя
    T fio;  // хранит ФИО абонента
    T telephone; // хранит номер телефона абонента
    const int size = 80;
    do //   произвести действия, выбранные пользователем
    {
        cout << "Ваш выбор: ";
        cin >> choice;
 
        switch(choice)
        {
        case 1:     // вставить в начало
            cout << "Введите ФИО абонента: ";
            cin >> fio;
            cout << "Введите телефон абонента: ";
            cin >> telephone;
            listObject.insertAtFront(fio, telephone);
            listObject.print();
            break;
        case 2:     // вставить в конец
            cout << "Введите ФИО абонента: ";
            cin >> fio;
            cout << "Введите телефон абонента: ";
            cin >> telephone;
 
            listObject.insertAtBack(fio, telephone);
            listObject.print();
            break;
        case 3:     // удалить из начала
            if(listObject.removeFromFront(fio, telephone))
                cout << "Абонент " << fio << " с номером " << telephone << " был удален из списка\n";
            listObject.print();
            break;
        case 4:     // удалить из конца
            if(listObject.removeFromBack(fio, telephone))
                cout << "Абонент " << fio << " с номером " << telephone << " был удален из списка\n";
            listObject.print();
            break;
        case 5:     // просмотрть список
            listObject.print();
            break;
        }   // конец switch
    }   while (choice != 6);    // конец do...while
 
    cout << "Досвидания!\n\n";
}   // конец функции testList
 
// вывести инструкции для пользователя программы
void instructions()
{
        cout << "Выберите действие: \n"
             << "   1 для того чтобы вставить в начало списка\n"
             << "   2 для того чтобы вставить в конец списка\n"
             << "   3 для того чтобы удалить из начала списка\n"
             << "   4 для того чтобы удалить с конца списка\n"
             << "   5 для того чтобы просмотреть список\n"
             << "   6 завершить работу со справочником\n";
}   // конец функции instructions
 
int main()
{
    setlocale(LC_ALL, "russian");
 
    // протестировать список значений string
    List <string> charList;
    testList(charList, "char");
 
    return 0;
}   // конец main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
// List.h
// Определение шаблона класса List.
#ifndef LIST_H
#define LIST_H
 
#include <iostream>
#include <iomanip>
#include <string>
 
using namespace std;
 
#include "ListNode.h"   // определение класса ListNode
 
template < typename NODETYPE >
class List
{
public:
    List();             // конструктор
    ~List();            // деструктор
    void insertAtFront( const NODETYPE &, const NODETYPE &);  // вставить до
    void insertAtBack( const NODETYPE &, const NODETYPE &); // вставить после
    bool removeFromFront(NODETYPE &, NODETYPE &);       // удалить до
    bool removeFromBack(NODETYPE &, NODETYPE &);        // удалить после
    bool isEmpty() const;                   // проверить список пустой ли
    void print() const;                     // вывести
 
private:
    ListNode < NODETYPE > *firstPtr;    // указатель на первый узел
    ListNode < NODETYPE > *lastPtr;     // указатель на последний узел
 
    // сервисная функция для выделения памяти нового узла
    ListNode <NODETYPE> *getNewNode(const NODETYPE &, const NODETYPE &);
};  // конец класса List
 
// конструктор по умолчанию
template < typename NODETYPE >
List < NODETYPE >::List()
    : firstPtr(0), lastPtr(0)
{
    // пустое тело
}   // конец конструктора List
 
// деструктор
template < typename NODETYPE>
List < NODETYPE >::~List()
{
    if(!isEmpty()) // список не пуст
    {
        //cout << "Destroying nodes ... \n";
 
        ListNode < NODETYPE > *currentPtr = firstPtr;
        ListNode < NODETYPE > *tempPtr;
 
        while(currentPtr != 0)  // удалить оставшиеся узлы
        {
            tempPtr = currentPtr;
            cout << tempPtr->data_fio << " ";
            cout << tempPtr->data_tel << '\n';
            currentPtr = currentPtr->nextPtr;
            delete tempPtr;
        }   // конец while
    } // конец if
 
    //cout << "All nodes destroyed\n\n";
}   // конец конструктора List
 
// вставить узел в начало списка
template < typename NODETYPE >
void List < NODETYPE >::insertAtFront( const NODETYPE &fio, const NODETYPE &telephone)
{
    ListNode < NODETYPE > *newPtr = getNewNode(fio, telephone); // новый узел
 
    if(isEmpty()) //список пуст
    {
        firstPtr = lastPtr = newPtr;    // список имеет всего один узел
    }
    else    // List is not empty
    {
        newPtr->nextPtr = firstPtr;     // новый указывает на предыдущий
        firstPtr = newPtr;              // направить firstPtr на новый узел
    } // конец else
}   // конец функции insertAtFront
 
// вставить узел в конец списка
template < typename NODETYPE>
void List < NODETYPE >::insertAtBack(const NODETYPE &fio, const NODETYPE &telephone)
{
    ListNode < NODETYPE > *newPtr = getNewNode(fio, telephone); // новый узел
 
    if(isEmpty())   // список пуст
        firstPtr = lastPtr = newPtr;    // список имеет всего один узел
    else    // список не пуст
    {
        lastPtr->nextPtr = newPtr;  // обновить бывший последний узел
        lastPtr = newPtr;           // новый последний узел
    }   // конец else
}   // конец функции inserAtBack
 
// удалить узел из начала списка
template < typename NODETYPE >
bool List < NODETYPE >::removeFromFront(NODETYPE &fio, NODETYPE &telephone)
{
    if(isEmpty())   // список пуст
        return false;   // неудачное удаление
    else
    {
        ListNode < NODETYPE > *tempPtr = firstPtr;  // для удаления
 
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0; // после удаления узлов нет
        else
            firstPtr = firstPtr->nextPtr;   // направить на бывший 2-й узел
 
        fio = tempPtr->data_fio;                // возвратить удаляемые данные
        telephone = tempPtr->data_tel;
        delete tempPtr; // освободить удаленный первый узел
        return true;    // удачное удаление
    } // конец else
} // конец функции removeFromFront
 
// удалить узел из конца списка
template < typename NODETYPE >
bool List < NODETYPE >::removeFromBack( NODETYPE &fio, NODETYPE &telephone)
{
    if ( isEmpty() ) // список пуст
        return false;   // неудачное удаление
    else
    {
        ListNode < NODETYPE > *tempPtr = lastPtr;   // для удаления
 
        if (firstPtr == lastPtr)    // в списке один элемент
            firstPtr = lastPtr = 0; // после удаления узлов нет
        else
        {
            ListNode < NODETYPE > *currentPtr = firstPtr;
 
            // locate second-to-last element
            while(currentPtr->nextPtr != lastPtr)
                currentPtr = currentPtr->nextPtr;   // перейти к следующему
 
            lastPtr = currentPtr;   // удалить последний узел
            currentPtr->nextPtr = 0;    // теперь это последний узел
        }   // конец else
 
        fio = tempPtr->data_fio;    // возвратить данные бывшего последнего
        telephone = tempPtr->data_tel;
        delete tempPtr; // освободить бывший последний узел
        return true;    // удачное удаление
    } // конец else
}   // конец функции removeFromBack
 
// список пуст?
template <typename NODETYPE >
bool List <NODETYPE>::isEmpty() const
{
    return firstPtr == 0;
}   // конец функции isEmpty
 
// возвратить указатель на вновь выделенный узел
template <typename NODETYPE>
ListNode <NODETYPE> *List <NODETYPE>::getNewNode(
    const NODETYPE &fio, const NODETYPE &telephone)
{
    return new ListNode <NODETYPE> (fio, telephone);
}   // конец функции getNewNode
 
// вывести содержимое списка
template <typename NODETYPE>
void List <NODETYPE>::print() const
{
    if(isEmpty() )  // список пуст
    {
        cout << "Список пуст!\n\n";
        return;
    }   // конец if
 
    ListNode <NODETYPE> *currentPtr = firstPtr;
 
    cout << "Список : \n";
 
    while(currentPtr != 0)  // получить данные элемента
    {
        cout << currentPtr->data_fio << ' ' << currentPtr->data_tel << endl;
        currentPtr = currentPtr->nextPtr;
    }   // конец while
 
    cout << "\n\n";
}   // конец функции print
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// ListNode.h
// Определение шаблона класса ListNode.
#ifndef LISTNODE_H
#define LISTNODE_H
 
// Опережающее объявление класса List необходимо, чтобы List
// можно было использовать в объявлении дружественности в строке 13
template < typename NODETYPE > class List;
 
template < typename NODETYPE >
class ListNode
{
    friend class List < NODETYPE >; // сделать List другом
 
public:
    ListNode( const NODETYPE &, const NODETYPE &);  // конструктор
    NODETYPE getData() const;       // возвратить данные в узле
private:
    NODETYPE data_fio;              // данные
    NODETYPE data_tel;
    ListNode < NODETYPE> *nextPtr;  // следующий узел в списке
};                                  // конец класса ListNode
 
// конструктор
template < typename NODETYPE >
ListNode < NODETYPE >::ListNode( const NODETYPE &info, const NODETYPE &tele)
    : data_fio(info),  data_tel(tele), nextPtr(0)
{
    // пустое тело
}   // конец конструктора ListNode
 
// возвратить копию данных в узле
template < typename NODETYPE >
NODETYPE ListNode < NODETYPE >::getData() const
{
    return data_fio;
}   // конец функции getData
 
#endif
Вложения
Тип файла: zip list.zip (9.15 Мб, 31 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru