c-如何在链表中实现字符串



主代码本身运行良好,但我想使用字符串而不是字符,这可能是因为我忽略了一些简单得离谱的东西。下面是一小段代码:

struct Stack 
{ 
char *SData; 
int counter;
struct Stack *next; 
}; 

struct Stack* StackNewNode(char SData) 
{ 
struct Stack *stackNode = (struct Stack*)malloc(sizeof(struct Stack)); 
stackNode->SData = SData;       //error here because of the difference of char, should i use []?
stackNode->next = NULL; 
return stackNode; 
}  
void PUSH(struct Stack **root, char SData) //this part only pushes a character
{ 
struct Stack *stackNode = StackNewNode(SData); 
stackNode->next = *root; 
*root = stackNode; 

printf("n%c pushed to stackn", SData); 

} 
void POP(struct Stack **root) 
{ 
if (*root == NULL) 
{
return; 
}
struct Stack *temp = *root; 
*root = (*root)->next; 
char pop = temp->SData; //how should i pop a full string?
free(temp); 
printf("%c popped from stackn", pop); 
} 

我还想在Stack中实现一个计数器。我应该使用Stack->counter++还是有其他更正确的方法?

对不起,这是我第一次来这里

在您提供的代码片段中,struct Stack中的counter没有被使用。假设您想要对堆栈中的元素数量进行计数,那么将该值作为结构的一部分是没有意义的。毕竟,您只需要一个计数,而不需要将一个计数附加到堆栈中的每个元素。您可能希望将其作为自己的变量,也许是在定义根的同一位置定义的全局变量。只需确保将其初始化为零即可。

至于使用字符串,您已经有了char *SData,它可以指向字符串。您所需要做的就是将PUSH和StackNewNode更改为使用char*参数而不是char,然后向其传递一个字符串,类似于以下内容:

PUSH(&root, "My string");

从当前代码开始,这里有一些类型不匹配:stackNode->SData = SData;

stackNode->SData是字符指针,SData是字符。我想你的编译器会警告你这一点——永远不要忽视警告。

如果你想使用C型字符串,你需要更新如下:

  1. 传递char指针而不是char

  2. 为字符串分配内存

  3. 将传递的字符串复制到分配的内存

  4. 完成后释放内存

类似于:

struct Stack 
{ 
char *SData; 
int counter;
struct Stack *next; 
}; 

struct Stack* StackNewNode(const char* str) 
{ 
struct Stack *stackNode = malloc(sizeof(struct Stack)); 
if (stackNode == NULL) exit(1);
stackNode->SData = malloc(strlen(str) + 1);
if (stackNode->SData == NULL) exit(1);
strcpy(stackNode->SData, str);
stackNode->next = NULL; 
return stackNode; 
}  
void PUSH(struct Stack **root, const char* str)
{ 
struct Stack *stackNode = StackNewNode(str); 
stackNode->next = *root; 
*root = stackNode; 

printf("n%s pushed to stackn", str); 

} 
void POP(struct Stack **root) 
{ 
if (*root == NULL) 
{
return; 
}
struct Stack *temp = *root; 
*root = (*root)->next; 
printf("%s popped from stackn", temp->SData); 
free(temp->SData);
free(temp); 
} 

用法示例:

struct Stack *root = NULL;
PUSH(&root, "Hello World");

添加计数器

在代码中,您已将int counter;放置在每个堆栈元素中。你可以做到,但我更喜欢两个结构。一种结构类型保存有关整个堆栈的信息,另一种结构为元素类型。

类似:

struct StackNode
{ 
char *SData; 
struct StackNode *next; 
}; 
struct Stack
{ 
int counter;
struct StackNode *root; 
}; 

功能需要一些更新,如:

void PUSH(struct Stack *stack, const char* str)
{ 
struct StackNode *stackNode = StackNewNode(str); 
stackNode->next = stack->root; 
stack->root = stackNode; 
++stack->counter;          // Increment counter

printf("n%s pushed to stackn", str); 

} 

用法示例:

struct Stack stack = {0, NULL};
PUSH(&stack, "Hello World");

相关内容

  • 没有找到相关文章

最新更新