#include <stdlib.h>
typedef int datatype;
/* 定义节点存储入队元素和指向下一节点的指针 */
typedef struct node{
datatype data;
struct node *next;
}
NODE;
/* 定义节点存放队尾和对首指针 */
typedef struct poiner{
NODE *front;
NODE *rear;
}
Linknode;
/* 创建队列以及初始化函数 */
void created(Linknode *H);
/* 入队函数 */
void enqueue(Linknode *H, int data);
-----------------------------------------------------------------------
#include <stdio.h>
#include "queue.h"
/***********************************************************************
* 队列:只允许在一端进行插入,而在另一端进行删除操作的线性表
* FIFO(First In First Out)允许插入的一端为队尾 允许删除的一端为队头
* 链式队列其实就是单链表只能尾进头出
***********************************************************************/
/* 创建队列以及初始化函数 */
void created(Linknode *H)
{
/* 定义节点并初始化 */
NODE *M;
M = (NODE *)malloc(sizeof(NODE));
if (M == NULL)
{
printf("创建队列中malloc失败\n");
return;
}
M->next = NULL;
/* 让队尾队首指向头节点 */
H->front = M;
H->rear = M;
return;
}
/* 入队函数 */
void enqueue(Linknode *H, int data)
{
NODE *P;
P = (NODE *)malloc(sizeof(NODE));
if (P == NULL)
{
printf("入队函数申请内存失败\n");
return;
}
P->data = data;
P->next = NULL;
H->rear->next = P;/* 让新节点挂在队尾 */
H->rear = P;/* 队尾指向P节点 */
printf("%d入队成功\n",data);
return;
}
/* 出队函数 */
datatype dequeue(Linknode *H)
{
NODE *M;
int x;
M = (NODE *)malloc(sizeof(NODE));
if (M == NULL)
{
printf("出队函数malloc失败\n");
return -1;
}
if (H->front == H->rear)
{
printf("队列为空\n");
x = 0;
}
else
{
M = H->front->next;/* 保存第一个节点 */
H->front->next = M->next;/* 指向出队元素后面的节点 */
if (M->next == NULL)
{
H->rear = H->front;
}
x = M->data;
free(M);
M = NULL;
}
return x;
}
/* 显示队列中元素 */
void display
(Linknode H)
{
NODE *M;
M = (NODE *)malloc(sizeof(NODE));
M = H.front->next; /* 指向第一个数据元素节点 */
while(M != NULL)
{
printf("data = %d\n",M->data);
M = M->next;/* 指向下一个节点 */
}
printf("显示结束\n");
return;
}
----------------------------------------------------------------------------------
#include <stdio.h>
#include "queue.h"
int main(int argc, char *argv[])
{
int comand;
Linknode *H;
int num;
int value;
int i;
H =(Linknode *)malloc(sizeof(Linknode));
if (H == NULL)
{
printf("malloc failed\n");
return -1;
}
do{
printf("\n");
printf(" 1 创建队列\n");
printf(" 2 向队列插入元素\n");
printf(" 3 从队列删除元素\n");
printf(" 4 显示队列中元素\n");
printf(" 5 退出\n");
printf("-------------------------------\n");
printf("请输入对应操作的数字(1 2 3 4 5)\n");
scanf("%d", &comand);
switch (comand)
{
case 1:
created(H);
printf("请输入你要创建元素的个数:\n");
scanf("%d", &num);
for (i = 1; i <= num; i++ )
{
scanf("%d",&value);
enqueue(H, value);
}
break;
case 2:
puts("输入你想要插入的元素:\n");
scanf("%d", &value);
enqueue(H, value);
break;
case 3:
printf("outqueue-data:%d\n",dequeue(H));
break;
case 4:
displa
y(*H);
break;
case 5:
printf("正在退出....\n");
return 0;
default:
printf("请检查你的输入是否有误\n");
return -1;
}
}while(1);
return 0;
}
--------------------------------------------------------------------------------------
linux@ubuntu:~/haitao/squeue_linklist_队列$ ./test
1 创建队列
2 向队列插入元素
3 从队列删除元素
4 显示队列中元素
5 退出
-------------------------------
请输入对应操作的数字(1 2 3 4 5)
1
请输入你要创建元素的个数:
3
1
1入队成功
2
2入队成功
3
3入队成功
1 创建队列
2 向队列插入元素
3 从队列删除元素
4 显示队列中元素
5 退出
-------------------------------
请输入对应操作的数字(1 2 3 4 5)
3
outqueue-data:1
1 创建队列
2 向队列插入元素
3 从队列删除元素
4 显示队列中元素
5 退出
-------------------------------
请输入对应操作的数字(1 2 3 4 5)
4
data = 2
data = 3
显示结束
1 创建队列
2 向队列插入元素
3 从队列删除元素
4 显示队列中元素
5 退出
-------------------------------
请输入对应操作的数字(1 2 3 4 5)
5
正在退出....