链表的删除操作出现问题

链表的创建和输出函数都没问题,就是执行完删除函数后不能正常输出了,我debug了一下,发现是如果删除第二个数,那第三个数的data就会变成0x...之类的,我觉得是删除时第一个数和第二个数没连接好,但又看不出问题

void Creat(Node *h)

{

    int i,n;
    Node *p , *node;
    h->next = NULL;
    p = h;
    srand(time(0));
    printf("请输入结点数量:");
    scanf("%d",&n);
    for (i = 0; i < n; i++)
    {       
        node = (Node*)malloc(sizeof(Node));
        node->data = rand() % n;
        p->next = node;
        p = node;
    }
    p->next = NULL;

}

void Delete(Node *h) //n为被删除数据所在的位置

{

    int i,n;
    Node *p=h;
    Node *q;
    printf("请输入要删除第几个数据:");
    scanf("%d",&n);
    for (i = 1; i < n; i++)
    {
        p = p->next;
    }
    q = p;
    p->next = (q->next)->next;
    free(q->next);

}

void Print(Node *h)

{

    Node *p;
    p = h;
    printf("数据如下:");
    while (p->next != NULL)
    {
        p = p->next;
        printf("%d ",p->data);
    }
    printf("\n");

}

问题出在,free(q->next),这一句,因为,p->next = (q->next)->next;这一句执行后,实际上q->next也发生了改变,所以之后执行free(q->next),实际上也是将连接后的内容删除了

能把完整的代码发一下么?