Односвязаный список

не могу понять где допустил ошибку при имплементации односвязного списка.

Для входящих данных:

2 -> количество итераций
3 1 2 0 (3 это сколько операций в данной итерации )
14 1 0 1 1 2 0 2 0 2 0 1 2 0 0

По заданию если код операции "0", нужно удалить первый елемент и выписать цифру.

Если код(k) операции больше 0, тогда нужно сделать новый узел с ключом k и вставить на k место.

Т.е для тех данных я должен получить такой ответ:

1
1 1 2 2 1 2

Ответ моей программы:

1
1 1 2 1 1 2

Мой код довольно тривиален:

Сама структура списка:

typedef struct list{
    int data;
    struct list * next;
}tList;



tList * init(int x)
{
    tList *lst = (struct list*)malloc(sizeof(struct list));
    lst->data = x;
    lst->next = NULL;
    return(lst);
}

Добавленния элемента

void  push(int x, tList **head) {
    tList *tmp = (tList*) malloc(sizeof(tList));
    tmp->data = x;
    tmp->next = (*head);
    (*head) = tmp;

}

Добавленния на позицию Н:

void push_n_pos(int n, tList *head) {
    tList *tmp = NULL;

    int count = 0;

    while (count < n && head->next) {
        head = head->next;
        count++;
    }

    tmp = (tList*) malloc(sizeof(tList));

    tmp->data = n;
    if(head->next) {
        tmp->next = head->next;
    } else {
        tmp->next = NULL;
    }
    head->next = tmp;
}

Получения первого элемента:

int pop(tList **head) {
    tList  *prev = NULL;
    int val;

    prev = (*head);
    val = prev->data;
    (*head) = (*head)->next;
    free(prev);
    return val;
}

Реализация:

int main() {
    int operation;
    tList *head = NULL;
    cin >> operation;


    while (operation--) {
        int x;
        cin >> x;
        while (x--) {
            int z;
            cin >> z;
            if (z > 0) {
                if (z == 1) {
                    push(z, &head);
                } else
                    push_n_pos(z, head);
            } else if (z == 0) {
                cout << pop(&head) << " ";
            }
        }
            free(head);
            cout << "\n";
    }

    return 0;
}

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


Ответы (1 шт):

Автор решения: Павел Ериков

Как и ожидалось ошибка в вашей функции push_n_pos.

Например сейчас мы на 1 0 1 1 2 и все что вывелось, это 1, а в данный момент список у вас 1 1 и вы хотите добавить 2. Чтобы получить вывод 1 1 2 вам нужно вставить двойку таким образом 1 2 1 то есть, чтобы она находилась под индексом n - 1 => 1, то есть после первого элемента.

Так что вам в первом цикле, нужно при n == 2, чтобы head указывал на первый элемент, по этому нужно писать так:

while (count < n - 2 && head->next)

Я тестировал на c++ (т.к. вы используете cin и cout) и выход у меня такой, как у вас в примере.

→ Ссылка