#include <iostream> #include "string.h" #include "stdio.h" #include <conio.h> #include "locale.h" #define MAXDL 9 using namespace std; struct EL_SP /* тип элемента списка */ { char id[MAXDL]; /* идентификатор */ struct EL_SP* sled; /* ссылка на следующий элемент */ }; void Vkl(struct EL_SP** p, char t_id[]) /* Вх. данные: *p - указатель списка идентификаторов в лексикографическом порядке, t_id - включаемый в список (текущий) ид-р */ /* Вых. данные: *p */ { struct EL_SP* pt, * k, * j; pt = (struct EL_SP*)malloc(sizeof(struct EL_SP)); strcpy_s(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; } /* включение эл-та *pt после элемента *j */ j->sled = pt; pt->sled = k; } } void PechSp(struct EL_SP* p) { struct EL_SP* i; /* указатель текущего элемента списка */ printf("\nРезультат:\n"); for (i = p; i != NULL; i = i->sled) puts(i->id); } void delEl(struct EL_SP** p) { struct EL_SP* i, *j = NULL; if (*p == NULL || (*p)->sled == NULL) return; if ((*p)->sled->sled == NULL) { i = *p; *p = (*p)->sled; delete i; } else { for (i = *p; i->sled->sled != NULL; i = i->sled) j = i; if(j != NULL) j->sled = i->sled; delete i; } } void Chening(struct EL_SP* p, char tatum[], int num) { struct EL_SP* i; int n; for (i = p, n = 1; i != NULL; i = i->sled, n++) { if (n == num) { strcpy_s(i->id, tatum); } } } void Count(struct EL_SP* p, char find) { struct EL_SP* i; int n = 0; for (i = p; i != NULL; i = i->sled) { if (i->id[0] == find) n++; } cout << "Кол-во индификаторов подоходящих условию = " << n; } void PushInA(struct EL_SP* p, char find, char (*A)[MAXDL]) { struct EL_SP* i; int n = 0; for (i = p; i != NULL; i = i->sled) { if (i->id[0] == find) { strcpy_s(A[n], i->id); n++; } } cout << "Готовый массив:\n"; for (int j = 0; j < n; j++) puts(A[j]); } int main() { setlocale(LC_ALL, "rus"); system("chcp 1251"); struct EL_SP* p; /* указатель начала списка */ unsigned n; /* количество идентификаторов */ unsigned i; /* параметр цикла */ char t_id[MAXDL]; /* текущий идентификатор */ printf("\nВведите число идентификаторов\n n="); scanf_s("%u", &n); getchar(); /* пропуск символа "перевод строки" */ p = NULL; /* список пока пуст */ printf("Введите идентификаторы "); printf("(после каждого нажимайте клавишу <Enter> )\n"); for (i = 1; i <= n; i++) { gets_s(t_id); Vkl(&p, t_id); /* включение ид-ра в список */ } PechSp(p); /* печать списка */ delEl(&p); cout << "\n---- Удалили последний элемент ----\n"; PechSp(p); /* печать списка */ cout << "\n---- Заменить индификатор элемента ----\n"; int k; char newstr[MAXDL]; cout << "Введите порядок элемента: "; cin >> ws >> k; cout << "Введите индификатор: "; cin >> ws >> newstr; Chening(p, newstr, k); PechSp(p); /* печать списка */ cout << "\n---- Определить количество идентификаторов ----\n"; char find; cout << "С какого символа начинать: "; cin >> ws >> find; Count(p, find); cout << "\n---- Записать в массив A ----\n"; cout << "С какого символа начинать: "; cin >> ws >> find; char A[20][MAXDL]; PushInA(p, find, A); printf("\n\nДля завершения нажмите любую клавишу\n"); _getch(); return 0; } Code #include <iostream> #include "string.h" #include "stdio.h" #include <conio.h> #include "locale.h" #define MAXDL 9 using namespace std; struct EL_SP /* тип элемента списка */ { char id[MAXDL]; /* идентификатор */ struct EL_SP* sled; /* ссылка на следующий элемент */ }; void Vkl(struct EL_SP** p, char t_id[]) /* Вх. данные: *p - указатель списка идентификаторов в лексикографическом порядке, t_id - включаемый в список (текущий) ид-р */ /* Вых. данные: *p */ { struct EL_SP* pt, * k, * j; pt = (struct EL_SP*)malloc(sizeof(struct EL_SP)); strcpy_s(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; } /* включение эл-та *pt после элемента *j */ j->sled = pt; pt->sled = k; } } void PechSp(struct EL_SP* p) { struct EL_SP* i; /* указатель текущего элемента списка */ printf("\nРезультат:\n"); for (i = p; i != NULL; i = i->sled) puts(i->id); } void delEl(struct EL_SP** p) { struct EL_SP* i, *j = NULL; if (*p == NULL || (*p)->sled == NULL) return; if ((*p)->sled->sled == NULL) { i = *p; *p = (*p)->sled; delete i; } else { for (i = *p; i->sled->sled != NULL; i = i->sled) j = i; if(j != NULL) j->sled = i->sled; delete i; } } void Chening(struct EL_SP* p, char tatum[], int num) { struct EL_SP* i; int n; for (i = p, n = 1; i != NULL; i = i->sled, n++) { if (n == num) { strcpy_s(i->id, tatum); } } } void Count(struct EL_SP* p, char find) { struct EL_SP* i; int n = 0; for (i = p; i != NULL; i = i->sled) { if (i->id[0] == find) n++; } cout << "Кол-во индификаторов подоходящих условию = " << n; } void PushInA(struct EL_SP* p, char find, char (*A)[MAXDL]) { struct EL_SP* i; int n = 0; for (i = p; i != NULL; i = i->sled) { if (i->id[0] == find) { strcpy_s(A[n], i->id); n++; } } cout << "Готовый массив:\n"; for (int j = 0; j < n; j++) puts(A[j]); } int main() { setlocale(LC_ALL, "rus"); system("chcp 1251"); struct EL_SP* p; /* указатель начала списка */ unsigned n; /* количество идентификаторов */ unsigned i; /* параметр цикла */ char t_id[MAXDL]; /* текущий идентификатор */ printf("\nВведите число идентификаторов\n n="); scanf_s("%u", &n); getchar(); /* пропуск символа "перевод строки" */ p = NULL; /* список пока пуст */ printf("Введите идентификаторы "); printf("(после каждого нажимайте клавишу <Enter> )\n"); for (i = 1; i <= n; i++) { gets_s(t_id); Vkl(&p, t_id); /* включение ид-ра в список */ } PechSp(p); /* печать списка */ delEl(&p); cout << "\n---- Удалили последний элемент ----\n"; PechSp(p); /* печать списка */ cout << "\n---- Заменить индификатор элемента ----\n"; int k; char newstr[MAXDL]; cout << "Введите порядок элемента: "; cin >> ws >> k; cout << "Введите индификатор: "; cin >> ws >> newstr; Chening(p, newstr, k); PechSp(p); /* печать списка */ cout << "\n---- Определить количество идентификаторов ----\n"; char find; cout << "С какого символа начинать: "; cin >> ws >> find; Count(p, find); cout << "\n---- Записать в массив A ----\n"; cout << "С какого символа начинать: "; cin >> ws >> find; char A[20][MAXDL]; PushInA(p, find, A); printf("\n\nДля завершения нажмите любую клавишу\n"); _getch(); return 0; } Кто подскажет как исправить ошибку ничего не понимаю в этих списках на C++
LoskG, Вы сказали, что не знаете списки, как инициализировать переменную вы должны знать, иначе вам рано браться за данную задачу. Можете например в 20 строке сделать аналогично 48. Тогда желательно делать проверку на нулевой указатель при обращении к членам объекта через него.
ошибки написаны в дебаггере, исправляй их. указатели не будут работать если не задать ссылку на память или nullptr как это чудо должно вообще указывать на начало списка? и что это такое?