次のコードは、単一の文字を含むノードを、文字列から変換されたノードのリンクされたリストに置き換えることになっています。
node *replaceChar(node *head, char key, char *str)
{
node *nhead = head;
if (head == NULL)
return nhead;
if (str == NULL || strcmp(str, "") == 0)
{
if (head->data == key)
{
deleteN(head, key);
}
head->next = replaceChar(head->next, key, str);
}
if (head->data == key)
{
node* temp = head;
node* tail = temp->next;
head = temp->next;
free(temp);
head = stringToList_replace(str, tail);
}
head->next = replaceChar(head->next, key, str);
return nhead;
}
stringToList_replace 関数は文字列を受け取り、それをリンク リストに変換してから、そのリンク リストの末尾を返します。
node *stringToList_replace(char *str, node* tail)
{
node *head = malloc(sizeof(node));
int i;
if (str == NULL || strcmp(str, "") == 0)
return NULL;
for (i = 0; i < strlen(str); i++)
{
if (str[i] != '\0')
{
head->data = str[i];
if (str[i+1] != '\0')
{
head->next = malloc(sizeof(node));
head = head->next;
}
}
}
head->next = tail;
return head;
}
最後に、deleteN は、リンクされたリスト内の値 (キー) のすべてのインスタンスを見つけて削除します。
node* deleteN(node* head, char key)
{
if (head == NULL)
return NULL;
node* tail = deleteN(head->next, key);
if (head->data == key)
{
free(head);
return tail;
}
else
{
head->next = tail;
return head;
}
}
私のコードには、リンクされたリストを印刷する印刷機能もあります。私のコードの問題は、リストから値を削除してから別の値を置き換えようとすると、置き換えられた値の一部が切り取られることです。
例えば:
最初の連結リスト:
[E]->[l]->[d]->[e]->[r]->[NULL]
「e」のすべてのインスタンスを削除するために deleteN(head, e) を呼び出します。
[l]->[d]->[r]->[NULL]
replaceChar(node, r, scrolls) を呼び出して、'r' のすべてのインスタンスを 'scrolls' に置き換えます。
[l]->[d]->[r]->[o]->[l]->[l]->[s]->[NULL]
上記は次のようになります。
[l]->[d]->[s]->[c]->[r]->[o]->[l]->[l]->[s]
最初に削除せずに置換するか、単に削除するか、または削除する前に置換するだけでも、正しい出力が得られます。ただし、削除してから置き換えるたびに、出力が途切れます。何か案は?