Member 13037163 Ответов: 1

Динамическое выделение памяти для строки в связанном списке


Я написал код ниже, но не могу получить желаемый результат.

//запуск программы
Вариант = 1
Наименование = Выборка

//Выход
НУЛЕВОЙ

Что я уже пробовал:

struct node{
    char *name;
    struct node *link;
};

struct node *head, *temp, *ptr;

void getNameStart(){
    temp = (struct node *) malloc (sizeof(struct node));

    temp -> name = DynamicName();
    temp -> link = head;
    head = temp;
}

void Print(){
    temp = head;
    while(temp != 0){
        printf("\n%s", temp -> name);
        temp = temp -> link;
    }
}

void DynamicName(){
    char *name, c;
    int i=0, j=2;

    fflush(stdin);
    printf("\nEnter name : ");
    c = getchar();
    name = (char *) malloc (sizeof(char));

    while(c != '\n'){
        name[i] = c;
        name = (char *) realloc (name, sizeof(char) * j);
        c = getchar();
        i++, j++;
    }
    name[i] = '\0';
    return name;
}

int main(){
    head = 0;
    int i=0, op1;
    char op[5];

    do{
        printf("\nSelect option : ");
        printf("\n\n1. Insert at beginning\n2. Insert at end\n3. Insert anywhere");
        printf("\n\nYour choice : ");
        scanf("%d", &op1);

        switch (op1){
            case 1 : getNameStart(); break;
        }

        printf("\nInsert more nodes? : ");
        fflush(stdin);
        gets(op);

    }   while(strcmp(op, "YES")==0 || strcmp(op, "yes")==0);

    printf("\n\nThe list is : ");
    Print();
}

Garth J Lancaster

вы прошли через свою программу с помощью отладчика и проверили содержимое ваших переменных ? если вы не можете, потому что не работаете в среде с отладчиком, вы можете использовать операторы printf () - например :-

temp - > name = DynamicName();
temp - & gt; link = head;

вставьте printf, чтобы проверить, возвращается ли имя из вашей функции DynamicName () - если вы ничего не получаете обратно из DynamicName, вот где вы начинаете искать

temp - > name = DynamicName();
printf ("name = [%s]\n", temp = & gt; name);
temp - & gt; link = head;

Я не уверен, что мне нравится ваша функция DynamicName или если она вообще работает - вы не сказали, какую среду вы используете, вы могли бы использовать getline () вместо того, чтобы заново изобретать колесо

Member 13037163

Я понял проблему, я использовал функцию void, которая пыталась вернуть значение.
Большое вам спасибо за помощь.

1 Ответов

Рейтинг:
8

Patrice T

Цитата:
Я понял в чем проблема,

Даже если вы нашли, в чем была проблема, совет научиться использовать отладчик-это то, что нужно учитывать.

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13037163

Спасибо, я буду иметь это в виду.