это мой первый пост, так что будьте любезны указать мне, если я сделаю какие-либо ошибки со своим постом.
Это задание переменного тока, которое принимает команды из текстового файла (например, 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.