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

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

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

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста! Есть программа, в программе у меня допущены ошибки, как поправить, непонятно! Задание: "Дан список идентификаторов. Длина каждого идентификатора не более 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2018, 18:37
Ответы с готовыми решениями:

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

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

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

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

7
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
04.09.2018, 18:44 2
Цитата Сообщение от 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  [ТС] 3
_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
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
05.09.2018, 08:01 4
AlayaRomashka, наверное надо не наугад писать код, переставляя и комбинируя какие-то куски, а осмысленно.
Что такое EL_SP? Почему содержит два указателя? Чем они отличаются?

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

Добавлено через 31 минуту
EL_SP - тип элемента списка, первый указатель - "struct EL_SP *sled" - это ссылка на следующий элемент, потом - "*p" - указатель списка идентификаторов в лексикографическом порядке, "struct EL_SP *pt" - это указатель включаемого элемента, "*k" и "*j" - это указатели очередного и предыдущего элементов списка. Код писался не наугад, но в данный момент загруженность очень большая и мозги уже не работают) Поэтому решила попросить помощи.
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
05.09.2018, 09:41 6
Лучший ответ Сообщение было отмечено 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
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
05.09.2018, 10:53 7
Лучший ответ Сообщение было отмечено AlayaRomashka как решение

Решение

Цитата Сообщение от AlayaRomashka Посмотреть сообщение
после "getch()" внизу требует точку с запятой, хотя её же там стоять не должно вроде...
В Си и в С++ ; синтаксически входит в состав (завершает) Expression Statement, а не отделает друг от друга операторы, как в некоторых других языках.
2
0 / 0 / 0
Регистрация: 23.05.2018
Сообщений: 23
07.09.2018, 12:18  [ТС] 8
Ygg, спасибо огромное!! Код при компиляции ещё выдавал ошибки, но я их быстро исправила. Так что теперь всё работает и всем спасибо!
0
07.09.2018, 12:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2018, 12:18
Помогаю со студенческими работами здесь

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

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

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

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


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

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