0

次のコードは、単一の文字を含むノードを、文字列から変換されたノードのリンクされたリストに置き換えることになっています。

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]

最初に削除せずに置換するか、単に削除するか、または削除する前に置換するだけでも、正しい出力が得られます。ただし、削除してから置き換えるたびに、出力が途切れます。何か案は?

4

1 に答える 1

0

を呼び出しreplaceChar(node, r, test)て、出力を確認します。の

if (head->data == key)
    {

最初のノードをスキップします。

于 2013-07-10T21:18:45.010 に答える