【问题标题】:Incompatible types in assignment of strings in linked list链表中字符串分配的类型不兼容
【发布时间】:2020-06-07 10:32:08
【问题描述】:

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

【问题讨论】:

  • char SData 是单个字符的值。您应该为StackNewNode() 和适当的地方传递一个指向const char 数组的指针。

标签: c linked-list stack variable-assignment


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您,请记住这一点。至于pop没有定义,那是我的错。
  • 没问题,如果可以解决您的问题,请考虑阅读this
猜你喜欢
  • 2012-07-22
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多