Поп-функция в стеке (C) - PullRequest
0 голосов
/ 07 мая 2018

У меня возникли проблемы с функцией pop() в этой программе.Это реализация стека в виде односвязного списка, и, как вы можете видеть, функция pop имеет два аргумента:

void pop (STACK * stack, char ** name)

Мне сказали: выделите память для name в функции pop и верните name или NULL, используя аргумент **name.Я пробовал несколько вещей, но я не понимаю, что это на самом деле означает, а также как это сделать, поскольку функция ничего не возвращает (тип void).Обычно у меня возникают проблемы с пониманием этого аргумента **name, и почему мы вообще хотим использовать его в первую очередь.Вот мой код:

typedef struct _stack STACK;
typedef struct _sElem stackElement;

struct _stack{
    stackElement *head;
};

struct _sElem{
    char *name;
    stackElement *next;
};

//solved:
void pop(STACK *stack, char **name){
    if(stack == NULL || stack->head == NULL){
        printf("Stack is empty. \n");
    }else{
        stackElement *temp = stack->head;
        char **nodeName = malloc(sizeof(char*));
        char *tempName = temp->name;
        (*nodeName)=tempName;
        (*name) = (*nodeName);
        stack->head = temp->next;
        free(temp);
    }
}

int main(){
    STACK *myStack = NULL;
    char *tempName = NULL;

    push(myStack, "One");
    push(myStack, "Two");
    push(myStack, "Three");
    pop(myStack, &tempName);
    pop(myStack, &tempName);

    //free stack and tempName

    return 0;
}

Я ценю любую помощь.Благодаря.

1 Ответ

0 голосов
/ 07 мая 2018

Обычно у меня возникают проблемы с пониманием этого ** аргумента имени, и почему мы даже хотим использовать это в первую очередь.

Потому что в C все параметры передаются по значению. Таким образом, если ваша функция была определена как void pop(STACK *stack, char *name), а вы присвоили значение name внутри pop, она не будет видна вызывающей стороне после возврата pop.

Вместо этого, если вы определяете свою функцию как: void pop(STACK *stack, char **name), тогда вы можете присвоить *name, чтобы вызывающий имел доступ к новому значению.

Например:

STACK *head = ...
char *name = NULL;
pop(head, &name);
if (name != NULL)
{
   fprintf(stdout, "Popped name: %s\n", name);
   free(name);
}
...