数据结构——队列

队列的定义

队列是一种先进先出的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是(1,2,……,n),那么 1 就是队头元素,而 n 就是队尾元素。删除时,是从 1 开始的,插入时,列在最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后面。

队列的链式存储

队列的链式存储结构,其实就类似线性表中单链表的尾插法,我们把它简称为链队列为操作方便,我们将队头指针指向链队列的头结点,尾队列指针指向终端结点。

链队的创建

typedef struct Node         //定义一个链式队列结点结构体
{
    int date;               //结点数据
    struct Node *next;      //结点指针
}*node;                     //结点名

typedef struct Queue        //定义队列结构体
{
    node front;             //头指针
    node rear;              //尾指针
}que;                       //队列名

链队的初始化

void InitQueue(que &S)      //初始化队列
{
	S.front = S.rear = (node)malloc(sizeof(struct Node));
}

入队

void enQueue(que *S)  
{
    int i,m,n;
    printf("请输入你想要入队数据的个数");
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
	scanf("%d",&n);
	node s = (node)malloc(sizeof(struct Node));  //新建一个结点
	s -> date = n;                               //将数据赋值给date
	s -> next = NULL;                            //让结点指向空
	S->rear->next = s;                           //连接新建结点
	S->rear = s;                                 //让r指向下新建结点
    }
    S->rear->next = NULL;                            //入队完成后让其最后一个结点指向空
}

 入队时,其实就是在链表尾部插入结点如图所示:

出队

void DeQueue(que *S)  
{
    node s;                   //新建一个结点指针
    s = S->front->next;       //让s指向头结点的下一个节点
    if(s->date == NULL) 
    {
	printf("空队列\n");
	exit(0);
    }
    while(s)
    {
	printf("%d  ",s->date);
	s = s->next;	
    }
}

 出队时,就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩下一个元素时,则需将rear指向头结点如图所示:

主函数

int main()
{
    que S;          //定义结构体变量
    InitQueue(S);   //初始化队列
    enQueue(&S);    //入队
    DeQueue(&S);    //出队
    printf("\n");
    system("pause");
    return 0;
}

输出结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值