Функция добавления (добавления к хвосту) связанного списка в C печатается неправильно (не печатает последний добавленный элемент) - PullRequest
0 голосов
/ 19 сентября 2018

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

Это задание переменного тока, которое принимает команды из текстового файла (например, Push, Head, Append и т. Д.).), а затем выполняет соответствующую операцию для связанных списков.У меня есть заголовочный файл, AC-файл, в котором есть мой основной класс и AC-файл с функциями связанного списка.

Все мои функции работают правильно, то есть мои функции remove (), push (), printlist (), head () и tail (), за исключением моей функции добавления (добавления в конец списка).

Это моя структура в заголовочном файле:

typedef struct node 
{
    char data;
    struct node * next;
} node_t;

Это моя функция добавления:

node_t * append(node_t ** headRef, char data)
{
    node_t * current = *headRef;
    node_t * newNode;
    newNode = malloc(sizeof(node_t));
    newNode->data = data;
    newNode->next = NULL;
    // special case for length 0
    if (current == NULL) {
        *headRef = newNode;
    }
    else 
    {
        // Locate the last node
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }   
}

Мой метод печати (при необходимости):

void print_list(node_t * head)
{
    node_t * current = head;
    if(current->next == NULL)                       /* IF no elements in list, */
    {
        printf("-\n");                          /* Print empty hyphen and new line*/
        return;
    }
    else 
    {
        while (current->next != NULL)               
        {
            if(current->next->next ==NULL)              /* Otherwise if there are is one element */
                printf("%c\n", current->data);          /* Print character and a new line (last character) */
            else if (current->next==NULL)               /* Otherwise if there are is more than one element */
                printf("%c-\n", current->data);         /* Print character and hyphen between characters) */
            else
                printf("%c-", current->data);
            current = current->next;                /* Move on to next element in list */
        }
    }
}

И, наконец, вот так выглядит мой основной:

    int main(int argc, char *argv[])
    {
        node_t * test_list = (node_t *)malloc(sizeof(node_t));

        FILE * fp;                          
        fp = fopen(argv[1], "r");
        char line[20];
        int lngth;

        while(fgets(line, 20, fp)!=NULL)                /* Loop to read every command in each file */
        {
            line [ strcspn(line, "\n") ] = 0;               /* Removes all nextline characters from array */

            //Here, I just get conditionals for the statement in the testfile
            //............
            else if(strncasecmp(line, "Append",4) ==0)      /* Check if line matches instruction 'Append' regardless of casing */
            {
                if(strncmp(line, "Append",4) ==0)       /* Now check if the line matches with casing */
                {
                    char letter = line[7];          /* If yes extract the alphabetical character to append */
                    append(&test_list, letter);
                }
                else                        /* If line casing not correct, output to stderr */
                    fprintf (stderr, "Input not valid\n");  
            }   

            else if(strcmp(line, "PrintList") ==0)          /* Check if line matches instruction 'PrintList' */
                print_list(test_list);              /* If it does, print out the list */
            //more conditionals
            //.........
            else                            /* Triggers if line does not match any above instructions */
                fprintf (stderr, "Input not valid\n");      /* Outputs to stderr */
        }
        fclose(fp);
   }

Похоже, мой первый элемент в связанном списке отображается как 0 (пустое место будет напечатано с помощью printf ("% c"), node-> data) для неназначенного символа

Пример теста:

Input:
    Append A
    PrintList

Outputs:
    (Blank line)

Как указано выше, все другие функции работают правильно и при печати выглядят как ABC, если 3 элемента AB иC существует и пустой дефис (-), когда список пуст.

Тестовый пример 2 Пример:

Input:
    Append A
    Append B
    Append C

Outputs:
    -A-B

Пожалуйста, укажите мне, где моя логика ошибочна. Я подозреваю, что это с моей головойизначально он не равен нулю, однако установка его на ноль приводит к тому, что другие мои методы работают некорректно, и не помогает добавлять также.

Некоторые исследования также показывают, что если я первоначально установил head, например, в "z", выводдля добавления для контрольного примера 1 будет z, а для контрольного примера 2 будет be zab

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

Я компилирую сgcc в 64-битной системе Ubuntu.

1 Ответ

0 голосов
/ 19 сентября 2018

Спасибо, 500 - Внутренняя ошибка сервера и Дмитрий.

Это была простая проблема.Я только думал, что мой метод печати работает из-за других функций, не видя, что я действительно работал над этим все время и имел дополнительный элемент в моем списке.

Я исправил его, изменив свои методы print_list какследует:

void print_list(node_t * head)
{
    node_t * current = head;
    if(current == NULL)                     /* IF no elements in list, */
    {
        printf("-\n");                          /* Print empty hyphen and new line*/
        return;
    }
    else 
    {
        while (current != NULL)                 
        {
            if (current->next==NULL)        
                printf("%c\n", current->data);
            else
                printf("%c-", current->data);
            current = current->next;                /* Move on to next element in list */
        }
    }
}

Я также мог бы затем инициализировать свою голову в null в main как:

node_t * test_list = NULL;

вместо as:

node_t * test_list = (node_t *)malloc(sizeof(node_t))

Так как яхотел пустой список, чтобы мои границы могли работать правильно и чтобы я распечатывал последний элемент, поскольку старый цикл current-> next! = NULL останавливается на NULL и не печатает мой последний элемент.

...