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

Связанные списки данных

27.08.2019, 06:53. Показов 688. Ответов 6
Метки нет (Все метки)

Программа должна удалить все повторяющиеся числа, оставив только их первые вхождения. Обязательно использовать связанные списки данных. В частности проблема с функцией "Del_element", никак не могу понять почему не работает

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
#include <fstream> 
#include <iostream>
#include <locale.h>
#include <stdlib.h> 
using namespace std;
struct LIST {
 
    int number; LIST* next;
};
 
//Функция чтения данных и занесения их в создаваемый список:
 
LIST* read_list(LIST* lst)
 
{
 
    LIST* p; int t;
 
    ifstream f("1.txt");
 
    if (f) //Если файл существует
 
    {
 
        f >> t;
 
        if (!f.eof())//Если файл не пуст
 
        {
 
            lst = new LIST; p = lst; p->number = t; f >> t;
 
            while (!f.eof())//Пока не конец файла
 
            {
 
                p->next = new LIST; p = p->next; p->number = t; f >> t;
 
            }
 
            p->next = NULL;
 
 
        }
 
        else
 
            cout << "Файл пустой" << '\n';
 
    }
 
    else
 
    {
 
        cout << "Файл отсутствует" << '\n'; exit(1);
 
    }
 
    return lst; //Возврат указателя на голову созданного списка
 
}
 
 
 
void del_element(LIST* lst)
 
{
 
    LIST* p1 = lst, * p2 = p1->next, * prev = lst, * p3, * p4 = lst;
    int a, b;
    while (p1->next !=NULL)
    {
        a = p1->number;
        while (p1 != NULL) {
            p1 = p1->next;
            b = p1->number;
            if (a == b) {
                p3 = p1 -> next;
                delete p1;
                prev->next = p3;
                p1 = prev;
            }
            else
            prev = p1;
        }
        p1 = p4->next;
        p4 = p1;
 
    }
 
 
}
 
 
void out(LIST* lst)
 
{
 
    LIST* p = lst;
    int t;
 
    ofstream f;
    f.open("12.txt");
 
    if (f) //Если файл существует
 
    {
        while (p) {
            f << p->number << " ";
            p = p->next;
        }
    }
    f.close();
 
 
}
 
 
int main()
 
{
 
    LIST* lst = NULL;
 
    setlocale(LC_CTYPE, "");
 
    lst = read_list(lst);
    del_element(lst);
    out(lst);
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2019, 06:53
Ответы с готовыми решениями:

Связанные списки С++
Здравствуйте, изучаю С++ и возникли проблемы с пониманием как работают списки. Вот код: ...

связанные списки
плиз помогите написать задачку: Запросить у пользователя число n. Построить связный список из n...

Связанные списки
Составить программу, работающую со связанными списками. Мы будем рассматривать связанный список как...

Связанные списки
Здравствуйте! Не очень сложное задание, но так как я начинающий, запуталась немного... особенно с...

6
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
27.08.2019, 09:27 2
Цитата Сообщение от the_vladd Посмотреть сообщение
В частности проблема с функцией "Del_element", никак не могу понять почему не работает
Потому что всё смешал в кучу - p1 должен участвовать только во внешнем цикле, внутренний цикл никак на него не влияет

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (auto *p1 = lst; p1; p1= p1->next)
{
    for (auto *p2 = p1->next, *p3 = p; p2; )
         if (p2->number != p1->number)
         {
               p3 = p2;
               p2 = p2->next;
         }
         else
         {
             ...................................
             //erase p3->next
          }
}
0
0 / 0 / 0
Регистрация: 17.06.2019
Сообщений: 10
27.08.2019, 15:42  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Потому что всё смешал в кучу - p1 должен участвовать только во внешнем цикле, внутренний цикл никак на него не влияет
А что за тип auto? И чему должна быть изначально равна переменная p?
0
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
27.08.2019, 15:49 4
Цитата Сообщение от the_vladd Посмотреть сообщение
А что за тип auto? И чему должна быть изначально равна переменная p?
C++
1
2
3
4
5
6
7
8
9
   for (LIST *p2 = p1; p2->next; )
         if (p2->next->number != p1->number)
              p2 =  p2->next;
         else
         {
             LIST *p = p2->next;
             p2->next = p2->next->next;
             delete p;
          }
0
0 / 0 / 0
Регистрация: 17.06.2019
Сообщений: 10
28.08.2019, 03:18  [ТС] 5
oleg-m1973, Почему то не видит последний элемент в списке, то есть вообще не берет его в расчет при проверке, как будто бы его и нет в списке. Из за чего это может быть?
0
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
28.08.2019, 09:03 6
Цитата Сообщение от the_vladd Посмотреть сообщение
oleg-m1973, Почему то не видит последний элемент в списке, то есть вообще не берет его в расчет при проверке, как будто бы его и нет в списке. Из за чего это может быть?
Ну да, ошибся. Здесь нужно ещё сохранять указатель на пердыдущий элемент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (auto *p1 = lst; p1; p1= p1->next)
    for (LIST *p2 = p1->next, *p3 = p1; p2; )
        if (p2->number != p1->number)
        {
            p3 = p2;
            p2 = p2->next;
        }
        else
        {
            LIST *p = p2;
            p3->next = p2 = p2->next;
            delete p;
        }
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4426 / 598
Регистрация: 04.12.2011
Сообщений: 13,262
Записей в блоге: 16
28.08.2019, 09:10 7
Цитата Сообщение от the_vladd Посмотреть сообщение
void del_element(LIST* lst)
the_vladd, из самых общих соображений:
Как данный метод получает указатель на удаляемый элемент или удаляемое значение?
И ещё. Если он принимает указатель на список (а из внешнего цикла итерации следует именно это), зачем делать этот метод членом?
Может лучше бы
C++
1
2
3
4
5
void del_element(LIST* start, LIST* ptr_to_del)
{
 
int val_to_del = ptr_to_del->number;
//искать начиная со start и удалять
?
Метод поиска напишите отдельно. Пригодится.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2019, 09:10

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Связанные списки
Вопросы в комментариях #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; using...

Односвязанные и двух-связанные списки
Должны быть следующие функции: 1) Ввод количества элементов и заполнение списка случайными...

Связанные списки (переделать программу)
Как переделать программу, чтобы можно было вводить самому ключи и не было Access Violation?...

Подскажите как отладить код (связанные списки)
условие закомментировано в коде, подскажите, в чём ошибка? функция Sum Должна возвращать требуемое...


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

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

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