这里有两段程序,基本上是一样的。都是使用链表来实现队列。这里实现了出队和入队操作。第一段程序能够正确执行,但是第二段程序不可以,原因是rear和front总是相同的,所以输出的都是-1。我检查了一下,发现每一次rear改变会是的front同时改变。这是为什么?第一段程序通过一个结构体传递rear和front确可以,这是为什么?是通过结构体构建了二级指针吗?求大牛。。。我都快绕晕了,好几次遇到这个问题了。。。
能够正确执行的程序:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Node;
typedef struct Q
{
Node *front;
Node *rear;
}Q;
void push(Q*q, int e)
{
Node *node = (Node*)malloc(sizeof(Node)); //分配空间
node->data = e; //数据域
node->next = NULL; //指针域
q->rear->next = node; //添加到末尾
q->rear = node; //更新尾指针
}
int pop(Q* q)
{
if (q->front == q->rear)
return -1;
Node *t = q->front->next; //获取队首元素
int e = t->data; //获取队首数据域
q->front->next = t->next; //更新队首指针
if (t == q->front) //如果队首与队尾相同,则将队尾指针指向队首
q->rear = q->front;
free(t); //释放
return e; //返回队首数据域
}
int main()
{
Q queue;
queue.rear = (Node*)malloc(sizeof(Node));
queue.front = queue.rear;
push(&queue, 1);
push(&queue, 2);
push(&queue, 3);
int k = pop(&queue);
printf("%d\n", k);
k = pop(&queue);
printf("%d\n", k);
k = pop(&queue);
printf("%d\n", k);
return 0;
}
不能够正确执行的:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Node;
void push(Node* rear, int e)
{
Node *node = (Node*)malloc(sizeof(Node)); //分配空间
node->data = e; //数据域
node->next = NULL; //指针域
rear->next = node; //添加到末尾
rear = node; //更新尾指针
}
int pop(Node* rear, Node* front)
{
if (front == rear)
return -1;
Node *t = front->next; //获取队首元素
int e = t->data; //获取队首数据域
front->next = t->next; //更新队首指针
if (t == front) //如果队首与队尾相同,则将队尾指针指向队首
rear = front;
free(t); //释放
return e; //返回队首数据域
}
int main()
{
Node *rear = (Node*)malloc(sizeof(Node));
Node *front = rear;
push(rear, 1);
push(rear, 2);
push(rear, 3);
int k = pop(rear,front);
printf("%d\n", k);
k = pop(rear, front);
printf("%d\n", k);
k = pop(rear, front);
printf("%d\n", k);
return 0;
}