user-0 提问: 数据结构中队列问题

回复:
user: user-1
content: #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均指向它     if (!head)         return;     //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));     if (!node)         return;     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");         return;     }     //else    // {         p = Q->front->next;         //将“要出队的元素”的地址暂存在p中         Q->front->next = p->next;   //front的next域中存放“要出队元素”的下一个元素的地址         if (!Q->front->next)             Q->rear = Q->front; /*         if ((Q->rear) == p)         //如果rear指向被删元素，说明“被删元素”是最后一个元素，此时就应让rear指向头结点         {             Q->front = Q->rear;         }         */         free(p);     //} }  void Print(QueueLink *Q) {     if (Q->front == Q->rear)     {         //printf("队列为空，无可出队元素！！！\n");         printf("队列为空，无可输出元素！！！\n");         return;     }     //else     //{         QueueNode *p = Q->front->next;         while (p != NULL)         {             printf("%d ", p->Data);             p = p->next;         }         printf("\n");     //} } 供参考～  初始化队列里，没有搞明白p吧，楼主输入的实参是&p，因此在初始化函数里不能将其认为是没有申请空间的指针。这个指针是指向栈上上有效空间； 问题就在Init函数里。  另外，建议把队列初始化作为必做的一项，不要放在用户的可选菜单里，如果用户不先选择1，就选择2或者其他，程序是不是就异常退出了呢？ 所以，程序设计需要考虑多种情况～

user: user-2
content: 谢邀。  首先需要明确，成员选择运算符 -> 要求两个操作数，左操作数必须是指向结构、联合类型的指针；右操作数必须是成员的名字。成员选择运算符 -> 用来得到那个指定的成员，而且是一个左值。  再来看你的表达式Q->rear->next = node  在这里，Q的类型是指向结构类型QueueLink的指针，所以Q->rear得到Q所指向的那个结构变量的成员变量rear。  同理，Q->rear->next得到Q->rear所指向的那个结构变量的成员变量next。  成员变量next的类型是指向QueueNode的指针。node的类型也是指向QueueNode的指针。赋值是允许的。  因此，问题不是出在Q->rear->next = node，而是因为变量q的rear成员不存在。

user: user-2
content: 补充一句，是因为变量q的rear成员所指向的结构变量不存在。