链表中字符串赋值的不兼容类型
Incompatible types in assignment of strings in linked list
该程序的目的是将中缀表达式转换为后缀,然后使用链表计算值。我试过使用 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;
}
我假设您想要一个固定长度字符串的链表。
如果这是真的,StackNewNode
应该使用 const char*
参数类型作为输入。另一种可能的方法是使用固定长度的字符串输入 char SData[126]
.
此外,必须修改行 stackNode->SData = SData;
以进行字符串复制,因为在 C 中通常不会使用简单的赋值语句复制字符串。函数 strcpy in string.h is made for that, but since your destination buffer is a fixed-length string of size 126, it is better to use strncpy.
此外,topstack
还必须 return 类似字符串的类型。一种方法是 return 一个 "const char*" 类型。但要小心:如果您的节点空闲,字符串 returned 将不再有效。因此,您可能希望使用 strdup 复制该字符串,然后让调用 topstack
的函数释放 returned 字符串。另一种方法是将新参数 char* SData
添加到 topstack
并将链接列表节点的内容复制到函数主体中的 SData
(在这种情况下,它假设 SData由调用topstack
的函数分配,并且字符串的大小足以包含链表节点中的字符串内容)。
最后,同样的事情适用于 pop
。但是,由于该函数释放了链表节点,因此必须复制该字符串。请注意,可能不需要 returning 值,因为 topstack
函数已经可以做到这一点。此外,popped
未定义,可能应替换为 pop
。
该程序的目的是将中缀表达式转换为后缀,然后使用链表计算值。我试过使用 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;
}
我假设您想要一个固定长度字符串的链表。
如果这是真的,StackNewNode
应该使用 const char*
参数类型作为输入。另一种可能的方法是使用固定长度的字符串输入 char SData[126]
.
此外,必须修改行 stackNode->SData = SData;
以进行字符串复制,因为在 C 中通常不会使用简单的赋值语句复制字符串。函数 strcpy in string.h is made for that, but since your destination buffer is a fixed-length string of size 126, it is better to use strncpy.
此外,topstack
还必须 return 类似字符串的类型。一种方法是 return 一个 "const char*" 类型。但要小心:如果您的节点空闲,字符串 returned 将不再有效。因此,您可能希望使用 strdup 复制该字符串,然后让调用 topstack
的函数释放 returned 字符串。另一种方法是将新参数 char* SData
添加到 topstack
并将链接列表节点的内容复制到函数主体中的 SData
(在这种情况下,它假设 SData由调用topstack
的函数分配,并且字符串的大小足以包含链表节点中的字符串内容)。
最后,同样的事情适用于 pop
。但是,由于该函数释放了链表节点,因此必须复制该字符串。请注意,可能不需要 returning 值,因为 topstack
函数已经可以做到这一点。此外,popped
未定义,可能应替换为 pop
。