数据结构-队列

/**************************链式队列*************************/头文件

#ifndef _LINKQUEUE_H_//链式队列
#define _LINKQUEUE_H_

typedef int datatype;

typedef struct Node
{
    union
   {
      datatype data;
      int len;
   };
   struct Node *next;
}Node;

typedef struct
{
     Node * Head;            //记录队列的头部
     Node * Tail;            //记录队列的尾部
}LinkQueue, *LinkQueuePtr;

//创建队列
LinkQueuePtr list_create();

//判空
int list_empty(LinkQueuePtr LQ);

//入队
int list_push(LinkQueuePtr LQ,datatype e);

//出队
int list_pop(LinkQueuePtr LQ);

//销毁队伍
void list_free(LinkQueuePtr LQ);
#endif
 

 主函数

#include "linkqueue.h"
#include <stdlib.h>
#include <stdio.h>

//创建队列
LinkQueuePtr list_create()
{
    //创建队列
    LinkQueuePtr LQ=(LinkQueuePtr)malloc(sizeof(LinkQueue));
    if(NULL==LQ)
    {
        printf("创建失败\n");
        return NULL;
    }
    //创建成功的话里面有两个指针
    //LQ->Head LQ->Tail 这是两个野指针
    //申请一个链表,将Head指针指向头结点
    LQ->Head=(Node *)malloc(sizeof(Node));
    if(NULL==LQ->Head)
    {
        printf("创建失败\n");
        return NULL;
    }
    //成功后需要对链表初始化
    LQ->Head->len=0;
    LQ->Head->next=NULL;

    //将尾指针指向头结点
    LQ->Tail=LQ->Head;

    printf("队列创建成功\n");
    return LQ;
}

//判空
int list_empty(LinkQueuePtr LQ)
{
    if(NULL==LQ||NULL==LQ->Head)
    {
        printf("队列不合法\n");
        return -1;
    }
    return LQ->Head==LQ->Tail;//相等则表示空
}

//入队
int list_push(LinkQueuePtr LQ,datatype e)
{
    if(NULL==LQ)
    {
        printf("队列不合法\n");
        return 0;
    }
    //1、申请结点封装数据
    Node *p=(Node*)malloc(sizeof(Node));
    if(NULL==p)
    {
        printf("入队失败\n");
        return 0;
    }
    //将数据封装到结点中
    p->data=e;
    p->next=NULL;

    //2、将新结点连接到队尾指针指向的结点后面
    LQ->Tail->next=p;
    //3、更新尾指针
    LQ->Tail=p;

    LQ->Head->len++;
    printf("入队成功\n");
    return 1;
}

//出队
int list_pop(LinkQueuePtr LQ)
{
    if(NULL==LQ||list_empty(LQ))    
    {
        printf("出队失败\n");
        return -1;
    }
    //1、标记要出队的点
    Node *p=LQ->Head->next;
    //2、孤立要删的结点
    LQ->Head->next=p->next;
    printf("%d出队成功\n",p->data);
    //3、释放要删的结点
    free(p);
    p=NULL;
    //队伍长度减
    LQ->Head->len--;

    //判断队伍是否已经删除完所有结点
    if(LQ->Head->next==NULL)
    {
        //将尾指针重新指向头结点
        LQ->Tail=LQ->Head;
    }
    return 1;
}

//销毁队伍
void list_free(LinkQueuePtr LQ)
{
    if(NULL==LQ)
    {
        printf("释放失败\n");
        return;
    }
    //1、释放整个链表
    while(!list_empty(LQ))
    {
        list_pop(LQ);
    }
    //释放头结点
    free(LQ->Head);
    LQ->Head=LQ->Tail=NULL;

    //2、释放队列
    free(LQ);
    LQ=NULL;
    printf("释放成功\n");
}

 测试文件

#include <stdlib.h>
#include <stdio.h>

int main(int argc, const char *argv[])
{
    LinkQueuePtr LQ=list_create();
    if(NULL==LQ)
    {
        return -1;
    }

    //入队函数
    list_push(LQ,1);
    list_push(LQ,2);
    list_push(LQ,3);
    list_push(LQ,4);
    list_push(LQ,5);

    //出队函数
    list_pop(LQ);
    
    //释放
    list_free(LQ);
    return 0;
}
 

 #include <myhead.h>  //输入一个数,递归输出该数的每一位
int fun(int val)
{
    if(val>=10)   //递归出口
    {
        fun(val/10);   //(n/10)使其逐渐接近(n>9)这个限制条件
    }
    printf("%d ",val%10);
}
//主函数
int main(int argc, const char *argv[])
{
    int val;
    printf("请输入一个整数:");
    scanf("%d",&val);
    fun(val);
    putchar(10);
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值