【问题标题】:How to implement a character string in a linked list如何在链表中实现字符串
【发布时间】:2021-01-27 09:28:22
【问题描述】:

主代码本身工作正常,但我想使用字符串而不是 char,这可能是因为我忽略了一些荒谬的简单事情。这是一段小sn-p代码:

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 stack\n", 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 stack\n", pop); 
} 

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

抱歉,这是我第一次来这里的文字墙

【问题讨论】:

  • 不清楚您要做什么。在任何人可以帮助您之前,您需要自己弄清楚这一点。 Stack 应该包含字符串还是字符?你有一种方式,另一种方式。如果你想要字符串 (char*) 那么你需要传递 char* 并处理所需的内存,
  • 您甚至都没有尝试SData存储在任何地方...
  • stackNode->SData = SData; 应该会给你一个警告。关于“从整数分配指针”

标签: c linked-list stack


【解决方案1】:

我在您提供的代码 sn-ps 中的任何地方都没有看到 struct Stack 中的 counter。假设您想要计算堆栈中元素的数量,那么将此值作为结构的一部分是没有意义的。毕竟,您只需要一个计数,而不是附加到堆栈中的每个元素。您可能希望使其成为自己的变量,也许是在您定义 root 的同一位置定义的全局变量。只需确保将其初始化为零即可。

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

PUSH(&root, "My string");

【讨论】:

    【解决方案2】:

    从您当前的代码开始,这里有一些类型不匹配: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 stack\n", str); 
        
    } 
    
    void POP(struct Stack **root) 
    { 
        if (*root == NULL) 
        {
            return; 
        }
        struct Stack *temp = *root; 
        *root = (*root)->next; 
    
        printf("%s popped from stack\n", 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 stack\n", str); 
        
    } 
    

    使用示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      相关资源
      最近更新 更多