Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 23.05.2018
Сообщений: 23

Организация списков путём применения указателей и структур

04.09.2018, 18:37. Показов 3387. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста! Есть программа, в программе у меня допущены ошибки, как поправить, непонятно! Задание: "Дан список идентификаторов. Длина каждого идентификатора не более 8 символов. Идентификаторы в списке расположены в лексикографическом порядке. Составить функции (подпрограммы) для следующих операций: Удалить из списка предпоследний элемент". На моей VS 2017 выдаёт ошибку на строках: "pt = pt->next" (причина: значение типа "char" нельзя присвоить сущности типа "EL_SP") и после "getch()" внизу требует точку с запятой, хотя её же там стоять не должно вроде...
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
#include "stdio.h"
#include<iostream>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
 
#define MAXDL 9
using namespace std;
 
struct EL_SP {
    char id[MAXDL];
    char next;
    struct EL_SP *sled;
};
void DelFirstK(struct EL_SP *p, unsigned k1)
{
    int i;
    for (i = 1; i <= k1; i++) {
        struct EL_SP *pt;
        pt = p;
        p = p->sled;
        pt->sled = p->sled;
        for (int i = 0; i < MAXDL; i++)
            pt->id[i] = p->id[i];
        p = pt;
    }
}
 
void Vkl(struct EL_SP **p, char t_id[])
{
    struct EL_SP *pt, *k, *j;
    pt = (struct EL_SP *) malloc(sizeof(struct EL_SP));
    strcpy(pt->id, t_id);
    if (*p == NULL || strcmp(pt->id, (*p)->id) < 0) {
        pt->sled = *p;
        *p = pt;
    }
    else {
        k = *p;
        while (k != NULL && strcmp(pt->id, k->id) >= 0) {
            j = k;
            k = k->sled;
        }
 
        j->sled = pt;
        pt->sled = k;
    }
}
 
void PechSp(struct EL_SP *p)
{
    struct EL_SP *i;
    cout << "\nRezyltat:\n";
    for (i = p; i != NULL; i = i->sled)
        puts(i->id);
}
int replase(EL_SP *p, int k, char* str)
{
    EL_SP *pt;
    int i;
 
    for (i = 1, pt = p; pt != NULL && i < k; ++i)
        pt = pt->next;
 
    if (pt != NULL)
    {
        strncpy(pt->id, str, MAXDL);
        return 0;
    }
    else
    {
        printf("...");
        return -1;
    }
}
 
int main(void)
{
    struct EL_SP *p;
    unsigned n;
    unsigned i;
    unsigned k;
    char t_id[MAXDL];
    cout << "\nVvedite chislo identifikatorovn n=";
    cin >> n;
    getchar();
    p = NULL;
    cout<<"Vvedite identifikatory";
    cout << "(posle kazhdogo nazhimajte klavishu <Enter>)\n";
    for (i = 1; i <= n; i++) {
        gets_s(t_id);
        Vkl(&p, t_id);
    }
    PechSp(p);
 
    cout<<"\nKakou ydalit?:\n";
    cin >> k;
 
    DelFirstK(p, k);
 
    cout<<"\nAfter clear:\n";
 
    PechSp(p);
    cout<<"\nDlja zavershenija nazhmite ljubuju klavishun";
    getch()
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2018, 18:37
Ответы с готовыми решениями:

Связка массива структур с классом без применения указателей
У меня такая задача по учебе: Написать программу с использованием объектно-ориентированных технологий. Количество созданных классов –...

Исследование особенностей применения переменных ссылочного типа и указателей
Создать динамический массив переменных типа int используя оператор new и указатель на массив Число элементов массива вводить с клавиатуры....

Организация списков
Создать связанный список из записей, содержащих сведения о сотрудниках (личный номер, фамилия, должность), реализовать операции со...

7
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.09.2018, 18:44
Цитата Сообщение от AlayaRomashka Посмотреть сообщение
хотя её же там стоять не должно вроде
должно

Добавлено через 1 минуту
Цитата Сообщение от AlayaRomashka Посмотреть сообщение
"pt = pt->next" (причина: значение типа "char" нельзя присвоить сущности типа "EL_SP")
наверно next должен быть типа указателя на структуру
C++
1
2
3
4
5
struct EL_SP {
    char id[MAXDL];
    EL_SP* next;
    struct EL_SP *sled;
};
0
0 / 0 / 0
Регистрация: 23.05.2018
Сообщений: 23
05.09.2018, 06:52  [ТС]
_stanislav,
C++
1
2
3
4
5
struct EL_SP {
    char id[MAXDL];
    EL_SP* next;
    struct EL_SP *sled;
};
Если я делаю так, то следующая строка "void DelFirstK(struct EL_SP *p, unsigned k1)" высвечивает, что в "EL_SP *p" требуется идентификатор.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
05.09.2018, 08:01
AlayaRomashka, наверное надо не наугад писать код, переставляя и комбинируя какие-то куски, а осмысленно.
Что такое EL_SP? Почему содержит два указателя? Чем они отличаются?

Ты сможешь честно сказать учителю, что код твой собственный или нет? А если твой, то он первым делом задаст именно эти вопросы.
0
0 / 0 / 0
Регистрация: 23.05.2018
Сообщений: 23
05.09.2018, 09:17  [ТС]
И в 18 строке, где "for (i = 1; i <= k1; i++)" ругается на "<=: несоответствие типов со знаком и без знака".

Добавлено через 31 минуту
EL_SP - тип элемента списка, первый указатель - "struct EL_SP *sled" - это ссылка на следующий элемент, потом - "*p" - указатель списка идентификаторов в лексикографическом порядке, "struct EL_SP *pt" - это указатель включаемого элемента, "*k" и "*j" - это указатели очередного и предыдущего элементов списка. Код писался не наугад, но в данный момент загруженность очень большая и мозги уже не работают) Поэтому решила попросить помощи.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
05.09.2018, 09:41
Лучший ответ Сообщение было отмечено AlayaRomashka как решение

