0 / 0 / 0
Регистрация: 25.04.2019
Сообщений: 63
1

Односвязный список. Работа с текстом и запись списка в файл

10.05.2022, 22:07. Показов 1108. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток, мне нужно выполнить такое задание:

Разработать ПО работы с одно связанным списком в свободной памяти (стандартные классы и STL не использовать). Список может содержать произвольное количество заданных пользователем структур данных - звеньев. Реализовать базовые операции работы со списком:
- создать (пустой или с данными, прочитанными из файла);
- найти звено, содержащее заданную информацию;
- добавить новое звено после найденного,
- удалить найденное звено;
- добавить/убрать звено в начало списка;
- добавить/убрать звено в конец списка;

Реализовывал список, который работает с числами, такой результат вышел:

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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#include <windows.h>
#include <fstream>
using namespace std;
char name_file[255];
 
class Node// объект в классе Node
{
    public://модификатор доступа, позволяющий доступ к данным канал извне
    int number;
    Node* next;//указатель на след. элемент
};
 
int main()
{
    setlocale(LC_ALL,"RUSSIAN");
    strcpy(name_file,"Без_имени.txt");
 
    Node* head = 0;
    Node* lastPtr = 0;
    int keys;//переменная для switch
    while (1)// или же while(true)
    {
        printf("1. Добавить звено в конец списка\n");
        printf("2. Просмотр Списка\n");
        printf("3. Поиск звена, заданной информации\n");
        printf("4. Удалить Элемент с конца\n");
        printf("5. Удалить звено По Выбору\n");
        printf("0. Выход\n\n");
        printf("6. Создать файл (NEW)\n");
        printf("Ваш Выбор: ");
        scanf("%d", &keys);
        switch(keys){
 
        case 0:
        {
            system("CLS");
            break;
        }
 
        case 1://Добавление элемента
        {
            system("CLS");
            Node* ptr = new Node;//указатель на перемнную ptr с типом данных Node
            printf("Введите Число: ");
            int numb;
            scanf("%d", &numb);//переменная в которую записывается число для добавления в список
            ptr->number = numb;//ссылка на отдеьный член(number) класса Node
            ptr->next = 0;//Нулевой указатель нап следующее звено списка
            if (head == 0)
            {
                head = ptr;
                lastPtr = ptr;
                system("CLS");
                continue;
            }// цикл,который записывает поочередно звена в список
            lastPtr->next = ptr;//выводим следующее звено в списке
            lastPtr = ptr;//ыводим бесконечное кол-во звен в список
            system("CLS");
            continue;
        }
 
        case 2://Вывод звен
        {
            Node* ptr = 0;
            system("CLS");
            if (head == 0)
            {
                printf("Список пуст\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            printf("--------СПИСОК--------\n\n");
            ptr = head;
            while (1)
            {
                printf("%d", ptr->number);//вывод звена списка
                printf(" ");
                if (ptr->next == 0)
                    break;
 
                ptr = ptr->next;
            }//цикл вывода звен списка
            printf("\n\n");
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        case 3://Поиск элемента
        {
 
            Node* ptr = 0;//указатель на перемнную ptr с типом данных Node с нулевым указателем
            system("CLS");
            if (head == 0)
            {
                printf("Список пуст\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            printf("Введите звено Для Поиска: ");
            int key;//звено для поиска
            scanf("%d", &key);
            ptr = head;
            while (1)
            {
                if (key == ptr->number)
                {
                    printf("\n Элемент найден \n");
                    break;
                }
                if (ptr->next == NULL)
                {
                    printf("\n Элемент не найден \n");
                    break;
                }
                ptr = ptr->next;
            }
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        case 4:
        {
            system("CLS");
            Node* ptrDelete = NULL;
            if (head == NULL)
            {
                printf("Список пуст\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            if (head->next == NULL)
            {
                head = NULL;
                delete head;
                continue;
            }
            ptrDelete = head;
            head = ptrDelete->next;
            delete ptrDelete;
            continue;
        }
 
        case 5:
        {
            system("CLS");
            Node* ptrPrev = 0;
            Node* ptrDelete = 0;
            int key ;
            if (head == 0)
            {
                printf(" Список пуст\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            printf("Введите Элемент Для Удаления: ");
            scanf("%d", &key);
            ptrDelete = head;
            if (ptrDelete->number == key)
            {
                head = ptrDelete->next;
                delete ptrDelete;
                system("CLS");
                continue;
            }
            while (1)
            {
                if (key == ptrDelete->number)
                {
                    ptrPrev->next = ptrDelete->next;
                    delete ptrDelete;
                    break;
                }
                if (ptrDelete->next == 0)
                {
                    printf("\nЗвено не найдено\n");
                    system("PAUSE");
                    break;
                }
                ptrPrev = ptrDelete;
                ptrDelete = ptrDelete->next;
            }
            system("CLS");
            continue;
        }
        case 6: /// Создать файл (New)
            {
               FILE *h;
               h=fopen(name_file,"w");
               if ( h ==NULL ) {
               printf("Файл  %s не может быть открыт\n", name_file);
               } else {printf("Файл  %s создан\n", name_file);};
               fclose(h);
               system("PAUSE");
               system("CLS");
               continue;
            }
 
        default:
        {
            system("CLS");
            printf(" Некорректные данные,повторите попытку\n");
            system("PAUSE");
            system("CLS");
            break;
        }
    }
    return 0;
}
}
Все работает корректно, но есть еще 2 задачи которые нужно решить:
1) Нужно что бы список работал и с обычными буквенными символами, а в идеале с строчками которые будет использовать как элементы списка. Пробовал просто изменять тип данных "int" на "char" для переменной "number", но в лучшем случае при записи и просмотре списка записывался только первый элемент;
2) Также, нужно что бы данные из списка могли записываться в файл после, к примеру, добавления звена в конец списка, что бы данные в файле, по сути, изменялись при изменении самого списка.

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

Добавлено через 1 час 26 минут
Задачу записи списка в файл решил, оказывается очень простое исправление нужно было сделать, до этого почему то такой же код ошибку выдавал при записи списка в файл. Запись произвел во 2-м кейсе:
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
case 2://Вывод звен
        {
            Node* ptr = 0;
            system("CLS");
            if (head == 0)
            {
                printf("Список пуст\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            printf("--------СПИСОК--------\n\n");
            ptr = head;
            ///-------------
            FILE *h;
            h=fopen(name_file,"w");
            if ( h ==NULL ) {
            printf("Файл  %s не может быть открыт\n", name_file);};
            ///-------------
            while (1)
            {
                printf("%d", ptr->number);//вывод звена списка
                printf(" ");
                ///запись списка в файл
                fprintf(h,"%d ", ptr->number);
                ///-------------
                if (ptr->next == 0)
                    break;
 
                ptr = ptr->next;
            }//цикл вывода звен списка
            ///-------------
            fclose(h);
            ///-------------
            printf("\n\n");
            system("PAUSE");
            system("CLS");
            continue;
        }
Но все еще нужна помощь что бы список мог работать с текстовыми данными.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2022, 22:07
Ответы с готовыми решениями:

Односвязный список(запись в файл)
Ув. программисты! Помогите пожалуйста, не могу записать односвязный список в файл... Как записать...

Запись в односвязный список и вывод его в файл
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace std; int main() {...

Запись в файл работа с текстом меню и файлы
Добрый вечер, поскажите в чем может быть проблема, реализовал задачу через файлы и меню Суть...

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

Односвязный список. Вывод списка
Я только начал программировать и не получается вывести список, помогите пожалуйста, что делаю не...

0
10.05.2022, 22:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2022, 22:07
Помогаю со студенческими работами здесь

Односвязный список. Вставка списка
Доброго времени суток. Кто может подсказать в чём причина того что я не могу присвоить значение...

Односвязный список. Счётчик элементов списка
Решил сделать односвязный список и сразу столкнулся с тем, что при стандартных реализациях может...

Односвязный список: создание и вывод списка
Уважаемая всезнающая группа, Задача у меня следующая. Нужно использовать структуру: struct node...

Кольцевой односвязный список, удаление списка
здравствуйте! мне нужно было создать кольцевой список, что я собственно и сделал. и, делая отладку...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru