Несовместимые типы при назначении строк в связанном списке - PullRequest
0 голосов
/ 23 февраля 2020

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

    struct StackNode { 
    char SData[126]; //this one here
    struct StackNode *next; 
}; 

struct StackNode* StackNewNode(char SData) //i dont know what to put in the char SData, is it a *? 
{                                          //because it produces an invalid conversion error.

    struct StackNode *stackNode = (struct StackNode*)malloc(sizeof(struct StackNode)); 
    stackNode->SData = SData; 
    stackNode->next = NULL; 
    return stackNode; 
}  

char topstack(struct StackNode *root) 
{ 
    if (root == NULL) 
    {
        return 0; 
    }
    return root->SData; 
} 

void push(struct StackNode **root, char SData) 
{ 
    struct StackNode *stackNode = StackNewNode(SData); 
    stackNode->next = *root; 
    *root = stackNode; 
    printf("\n%c pushed to stack\n", SData); 
} 

char pop(struct StackNode **root) 
{ 
    if (*root == NULL) 
    {
        return 0; 
    }
    struct StackNode *temp = *root; 
    *root = (*root)->next; 
    char pop = temp->SData; 
    free(temp); 
    printf("%c popped from stack\n", popped); 
    return pop; 
} 

1 Ответ

0 голосов
/ 23 февраля 2020

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

Если это правда, StackNewNode должен использовать тип параметра const char* в качестве ввода. Другой возможный способ - использовать строковый ввод фиксированной длины с использованием char SData[126].

. Кроме того, необходимо изменить строку stackNode->SData = SData;, чтобы сделать копию строки, поскольку строки обычно не копируются с использованием простого оператора присваивания в C. Для этого сделана функция strcpy в string.h, но поскольку целевой буфер является строкой фиксированной длины размером 126, лучше использовать strncpy .

Кроме того, topstack также должен возвращать строковый тип. Один из способов сделать это - вернуть тип const char *. Но будьте осторожны: если ваш узел свободен, возвращаемая строка больше не будет действительной. Поэтому вы можете сделать копию этой строки, используя strdup , а затем позволить функции, которая вызывает topstack, освободить возвращенную строку. Другой способ - добавить новый параметр char* SData в topstack и скопировать содержимое узла связанного списка в SData в теле функции (в этом случае предполагается, что SData выделяется функцией, которая вызовите topstack и убедитесь, что строка имеет достаточно большой размер для содержания содержимого строки в узле связанного списка.

Наконец, то же самое относится и к pop. Однако строка должна быть продублирована, поскольку функция освобождает узел связанного списка. Обратите внимание, что возвращать значение, вероятно, не нужно, поскольку функция topstack уже может это сделать. Кроме того, popped не определено и, вероятно, должно быть заменено на pop.

...