Решение

Удалено поле "next" из структуры.
Удалена процедура "replace".
Переделана процедура удаления.
Кликните здесь для просмотра всего текста
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
#include "stdio.h"
#include<iostream>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
 
#define MAXDL 9
using namespace std;
 
struct EL_SP {
    char id[MAXDL];
    struct EL_SP *sled;
};
 
void DelFirstK(struct EL_SP **root, unsigned index)
{
    if (!root || !index)
        return; // ошибочные аргументы
 
    struct EL_SP *prev = 0;     // элемент предшествующий удаляемому
    struct EL_SP *curr = *root; // удаляемый элемент
 
    // поиск удаляемого элемента и его предшественника
    for (unsigned i = 1; i < index; i++)
    {
        prev = curr;
        if (curr)
            curr = curr->sled;
    }
 
    if (!curr)
        return; // запрашиваемая позиция не существует
 
    if (!prev)
        *root = curr->sled; // изменение корня списка
    else
        prev->sled = curr->sled; // удаление элемента из списка
 
    free(curr); // удаление элемента из памяти
}
 
void Vkl(struct EL_SP **p, char t_id[])
{
    struct EL_SP *pt, *k, *j;
    pt = (struct EL_SP *) malloc(sizeof(struct EL_SP));
    strcpy(pt->id, t_id);
    if (*p == NULL || strcmp(pt->id, (*p)->id) < 0) {
        pt->sled = *p;
        *p = pt;
    }
    else {
        k = *p;
        while (k != NULL && strcmp(pt->id, k->id) >= 0) {
            j = k;
            k = k->sled;
        }
 
        j->sled = pt;
        pt->sled = k;
    }
}
 
void PechSp(struct EL_SP *p)
{
    struct EL_SP *i;
    cout << "\nRezyltat:\n";
    for (i = p; i != NULL; i = i->sled)
        puts(i->id);
}
 
int main(void)
{
    struct EL_SP *p;
    unsigned n;
    unsigned i;
    unsigned k;
    char t_id[MAXDL];
    cout << "\nVvedite chislo identifikatorovn n=";
    cin >> n;
    getchar();
    p = NULL;
    cout<<"Vvedite identifikatory";
    cout << "(posle kazhdogo nazhimajte klavishu <Enter>)\n";
    for (i = 1; i <= n; i++) {
        gets_s(t_id);
        Vkl(&p, t_id);
    }
    PechSp(p);
 
    cout<<"\nKakou ydalit?:\n";
    cin >> k;
 
    DelFirstK(&p, k);
 
    cout<<"\nAfter clear:\n";
 
    PechSp(p);
    cout<<"\nDlja zavershenija nazhmite ljubuju klavishun";
    getch();
    return 0;
}
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
05.09.2018, 10:53
Лучший ответ Сообщение было отмечено AlayaRomashka как решение

Решение

Цитата Сообщение от AlayaRomashka Посмотреть сообщение
после "getch()" внизу требует точку с запятой, хотя её же там стоять не должно вроде...
В Си и в С++ ; синтаксически входит в состав (завершает) Expression Statement, а не отделает друг от друга операторы, как в некоторых других языках.
2
0 / 0 / 0
Регистрация: 23.05.2018
Сообщений: 23
07.09.2018, 12:18  [ТС]
Ygg, спасибо огромное!! Код при компиляции ещё выдавал ошибки, но я их быстро исправила. Так что теперь всё работает и всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.09.2018, 12:18
Помогаю со студенческими работами здесь

Организация списков
ПРИВЕТ! Вот моё задание: Если список целых чисел упорядочен по возрастанию, то получить новый список из положительных элементов...

Массив указателей на заголовки списков
Добрый день нужно реализовать подобный класс Список у меня реализован следующим образом: template &lt;typename T&gt; class elem...

Организация списка списков
В классе имеется список указателей на списки QList&lt;QList&lt;Point3D&gt;*&gt; PointList; В методе я создаю списки, заполняю их данными и заношу...

Массив указателей списков смежных вершин
Добрый день. Помогите пожалуйста в реализации списка смежности для графа. Знаю, в инете много примеров, но пока для своего не нашел...

Использование указателей для создания связанных списков
На аптечном складе хранятся лекарства. Сведения о лекарствах содержаться в специальной ведомости: наименования лекарственного препарата;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru