【问题标题】:LinkedList head node keeps being overwritten CLinkedList 头节点不断被覆盖 C
【发布时间】:2019-08-22 03:50:42
【问题描述】:

我目前正在尝试创建一个链表,但是由于某种原因,我的头指针数据不断被覆盖。我有以下方法可以处理表中的插入并记录我遇到的任何单词的频率。如果单词已经被看到,则更新它的频率,否则,以频率 1 将单词添加到列表的末尾。方法开头的 print 语句应该打印存储在第一个值处的单词.我用来测试列表的文本是a dog and cat,但是第一个打印语句打印出存储在word 变量中的值,即使它应该总是打印出a。当我打印整个链表时,我看到的只是输入的最后一个单词,或者dog。我假设它与我遍历列表以查看单词是否存在或是否必须打印的方式有关,但我无法弄清楚如何解决这个问题。

typedef struct tableNode{
  int freq;
  char * word;
  struct tableNode *next;

}tableNode;

void insertIntoTable(char* word){
    if (tableHead != NULL) printf("%s\n", tableHead -> word);
    if (tableHead == NULL){
        printf("Null %s\n", word);
        tableHead = (tableNode*) malloc(sizeof(tableNode));
        tableHead -> word = word;
        tableHead -> freq = 1;
        tableHead -> next = NULL;
        return;
    }

    tableNode* ptr = tableHead;
    while(ptr -> next != NULL){
        if (strcmp(ptr -> word, word) == 0){
            printf("Dup %s %s\n", ptr -> word, word);
            ptr -> freq = (ptr -> freq) + 1;
            return;
        }
        ptr = ptr -> next;
    }
    if (strcmp(ptr -> word, word) == 0){
        printf("Dup %s %s\n", ptr -> word, word);
        ptr -> freq = (ptr -> freq) + 1;
        return;
    }
    printf("New %s\n", word);
    ptr -> next = (tableNode*) malloc(sizeof(tableNode));
    ptr -> next -> word = word;
    ptr -> next -> freq = 1;
    ptr -> next -> next = NULL;
}

【问题讨论】:

标签: c pointers


【解决方案1】:

事实证明,这不是我的方法的问题,而是我如何调用插入方法的问题。我正在发送一个 char*,但该 char* 的值不断变化,每次都有效地改变头节点的值。我用strdup创建了一个副本并发送了那个值,它起作用了。

【讨论】:

  • 另外,插入代码可以复制它要存储的单词。确保您知道哪个代码负责哪个内存在 C 中非常重要。释放链表时不要忘记释放复制的单词。
  • 确实如此,非常感谢!如果你没有提到它,我可能会忘记它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2015-01-24
  • 2014-05-31
相关资源
最近更新 更多