c - 尝试替换由 C 中链表中的节点组成的单词

标签 c

我正在尝试查找在链接列表中形成单词的节点列表。所以它是这样的:I->a->n-> ->i->s-> ->a->w-e>s->o->m->e->NULL 。目标是将其替换为类似 I->a->n-> ->i->s-> ->c->o->o->l->NULL 的内容。我们希望这样做,无论被替换的单词或替换它的单词的大小如何。

我尝试遍历索引并删除该单词,然后通过索引替换它。然而,这使事情变得复杂,而且我从来没有真正得到我正在寻找的词。

我现在只是尝试删除要替换的单词,现在我尝试简单地将节点的单词替换为形成新单词的新节点。

我现在正在尝试操纵数组大小,看看这是否允许我输入单词。

void indexInsert(char character, int n){

    node* temp1 =(node*)malloc(sizeof(struct node));
    temp1->character = character;
    temp1->nextNode = NULL;
    if(n == 1){
        temp1->nextNode = headNode;
        headNode = temp1;
        return;
    }
    node* temp2 = headNode;
    for(int i = 0; i < n-2; i++){
        temp2 = temp2->nextNode;
    }

    temp1->nextNode = temp2->nextNode;
    temp2->nextNode = temp1;

}

void replaceWord(char replaceWord[]) {

    deleteWord(&headNode, replaceWord);

    int Size = 1;
    int Size2 = 2;
    char entryWord[Size];
    char entryWordCopy[Size2];

    printf("Please enter the new word you wish to insert: ");
    strcpy_s(entryWordCopy, Size2,gets_s(entryWord, Size));
    printf("\n");

    int length = strlen(entryWordCopy);

    indexInsert(entryWordCopy, length);

    Print(head);



}

最终结果应该是删除形成单词 A 的节点,然后被形成单词 B 的节点替换。但是,在执行程序时,我遇到了大小数组的问题,并且未评估我的字符串。返返回告:失败是由于在其生命周期之外读取变量引起的。

最佳答案

我的提示: 不要对列表使用索引,您可以对指向节点的指针执行相同的操作。您不必迭代索引,指向节点的指针更快。

您应该更改算法以使用指向节点的指针:

查找最后一个单词: 遍历列表,如果找到一个空格的节点,则将指向该节点的指针存储在变量中,如果到达列表的末尾,则记住的指向该节点的指针是最后一个单词之前的空格。您只需更改以下节点即可。如果您从未找到包含空格的节点,您可以简单地用替换项替换整个列表。

另一个技巧是使用双指针,它将指针存储到指向最后一个单词的节点的指针。 (这也可能是列表的根)

// node** p is a pointer to the pointer of the first element
// if your root is defined as `node* root`, you use
// `... = last_word(&root);`
node** last_word(node** p) {
    node* n = *p;
    while(n) {
        if(n->data == ' ') p = &n->next;
        n = n->next;
    };
    return p;
};

插入节点:

你从像last_word这样的算法中得到了一个指针,它是一个指向节点的指针。它指向变量,该变量存储指向下一个节点的指针(有一个关于此的 ComputerPhile 视频),这完全处理开头、结尾和中间的插入:

void insert(node** p, char c) {
    node* elem = (node*)malloc(sizeof(node));
    elem->data = c;
    elem->next = *p; // connect to following node
    *p = elem; // connect previous node/root to the node
};

如果您确实需要使用索引,您应该始终将代码拆分为单独的函数。

node** node_by_index(node** p, int index) {
    while(index > 0) {
        p = &(*p)->next;
        --index;
    };
    return p;
};

关于c - 尝试替换由 C 中链表中的节点组成的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55593078/

相关文章:

使用套接字在两台计算机之间复制目录

python - C 或 Python 中的双峰分布

c - 扫描随机数的 float ,直到 C 中的新行

c - '(' token 之前的预期标识符或 '}'

c - 在 C 中初始化某个结构字段 on-initialization

c++ - 如何在 C/C++ 中处理二进制数据

c - 如何在我的 C 程序中使用来自 Internet 的文本文件?

C 语言的中心差分近似

c - <semaphore.h> 和 <sys/sem.h> 的区别

android - 无法定位符号