Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2018, 18:37   #1
Saint41357
Новичок
Джуниор
 
Регистрация: 23.12.2018
Сообщений: 2
По умолчанию Проблемы с заполнением двусвязного списка

Здравствуйте. Имеется код, в котором пытаюсь сделать двусвязный список, содержащий структуры, состоящие из динамической строки и указателей на следующий предыдущий элементы. Написал функции добавления в конец списка и вывод всего списка. в функции main создаю динамическую строку, потом в цикле посимвольно заполняю её(есть проверка вводимых символов) и при нажатии Enter строка добавляется в список. При нажатии ESC выводится весь список. Проблема в том, что список заполняется только одной строкой( последней, как на скрине). Предполагаю, что проблема с указателями, но не знаю как решить. Пишу на языке Си, не С++.
Код:
Код:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"
 
#define ENTER 13
#define ESC 27
 
struct element {
    char *str;
    element *prev;
    element *next;
};
 
struct Dblist {
    int size;
    element *head;
    element *end;
};
 
 
//Создание списка
Dblist* createList() {
    Dblist *tmp = (Dblist *)malloc(sizeof(Dblist));
    tmp->size = 0;
    tmp->head = tmp->end = NULL;
 
    return tmp;
}
 
 
//Добавление в конец списка
void addElem(Dblist *list, char *value) {
    element *tmp = new element;
    tmp->str = (char *)malloc(sizeof(char) * strlen(value));
    tmp->str = value;
    tmp->next = NULL;
    tmp->prev = list->end;
 
    if (list->end) {
        list->end->next = tmp;
    }
    list->end = tmp;
 
    if (list->head == NULL) {
        list->head = tmp;
    }
 
    list->size++;
}
 
//Вывод списка
void printList(Dblist *list) { 
    element *tmp = list->head;
 
    while (tmp) {
        printf("%s\n", tmp->str);
        tmp = tmp->next;
    }
}
 
void main() {
    Dblist *list = createList(); //Инициализация списка
    bool countSpace = false; 
    char sym;
    char *string = (char *)malloc(sizeof(char));// Объявление строки, которая будет заполнятся символами
    int i = 0;
 
 
        //Цикл заполнения строки
    while (true) {
        sym = _getch();
 
        if (sym == ENTER) {
            string[i] = '\0';
            addElem(list, string); //добавление строки в список
            i = 0;
            printf("\n");
           //string[0] = '\0'; При попытке после каждого добавление строки обнулять её, список заполняется пустотой
            continue;
        }
        else if (sym == ESC) {
            if (i > 0) {
                string[i] = '\0';
                addElem(list, string);
                printf("\n");
            }
            printf("\n");
            printList(list); //Вывод списка на экран
            break;
        }
        else if ((sym >= 'A' && sym <= 'Z') || sym == ' ') {
            if (sym == ' ') {
                if (sym == ' ' && i <= 0) {
                    continue;
                }
                else if (!countSpace) {
                    countSpace = true;
                }
                else {
                    continue;
                }
            }
            else {
                countSpace = false;
            }
            printf("%c", sym);
                        //Заполнение строки
            string[i] = sym;
            i++;
            string = (char *)realloc(string, sizeof(char) * (i + 1));
        }
        else {
            continue;
        }
    }
 
    _getch();
}
Изображения
Тип файла: png Console.png (1.9 Кб, 25 просмотров)
Saint41357 вне форума Ответить с цитированием
Старый 23.12.2018, 18:45   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
    tmp->str = (char *)malloc(sizeof(char) * strlen(value));
    tmp->str = value;
Памяти надо выделять +1 для завершающего 0
Так строки не копируются, либо в цикле, либо strcpy и подоюные.
p51x вне форума Ответить с цитированием
Старый 23.12.2018, 18:51   #3
Saint41357
Новичок
Джуниор
 
Регистрация: 23.12.2018
Сообщений: 2
По умолчанию

Спасибо за помощь, допёр. Удачи
Saint41357 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прога на обработку двусвязного списка sckarlett Паскаль, Turbo Pascal, PascalABC.NET 2 18.12.2015 10:15
Стек на основе двусвязного списка hidforce Помощь студентам 7 10.04.2015 07:22
Сортировка двусвязного списка SoTwisted Помощь студентам 1 21.02.2012 09:51
Сортировка двусвязного списка. Ninna Паскаль, Turbo Pascal, PascalABC.NET 0 30.05.2011 13:03
Очередь в виде двусвязного списка. dimorik Общие вопросы C/C++ 9 10.06.2010 02:24