Поместите последовательные элементы в стек, если значение одинаково - PullRequest
0 голосов
/ 30 июня 2018

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

char *dropoff(struct stack *tosPtr)
{
    printf("current tos is %s\n", tosPtr->name);
    if(tosPtr == NULL)
        return STACK_IS_EMPTY;
    while(strcmp(tosPtr->name, tosPtr->next->name) == 0) {
        stack *oldBox = tosPtr;     
        tosPtr = tosPtr->next;          
        if(oldBox == tosPtr)
            tosPtr = NULL;
        free(oldBox);
    }

    return tosPtr;
}

1 Ответ

0 голосов
/ 30 июня 2018

Похоже, ты рядом. Вы забыли удалить первое слово (вы заявляете, что хотите сделать это независимо). Тогда ваше время почти там. Также вы сравниваете два указателя, которые всегда должны быть неравны (tosPtr и tosPtr->next) - разве не должно быть какой-то циклической ссылки, которую вы не упомянули?

struct stack *dropoff(struct stack *tosPtr) {
    printf("current tos is %s\n", tosPtr->name);
    if(tosPtr == NULL)
        return STACK_IS_EMPTY;

    struct stack *oldBox = tosPtr;
    tosPtr = tosPtr->next;
    //Double check in while we didn't hit bottom of stack
    while(tosPtr && strcmp(oldBox->name, tosPtr->name) == 0) {
        free(oldBox); //Maybe need to free oldBox->name as well?!
        oldBox = tosPtr;
        tosPtr = tosPtr->next;
    }
    //One node left to free - maybe name?
    free(oldBox);
    return tosPtr ? tosPtr : STACK_IS_EMPTY; //Return empty stack if needed
}

Обратите внимание, что вам нужно struct и в определении переменной, если вы не typedef его, и я думаю, что вы не сделали этого, потому что аргумент определен таким образом. Если имя было malloc d, вам нужно освободить его задолго до освобождения стекового узла.

...