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

时间:2019-04-09 12:37:24

标签: 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的节点。但是,在执行程序时,我遇到了大小数组和未评估字符串的问题。返回报告:失败是由于在其生存期之外读取变量引起的。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

// 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;
};