Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Joey Black
1 / 1 / 2
Регистрация: 10.02.2016
Сообщений: 154
1

Вывод связного списка в файл

20.03.2016, 16:33. Просмотров 826. Ответов 3
Метки нет (Все метки)

Пишу программу для манипуляций со связным списком

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
#include<iostream>
#include<fstream>
using namespace std;
///////////////////////////////////////////////////////////
class link{ // один элемент списка
    private:
        int data; // некоторые данные
        link* next; // указатель на следующую структуру
    public:
        link():data(0){}
        link(int d):data(d){}
        friend class linklist;
        friend fstream& operator << (fstream& f,link& lnk);
        friend fstream& operator >> (fstream& f,link& lnk);
};
fstream& operator << (fstream& f,link& lnk){
    f<<lnk.data<<'?';
}
 
fstream& operator >> (fstream& f,link& lnk){
    link* temp=new link;
    char* dummy=new char;
    if(f>>temp->data>>*dummy&&*dummy=='?')
        swap(*temp,lnk);
    delete temp;
    delete dummy;       
    }
///////////////////////////////////////////////////////////
class linklist{ // список
    private:
        link* first;
    public:
        linklist(){first = NULL;} // конструктор без параметров
        void additem(int& d); // добавление элемента
        void display(); // показ данных
        void writelist(char* f);
        void readlist(char* f);
};
 
void linklist::readlist(char* f){
    fstream file;
    file.open(f,ios::in);
    if(first==NULL){
        first=new link;
        link* current=first;
        file>>*current;
        current->next=new link;
        while(file>>*current->next){
            current=current->next;
        }
        delete current->next;
        current->next=NULL;     
    }
    else{
        link* current=first;
        while(current){
            delete current;
            current=current->next;
        }
        first=new link;
        current=first;
        file>>*current;
        current->next=new link;
        while(file>>*current->next){
            current=current->next;
        }
        delete current->next;
        current->next=NULL;     
    }
}
 
void linklist::writelist(char* f){
    fstream file;
    file.open(f,ios::out);
    link* current;
    current=first;
    while(current){
        file<<(*current);
        current=current->next;
    }
}
 
void linklist::additem(int& d){// добавление элемента
    link* newlink = new link; // выделяем память
    newlink->data = d; // запоминаем данные
    newlink->next = first; // запоминаем значение first
    first = newlink; // first теперь указывает на новый элемент
}
 
void linklist::display(){
    link* current = first; // начинаем с первого элемента
    while(current){ // пока есть данные
        cout << current->data << endl; // печатаем данные
        current = current->next; // двигаемся к следующему элементу
    }
    if(first==NULL)cout<<"The list is empty"<<endl;
}
///////////////////////////////////////////////////////////
int main(){
    linklist lst;
    int ch='y',oper;
    while(ch=='y'){
        cout<<"Choose an action: "<<endl<<"Add data (1)"<<endl<<"Show the list (2)"<<endl
        <<"Write the list into a file (3)"<<endl<<"Read a file into a list (4)"<<endl<<"Enter your choice: ";
        cin>>oper;
        switch(oper){
            case 1: cout<<"Enter a number to add: ";
                    int temp;
                    cin>>temp;
                    lst.additem(temp);
                    break;
            case 2: lst.display();
                    break;
            case 3: lst.writelist("exer8.txt");
                    break;
            case 4: lst.readlist("exer8.txt");
                    break;
            default:cout<<"Wrong choice, try again"<<endl;
                    continue;                   
        }
        cout<<"Do you want to continue?(y,n): ";
        cin>>ch;        
    }
    system("pause");
    return 0;
}
Вроде всё нoрм, но после выполнения действия цикл в main прекращается и программа прекращается, помогите найти косяк
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2016, 16:33
Ответы с готовыми решениями:

Реализация связного списка
Помогите решить задачу Нужно написать программу без использования...

Сортировка связного списка
Привет всем! пришлите пожалуйста код реализации сортировки односвязного списка...

Реализация связного списка
надо решить задачу: Сведения о владельце автомобиля: фамилия, марка автомобиля...

Сортировка связного списка
Привет всем! как правильно написать сортировку для связного циклического списка...

Создание связного списка
нужно создать связной список, что собственно уже сделал. что нужно: ...

3
Nosey
1350 / 401 / 144
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
20.03.2016, 17:19 2
Лучший ответ Сообщение было отмечено Joey Black как решение

Решение

Joey Black,
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
191
192
193
#include <iostream>
#include <fstream>
#include <limits>
 
using namespace std;
 
///////////////////////////////////////////////////////////
 
class link
{ // один элемент списка
private:
    int data; // некоторые данные
    link* next; // указатель на следующую структуру
public:
    link()
            : data(0), next(nullptr)
    {
    }
    link(int d)
            : data(d), next(nullptr)
    {
    }
    friend class linklist;
    friend fstream& operator <<(fstream& f, link& lnk);
    friend fstream& operator >>(fstream& f, link& lnk);
};
 
fstream& operator <<(fstream& f, link& lnk)
{
    f << lnk.data << '?';
    return f; // почему тут небыло возврата значения?
}
 
fstream& operator >>(fstream& f, link& lnk)
{
    link* temp = new link;
    char* dummy = new char;
    if (f >> temp->data >> *dummy && *dummy == '?')
        swap(*temp, lnk);
    delete temp;
    delete dummy;
    return f; // почему тут небыло возврата значения?
}
///////////////////////////////////////////////////////////
class linklist
{ // список
private:
    link* first;
public:
    // если компилятор ругается - удалить эти "функции"
    linklist& operator=(const linklist&) = delete;
    linklist(const linklist&) = delete;
 
    // бесплатное дополнение деструктора.
    ~linklist()
    {
        link* node = first;
        link* nnode = first->next;
        while (nnode)
        {
            delete node;
            node = nnode;
            nnode = nnode->next;
        }
        if (node)
        {
            delete node;
        }
    }
    linklist()
            : first(nullptr)
    {
    } // конструктор без параметров
    void additem(int d); // добавление элемента
    void display(); // показ данных
    void writelist(const char* f);
    void readlist(const char* f);
};
 
void linklist::readlist(const char* f)
{
    fstream file;
    file.open(f, ios::in);
    if (first == NULL)
    {
        first = new link;
        link* current = first;
        file >> *current;
        current->next = new link;
        while (file >> *current->next)
        {
            current = current->next;
        }
        delete current->next;
        current->next = NULL;
    }
    else
    {
        link* current = first;
        while (current)
        {
            delete current;
            current = current->next;
        }
        first = new link;
        current = first;
        file >> *current;
        current->next = new link;
        while (file >> *current->next)
        {
            current = current->next;
        }
        delete current->next;
        current->next = NULL;
    }
}
 
void linklist::writelist(const char* f)//нужен константный указатель, так правильно, очень правильно
{
    fstream file;
    file.open(f, ios::out);
    link* current;
    current = first;
    while (current)
    {
        file << (*current);
        current = current->next;
    }
}
 
void linklist::additem(int d)
{ // добавление элемента
    link* newlink = new link; // выделяем память
    newlink->data = d; // запоминаем данные
    newlink->next = first; // запоминаем значение first
    first = newlink; // first теперь указывает на новый элемент
}
 
void linklist::display()
{
    link* current = first; // начинаем с первого элемента
    while (current)
    { // пока есть данные
        cout << current->data << endl; // печатаем данные
        current = current->next; // двигаемся к следующему элементу
    }
    if (first == NULL)
        cout << "The list is empty" << endl;
}
///////////////////////////////////////////////////////////
int main()
{
    linklist lst;
    char ch = 'y'; // если ожидаете символ, так используя операторы ">> <<" нужна переменная соответствующего типа.
    int oper;
    while (ch == 'y')
    {
        cout << "Choose an action: " << endl << "Add data (1)" << endl
                << "Show the list (2)" << endl
                << "Write the list into a file (3)" << endl
                << "Read a file into a list (4)" << endl
                << "Enter your choice: ";
        cin >> oper;
        // на всякий случай :)
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), cin.widen('\n'));
        switch (oper)
        {
            case 1:
                cout << "Enter a number to add: ";
                int temp;
                cin >> temp;
                lst.additem(temp);
                break;
            case 2:
                lst.display();
                break;
            case 3:
                lst.writelist("exer8.txt");
                break;
            case 4:
                lst.readlist("exer8.txt");
                break;
            default:
                cout << "Wrong choice, try again" << endl;
                continue;
        }
        cout << "Do you want to continue?(y,n): ";
        cin >> ch;
    }
    system("pause");
    return 0;
}
см. комментари.
1
Joey Black
1 / 1 / 2
Регистрация: 10.02.2016
Сообщений: 154
20.03.2016, 23:10  [ТС] 3
Можете объяснить, что это за deleted functions?
0
Nosey
1350 / 401 / 144
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
21.03.2016, 08:57 4
Цитата Сообщение от Joey Black Посмотреть сообщение
Можете объяснить, что это за deleted functions?
Это запрет на копирование и присваивание. А точнее, компилятор, при неопределенных операторе присваивания и конструкторе копирования, генерирует стандартные версии этих "функций", которые копируют указатель, не копируя данные. Поскольку мы добавили деструктор, нас более такое поведение стандартных версий не устраивает, но поскольку мне лень писать правильные версии, то я их просто "удалил". Используя синтаксис = delete; мы сообщаем компилятору чтобы он, не генерировал стандартные версии.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2016, 08:57

Возвращение элемента связного списка
Здравствуйте. Есть связный список где в качестве элемента принимается структура...

Удаление элементов из связного списка
Здравствуйте! Совсем недавно начала изучать связные списки, пока понимания...

Доступ к элементам связного списка
как организовать самый простой для реализации способ чтобы получить доступ к...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru