首页 > 解决方案 > 链表中字符串分配的类型不兼容

问题描述

该程序的目的是将中缀表达式转换为后缀,然后使用链表计算值。我试过使用 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; 
} 

标签: clinked-liststackvariable-assignment

解决方案


我假设您想要一个固定长度字符串的链接列表。

如果这是真的,StackNewNode应该使用const char*参数类型作为输入。另一种可能的方法是使用固定长度的字符串输入,使用char SData[126].

此外,stackNode->SData = SData;必须修改该行以复制字符串,因为通常不会使用 C 中的简单赋值语句复制字符串。 string.h 中的函数strcpy就是为此而设计的,但由于您的目标缓冲区是一个固定长度的字符串大小 126,最好使用strncpy

此外,topstack还必须返回类似字符串的类型。一种方法是返回“const char*”类型。但请注意:如果您的节点空闲,则返回的字符串将不再有效。因此,您可能希望使用strdup复制该字符串,然后让调用的函数topstack释放返回的字符串。另一种方法是添加一个新参数并将链接列表节点的内容复制到char* SData函数主体中(在这种情况下,它假设 SData 是由调用的函数分配的,并且字符串的大小很大足以包含链表节点中的字符串内容)。topstackSDatatopstack

最后,同样的事情适用pop。但是,由于该函数释放了链表节点,因此必须复制字符串。请注意,可能不需要返回值,因为topstack函数已经可以做到。此外,popped未定义,可能应替换为pop.


推荐阅读