数据结构中的队列问题

为什么程序运行到Insert()函数中Q->rear->next = node;这一行时会报错

运行结果显示next不能存放node的地址

#include <stdio.h>
#include <stdlib.h>
typedef struct QueueNode
{
    int  Data;
    QueueNode *next;
}QueueNode;

typedef struct QueueLink
{
    QueueNode *front;
    QueueNode *rear;
    int length;
}QueueLink;

void Init(QueueLink *Q);
void Insert(QueueLink *Q);
void Delete(QueueLink *Q);
void Print(QueueLink *Q);

int main()
{
    QueueLink q;
    int i;
    printf("1. 初始化\n");
    printf("2. 入队\n");
    printf("3. 出队\n");
    printf("4. 输出\n");
    printf("请输入选项:");
    while (scanf("%d",&i)==1)
    {
        switch (i)
        {
           case 1: Init(&q);
                   printf("\n");
                   break;

           case 2: Insert(&q);
                   printf("\n");
                   break;

           case 3: Delete(&q);
                   printf("\n");
                   break;

           case 4: Print(&q);
                   printf("\n");
                   break;

           default: printf("无该选项!!!\n");
                    break;
        }
        printf("1. 初始化\n");
        printf("2. 入队\n");
        printf("3. 出队\n");
        printf("4. 输出\n");
        printf("请输入选项:");
    }
    getchar();
    getchar();
    return 0;
}

void Init(QueueLink *Q)
{    
    QueueNode *head;
    head = (QueueNode *)malloc(sizeof(QueueNode));   //head为头结点,最开始时front和rear均指向它
    Q = (QueueLink *)malloc(sizeof(QueueLink));
    Q->front = Q->rear = head;
    Q->length = 0;
    printf("初始化成功!!!\n");
}

void Insert(QueueLink *Q)
{
    int data;
    QueueNode *node;
    node = (QueueNode *)malloc(sizeof(QueueNode));
    printf("请向结点中输入数据:");
    scanf("%d",&data);
    node->Data = data;
    node->next = NULL;
    Q->rear->next = node;
    Q->rear = node;
    //Q->length++;
    printf("入队成功!!!\n");
}

void Delete(QueueLink *Q)
{
    int data;
    QueueNode *p;
    if (Q->front == Q->rear)
    {
        printf("队列为空,无可出队元素!!!\n");
    }
    else
    {
        p = Q->front->next;         //将“要出队的元素”的地址暂存在p中
        Q->front->next = p->next;   //front的next域中存放“要出队元素”的下一个元素的地址

        if ((Q->rear) == p)         //如果rear指向被删元素,说明“被删元素”是最后一个元素,此时就应让rear指向头结点
        {
            Q->front = Q->rear;
        }
        free(p);
    }   
}

void Print(QueueLink *Q)
{
    if (Q->front == Q->rear)
    {
        printf("队列为空,无可出队元素!!!\n");
    }
    else
    {
        QueueNode *p=Q->front->next;
        while (p!=NULL)
        {
            printf("%d ",p->Data);
            p = p->next;
        }
        printf("\n");
    }
}

你这个错误太多了,不只是你说的运行到你那里就会出错。我给你看了一下,一共四十一个错误,你信不信。哈哈哈。typedef struct QueueNode
{
int Data;
QueueNode *next;//首先这里的语法是不对的,你的QueueNode前面要加struct的
}QueueNode;还有其他的你自己再看看。这样的代码在vs里错误太多了,不信你自己试试。祝你学好编程,加油。

修改init()函数,注释掉下面代码:
void Init(QueueLink Q)
{

QueueNode *head;
head = (QueueNode *)malloc(sizeof(QueueNode)); //head为头结点,最开始时front和rear均指向它
// Q = (QueueLink *)malloc(sizeof(QueueLink)); /
Q由参数传入,不需要再申请内存了 */
Q->front = Q->rear = head;
Q->length = 0;
printf("初始化成功!!!\n");
}