我有一个由这样的字符组成的链表…
node1 - "p"
node2 - "o"
node3 - "p"
我需要一个功能,它需要三个月。。。
node *replaceChar(node *head, char key, char *str)
该功能的规定。head是列表的头,"key"one_answers"str"保证仅包含字母数字字符(A-Z、A-Z和0-9)。str的范围从1到1023个字符(包括1到1024个字符)。
因此,如果我用这些参数调用这个函数。。
node *head == /*the head of the list to be examined*/
char key == "p"
char *str == "dog"
新列表将如下所示。。。
node1 - 'd'
node2 - 'o'
node3 - 'g'
node4 - 'o'
node5 - 'd'
node6 - 'o'
node7 - 'g'
"p"的所有实例都替换为"dog"
我有一个toString函数,它接收一个字符串并将其转换为链表并返回头。因此,假设您可以调用str="dog"上的函数,因此…
toString(str) == /*this will return the head to the list made from the str*/
如果我不清楚我的问题是什么……我被如何编写replaceChar函数难住了,这个函数需要三个字符。。我可以使用字符串创建一个新列表,并找到键的所有实例,但让新列表适应旧列表而不丢失指针会让我很痛苦。
我试过这个。。。
while(head->data != NULL)
{
if(head->data == key)
{
node *newListHead = toString(str);
head = newListHead;
/*here I lose track of the old list*/
您可以这样开始:
node *replaceChar(node *head, char key, char *str)
{
node *cur, prev;
for (cur = head, prev = NULL; cur != NULL; prev = cur, cur = cur->next)
if (cur->ch == key) {
node *hstart = toString(str);
for (node *hend = hstart; hend->next != NULL; hend = hend->next)
;
if (prev == NULL)
head = hstart;
else
prev->next = hstart;
hend->next = cur->next;
free(cur);
}
}
我的假设:您的节点结构如下:
sturct node {
char ch;
struct node* next;
};
toString(str)
工作得非常好。