我正在尝试查找在链接列表中形成单词的节点列表。因此它类似于: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的节点。但是,在执行程序时,我遇到了大小数组和未评估字符串的问题。返回报告:失败是由于在其生存期之外读取变量引起的。
答案 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;
};