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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.83
UKOL
 Аватар для UKOL
112 / 64 / 7
Регистрация: 17.11.2009
Сообщений: 258
31.05.2011, 11:16     Односвязный список, запись и чтение из файла #1
Здравствуйте уважаемые форумчане.

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

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

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 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2011, 11:16     Односвязный список, запись и чтение из файла
Посмотрите здесь:

Запись и чтение из файла C++
Запись и чтение с файла C++
C++ запись\чтение из файла
Односвязный список. Узел-запись о книге в библиотеке. C++
Двусвязанный список (чтение/запись в файл) C++
Запись и чтение из файла C++
Чтение и запись из файла C++
C++ Запись и чтение с файла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 03:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru