尝试替换由 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;
};

最新更新