数据结构-------------链队的定义以及基本操作的实现

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

typedef int ElemType;

/*                    链式队列节点结构体定义                                    */
typedef struct LinkNode{
    ElemType data;
    struct LinkNode *next;
}LinkNode;

/*                    链式队列结构体定义                                    */
typedef struct{
    LinkNode *front;
    LinkNode *rear;
}LinkQueue;

/*                    初始化操作                                    */
void init(LinkQueue *Queue)
{
    //初始时front、rear都指向头节点
    Queue->front = (LinkNode *)malloc(sizeof(LinkNode));
    Queue->rear = Queue->front;
    Queue->front->next = NULL;
}

/*                    销毁操作                                    */
void destory(LinkQueue *Queue)
{
   LinkNode *now = Queue->front->next;
   LinkNode *temp = NULL;

   while (now != NULL)//循环释放所有指针,now表示当前节点,temp用于临时保存节点并进行释放
   {
       temp = now;
       now = now->next;
       free(temp);
   }
    //将front、rear指针释放
   free(Queue->front);
   Queue->rear = NULL;
}

/*                    输出操作                                    */
void display(LinkQueue Queue)
{
    if (Queue.front->next == NULL)//空队
    {
        printf("链队为空,不允许进行输出操作");
        return;
    }
    
    int i = 1;
    LinkNode *p = Queue.front->next;
    while (p != NULL)
    {
        printf("Queue[%d] = %d\n",i,p->data);
        p = p->next;
        i++;
    }

}

/*                    入队操作                                    */
int push(LinkQueue *Queue,int x)//队尾入队
{
    LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
    if (p == NULL)
        return -1; //空间分配失败
    p->data = x;
    p->next = NULL;//将新节点的next指针置空
    
    if (Queue->front->next == NULL)//队列为空
    {
        Queue->front->next = p;
    }else{
        Queue->rear->next  = p;
    }
    Queue->rear = p;
    return 1;
}

/*                    出队操作                                    */
int pop(LinkQueue *Queue,int *popNum)//队头出队
{
    if (Queue->front->next == NULL)
        return -1;//链队为空
    LinkNode *p = Queue->front->next;
    *popNum = p->data;
    Queue->front->next = p->next;
    if (Queue->rear == p) //最后一个节点则需要更新尾指针
        Queue->rear = Queue->front;//尾指针指回头节点
    free(p);
    return 1;
}

/*                    取队头元素操作                                    */
int peek(LinkQueue Queue,int *peekNum)
{
    if (Queue.front->next == NULL)
        return -1;//链队为空
    *peekNum = Queue.front->next->data;
    return 1;
}

/*                    判空操作                                    */
int isempty(LinkQueue Queue)
{
    if (Queue.front == Queue.rear)
        return 1;//链队为空
    else
        return -1;//链队非空
}

/*                    主函数                                    */
int main()
{
    LinkQueue Queue;
    init(&Queue);

    //循环控制变量
    int flag = 1;
    

    while (flag != -1)
    {
        printf("\n");
        printf("**************************请选择你的操作**************************\n");
        printf("1.元素入队\n");
        printf("2.元素出队\n");
        printf("3.取队头元素\n");
        printf("4.判断队列是否为空\n");
        printf("5.输出队列元素\n");
        printf("6.销毁队列\n");
        printf("7.退出\n");
        printf("\n");
        printf("*****************************************************************\n");

        int a = 0;
        scanf("%d",&a);//switch选择器

        //入队操作所需参数
        int x;
        int pushflag;
        //出队操作所需参数
        int popNum;
        int popflag;
        //取队头元素操作所需参数
        int peekNum;
        int peekflag;
        //判断链队是否为空操作所需参数
        int isemptyflag;
        switch (a)
        {
        case 1: printf("请输入你想要入队的元素值:");
                scanf("%d",&x);
                pushflag = push(&Queue,x);
                if (pushflag == -1)
                    printf("入队失败请重试\n");
                else
                    printf("元素入队成功\n");
            break;
        case 2: popflag = pop(&Queue,&popNum);
                if (popflag == -1)
                    printf("链队为空,禁止出队!\n");
                else
                    printf("出队成功!出队的元素为:%d\n",popNum);
            break;
        case 3: peekflag = peek(Queue,&peekNum);
                if (peekflag == -1)
                    printf("链队为空,禁止取队头元素!\n");
                else
                    printf("取队头元素成功,队头元素值为:%d",peekNum);
            break;
        case 4: isemptyflag = isempty(Queue);
                if (isemptyflag == 1)
                    printf("链队为空");
                else
                    printf("链队非空");
            break;;
        case 5: display(Queue);break;
        case 6: destory(&Queue);break;
        case 7: flag = -1;break;
        default:flag = -1;
            break;
        }
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值