#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int QElemType;
队列///
//队列:一种先进先出的线性表
//特点:先进先出,只允许在一端插入,另一端删除
//在队头删除,队尾插入
/链队列
//用链表表示的队列
//一个链队列要有一个头节点和一个尾节点才能表示
//为了方便初始化链队列我们也可以创建一个头节点
/下面是链队列的插入与删除,初始化///
typedef struct QNode {
QElemType data;
QNode* next;
}QNode, *QueuePtr;
//定义链队列结构体
typedef struct My {
QNode* start;
QNode* tail;
}LinkQueue;
//初始化
Status InitQueue(LinkQueue &Q)
{
//为队列添加一个头节点
Q.start = (QNode*)malloc(sizeof(QNode));
Q.tail = Q.start;
if (!Q.start) return(OVERFLOW);
Q.start->next = NULL;
return OK;
}
//插入
Status EnQueue(LinkQueue &Q, QElemType e)
{
//在开辟一个QNode类型的数据,并让队尾指针指向新插入的元素
QNode* q;
q = (QNode*)malloc(sizeof(QNode));
Q.tail->next = q;
//队尾指向新插入的元素
Q.tail = q;
q->data = e;
Q.tail->next = NULL;
return OK;
}
//删除
Status DeQueue(LinkQueue &Q, QElemType &e)
{
if (!Q.start->next) {
printf("这是最后一个元素确定要删吗");
return OVERFLOW;
}
//定义一个指针保存队列的第一个元素
QNode* p;
p = Q.start->next;
//删除头元素
//将头指针指向的元素删除,就是让头指针指向下一个元素
Q.start->next = p->next;
e = p->data;
return OK;
}
//附加题:依次遍历从队头到队尾的元素,并利用printf()函数打印输出访问的元//素值。
void QueueTraverse(LinkQueue Q)
{
QNode* q = Q.start;
while (q->next != NULL) {
q = q->next;
printf("%d\t",q->data);
}
}
int main()
{
int e;
LinkQueue Q;
InitQueue(Q);
for (int i = 0; i < 6; i++) {
EnQueue(Q, i+1);
}
/*for (int i = 0; i < 7; i++) {
DeQueue(Q,e);
printf("%d\t", e);
}*/
QueueTraverse(Q);
return 0;
}
首先,链队列的增删改查的函数实现是相对比较简单的,只要你明白链队列的操作是头指针与尾指针的操作就行。
我在进行链队列的函数实现是因为忽略了头节点,导致错误。
队列的知识点在代码中。😃 [:)]