Вставить копию узла в список (с условием) - PullRequest
0 голосов
/ 18 июня 2019

В упражнении предлагается вставить копию значения x (которое также является значением для поиска в списке), но только если позиция кратна другому значению n.Не указано, должна ли копия быть вставлена ​​до или после значения x.

Моя проблема заключается в том, что копия вставляется не во всех случаях.Я думаю, проблема в том, что когда я вставляю новый узел, счетчик позиций списка также считает это новое значение, сообщая о неверном результате.

Как я могу решить проблему?Или я ошибаюсь?

Я учусь.возможно, моя попытка совершенно неверна, и по этой причине я прошу хотя бы достойное объяснение, чтобы я мог улучшить.

мой код:

    struct data
{
    int d;
    struct data *next;
};

typedef struct data Node;

Node *newnode(void)
{
    return malloc(sizeof(Node));
}

Node *creat_list()
{
    Node *lis, *p, *last;
    int x;

    printf("\n insert data: ");
    scanf("%d", &x);

    if(x <= 0)
    {
        lis = NULL;
    }
    else
    {
        last = newnode();

        lis = last;
        last->d = x;
        last->next = NULL;

        printf(" insert data: ");
        scanf("%d", &x);

        while(x > 0)
        {
            p = newnode();
            p->d = x;
            p->next = NULL;
            last->next = p;
            last = p;
            printf(" insert data: ");
            scanf("%d", &x);

        }
    }
    return (lis);
}

void print_list(Node *lis)
{
    printf("\n List: \n");
    printf(" -> ");

    while(lis != NULL)
    {
        printf("%d", lis->d);
        printf(" -> ");
        lis = lis->next;
    }
    printf("NULL\n\n");
}

void insertCopy(int x, int n, Node **lis)
{
    int pos = 1;

    Node *p, *head;

    head = *lis;


    if ((head->d == x) && (pos % n == 0))
    {
            p = newnode();
            p->d = x;
            p->next = head;
            *lis = p;
    }

    if (head->next != NULL)
    {
        pos = 2;

        while(head->next != NULL)
        {
            if ((head->next->d == x) && (pos % n == 0))
            {
                p = newnode();
                p->d = x;
                p->next = head->next;
                head->next = p;
            }
            else
            {
                head = head->next;
            }
            pos++;
        }
    }
}

int main(void)
{   
    Node *l1;

    int x = 1;
    int n = 3;

    l1 = creat_list();

    print_list(l1);

    insertCopy(x, n, &l1);

    print_list(l1);

    return 0;
}

Пример:

Ввод:

2 3 1 6 1 2 2 6 1 5 0

дает

Список:

2->3->1->6->1->2->2->6->1->5->NULL

С

x = 1, n = 3;

Ожидаемый результат:

2->3->1->1->6->1->2->2->6->1->1->5->NULL

Мой вывод:

2->3->1->1->6->1->2->2->6->1->5->NULL

1 Ответ

0 голосов
/ 18 июня 2019

В вашем коде больше проблем, но та, которую вы запрашиваете (в соответствии с вашим примером), состоит в том, что вы получаете только один дополнительный узел, в то время как вы ожидали два дополнительных узла.

Ожидается:

2->3->1->1->6->1->2->2->6->1->1->5->NULL

Факт:

2->3->1->1->6->1->2->2->6->1->5->NULL
                           ^^^
                        A node is missing here

Проблема заключается в способе обработки head при вставке дополнительного узла.

Попробуйте изменить это:

        if ((head->next->d == x) && (pos % n == 0))
        {
            p = newnode();
            p->d = x;
            p->next = head->next;
            head->next = p;
        }

в

        if ((head->next->d == x) && (pos % n == 0))
        {
            p = newnode();
            p->d = x;
            p->next = head->next;
            head->next = p;
            head=p->next;       // Add this line
        }

Проблема с вашим исходным кодом заключалась в том, что вы не правильно двигали head.Поэтому счетчик pos не синхронизирован с исходным списком.

...