Проблема добавления уникального символа * в связанный список - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь реализовать структуру данных, в которой у меня есть список значений char * и массив, в котором хранится число вхождений для каждого уникального значения char * из строки cmd. Это немного грязно, но я думал, что понял это, пока не попробовал протестировать его (каждый тест не нужно компилировать по-разному, я просто переименовал каждый прогон, чтобы названия тестов были разными).

Test входные данные cmd:

test1 a b c d e f g
test2 a a b b c d d e f f g g
test3 a a a a a a a a a a a
test4 a a a a a a a a a a a b c c
test5 a j i q y z n f o p m a
test6 a a b b c d d e f f g
test7 a j k q e s l i h i a
test8 a j i q y z n f o p m

Исходя из этих входных данных, длина таблицы для каждого должна выглядеть следующим образом:

test1 table->length = 7    <- works
test2 table->length = 7    <- works
test3 table->length = 1    <- works
test4 table->length = 3    <- works
test5 table->length = 11   <- works
test6 table->length = 7    <- no work
test7 table->length = 9    <- no work
test8 table->length = 11   <- no work

Исходя из этих результатов, я не верю, что это длина argc (как работает тесты 1, 2, 3) и число уникальных *char s (согласно тестам 2, 3, 4,5). При выполнении кода ниже, он либо работает, и я дохожу до конца main(...), или, в зависимости от ввода, он не выполнится после отображения:

...
ptr address: 00DF04F4
ptr value: 00DF0510

test. c:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node {
    char *path;
    int index;
    struct node *next;
} node;

typedef struct lookup {
    struct node *head;
    struct node *ptr;
    int length;
    int array[];
} lookup;

void add(lookup *table, char *path);
void search(lookup *table, char *path, int *i);

void add(lookup *table, char *path) {
    int i = 0;
    search(table, path, &i);
    if(table->ptr == NULL) {
        node *new_node = malloc(sizeof(node));
        if (table->head == NULL) {
            table->head = new_node;
            table->head->next = NULL;
            table->head->path = path;
            table->array[0] = 1;
            table->head->index = 0;
            table->length = 1;
        } else {
            new_node->path = path;
            new_node->next = table->head;
            table->head = new_node;
            table->array[i] = 1;
            table->head->index = i;
            table->length += 1;
        }
    } else {
        table->array[table->ptr->index] += 1;
    }
}

void search(lookup *table, char *path, int *i) {
    if(table->head == NULL) {
        table->ptr = NULL;
        return;
    }
    table->ptr = table->head;
    (*i) = 0;
    while(table->ptr != NULL) {
        printf("ptr address: %p\n", &(table->ptr));
        printf("ptr value: %p\n", (table->ptr));
        /* FAILURE POINT */
        printf("%s\n", table->ptr->path);
        printf("comparing ptr string: '%s' with given '%s'\n", table->ptr->path, path);
        if(strcmp(table->ptr->path, path) == 0) {
            printf("found match!\n");
            return;
        }
        table->ptr = table->ptr->next;
        (*i) += 1;
    }
    printf("could not find '%s' in table\n", path);
}

int main(int argc, char **argv) {
    lookup *table = malloc(sizeof(lookup) + argc);
    table->head = NULL;
    int i = 1;
    for(i; i < argc; i++) {
        printf("\n\ntry adding: %s\n", argv[i]);
        add(table, argv[i]);
    }
    printf("\n\n############\nfinished adding\n");
    printf("table length: %d\n", table->length);

    return 0;
}

Я знаю, что указатель не равен нулю (так как я печатаю его адрес и значение прямо перед этим), но я не уверен, почему он останавливает выполнение, когда он делает это с обычным вводом. Ожидаемый результат (на основе текущего кода) должен показывать каждый char*, который пытается быть добавлен, адрес и значение указателя при search(...) поиске в таблице, текущий *char ptr указывает на то, что два *char s сравниваются, независимо от того, найдено совпадение или search(...) не может найти *char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...