Загрузка...

Fix bug in C++

Thread in C/C++ created by LoskG Jan 25, 2023. 196 views

  1. LoskG
    LoskG Topic starter Jan 25, 2023 Banned 1 Aug 12, 2019
    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++
    [IMG]
     
  2. Daemon
    Daemon Jan 25, 2023 1680 Jan 8, 2021
    Очевидно необходимо инициализировать j.
     
    1. LoskG Topic starter
      Daemon, это очевидно. Но как это сделать?
    2. Daemon
      LoskG, Вы сказали, что не знаете списки, как инициализировать переменную вы должны знать, иначе вам рано браться за данную задачу. Можете например в 20 строке сделать аналогично 48. Тогда желательно делать проверку на нулевой указатель при обращении к членам объекта через него.
    3. LoskG Topic starter
  3. LVV
    ошибки написаны в дебаггере, исправляй их.

    указатели не будут работать если не задать ссылку на память или nullptr
    как это чудо должно вообще указывать на начало списка?

    и что это такое?
     
Loading...
Top