Q:

Продублировать все элементы в списке

Есть такая задача, продублировать все элементы в динамической структуре, если точнее то списке.  Подскажите,что я делаю не так и если не сложно то как поправить функцию dubl если проблема в ней, спасибо заранее. 
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<windows.h>

typedef struct list {
    int value;
    struct list* next;
} list;

void add(list** head, int item) {
    list* new_item =
        (list*)malloc(sizeof(list));
    new_item->value = item;
    new_item->next = (*head);
    (*head) = new_item;
}

void dubl(list* head) {
    if (! head)
        return;

    list* new_item, * temp = head;
    while (temp) {
        new_item = (list*)malloc(sizeof(list));
        new_item->value = temp->value;
        new_item->next = temp->next;
        temp->next = new_item;
        temp = temp->next->next;
    }
}

void print(list* head) {
    while (head) {
        printf("%d->", head->value);
        head = head->next;
    }
    printf("Конец\n");
}

void main() {
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    list* head = NULL;
    int key, item;
    printf("Заполните список:");
    do {
        printf("\nЭлемент: ");
        scanf("%d", &item);
        add(&head, item);
        dubl(head);
        printf("\nХотите ввести еще?(0/1):");
        scanf("%d", &key);
        if (key == 0)
            break;
    } while (key ! = 0);

    printf("\nПолученный список:\n");
    print(head);
    system("pause");
}

При работе например с входными данными 2 1 программа выводит
1->1->2->2->2->2->Конец

т.е.  корректно копирует только первые два элемента. 

A:

Вся проблема в Вашем цикле в main.  Функция add добавляет значение в начало, но функция dubl, в каждой итерации, делает дубликаты всех елементов списка.  Получается что Вы ввели 2, функция add добавила 2 в список.  После этого dubl делает дубликат и список имеет вид 2->2.  Потом Вы вводите 1, функция add добавляет значение в список, который после этого имеет вид 1->2->2, а dubl делает дубликаты всех елементов, и получается что после этого список имеет вид 1->1->2->2->2->2.  Что бы всё работало правильно, нужно делать дубликаты после заполнения списка.  Просто вызывайте dubl после цикла, а не в нём.