队列(先进先出)

看前面的是什么类型 指针-> 普通 .
出现指针指向空报错的情况下,传参不能为空,可以传个空间的地址给他
queue->front->next==NULL;

从尾进(先进先出)

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <cstdio>
#include <cstdlib>
#include <stdlib.h>
#include <string.h>
typedef struct _NODE
{
    int index;
    char* name;
    struct _NODE* next;
}NODE;

typedef struct _QUEUE
{
    int size;
    NODE* front;
    NODE* back;
}QUEUE;

//入队
bool push_back(QUEUE* queue, NODE node);
//插入
bool insert(QUEUE* queue, int index, const char* name);
//出队
bool pop(QUEUE* queue);
//是否队空
bool empty(QUEUE queue);
//队元素数
int size(QUEUE queue);
//清空
int clear(QUEUE* queue);
//打印
void show(QUEUE* queue);

name因为在结构体中定义不是数组,因此需要开辟一块区域来承载它的内容;
如果是name[]这种类型的话就不用开辟空间;

#include "Queue.h"
// 入队
bool push_back(QUEUE* queue, NODE node)
{
    return insert(queue,node.index,node.name);
}
//插入
bool insert(QUEUE* queue, int index, const char* name)
{
    NODE*  node = (NODE*)malloc(sizeof(NODE));
    memset(node,0,sizeof(NODE));
    node->index = index;
    node->name = (char*)malloc(sizeof(char) * 8);
    memset(node->name, 0, sizeof(char) * 8);
    strcpy(node->name,name);
    if (queue->front==NULL)
    {
        queue->front = node;
        queue->back = node;
        return true;
    }
    for (NODE* p=queue->front;;p=p->next)
    {
        if (p->next==NULL)
        {
            p->next = node;
            queue->back = node;
            return true;
        }
    }
    return false;
}
//出队
bool pop(QUEUE* queue)
{
    if (queue->front != NULL)
    {
        NODE* p = queue->front;
        queue->front = queue->front->next;
        if (queue->front != NULL)
        {
            free(p->name);
            return true;
        }
        free(p);
        return true;
    }


    return false;
}
//是否队空
bool empty(QUEUE queue)
{
    if (queue.front==NULL)
    {
        printf("为空");
    }
    else
    {
        printf("不为空");
    }
    return true;
}
//队员数
int size(QUEUE queue)
{
    for (NODE* p=queue.front;p!=NULL;p=p->next )
    {
        queue.size++;       
    }
    printf("%d", queue.size);
    return queue.size;
}
//清空
int clear(QUEUE* queue)
{
    for (NODE* p=queue->front;;)
    {
        if (p == NULL)
        {
            return 1;
        }
        NODE* q = p;
        p = p->next;
        queue->front = p;
        free(q);
    }
    return 0;
}
//打印
void show(QUEUE* queue)
{
    for (NODE* p= queue->front;p!=NULL;p=p->next)
    {
        printf("%d %s\n",p->index,p->name);
    }
    return;
}

//void main()
//{
//  QUEUE i = {0};
//  NODE node = {0};
//  node.name = (char*)malloc(8);
//  node.index = 6;
//  strcpy(node.name,"张三");
//  push_back(&i,node);
//  /*insert(&i,8,"张三");
//  insert(&i,7,"李四");  
//  insert(&i, 3, "df四");*/
//  //pop(&i);  
//  //printf("%d", clear(&i));
//  show(&i);
//  //clear(&i);
//  printf("%d", clear(&i));
//  //size(i);
//  //empty(i);
//  getchar();
//}

入队的调用还有些问题,想用的方便一点的话,需要加点东西;

#include "Queue.h"
void main()
{
    QUEUE i = { 0 };
    NODE node = { 0 };
    char arr[10] = {0};
    char a; 
    int k,j=0;
    int index = 0;  
    printf("请输入插入人数");
    scanf("%d", &k);
    getchar();
    for (int j = 0; j < k; j++)
    {
        printf("请输入 学号 姓名");
        scanf("%d %s", &index, &arr);
        //gets_s(arr);
        getchar();
        node.index = index;
        insert(&i, index, arr);
        show(&i);
    }
    while(1)
    {               
        printf("请输入人数 出队 是否为空 清空  退出");
        gets_s(arr);
        if (strcmp(arr, "人数") == 0)
        {
            size(i);
        }
        if (strcmp(arr, "出队") == 0)
        {           
            pop(&i);
            show(&i);
        }
        if (strcmp(arr, "是否为空") == 0)
        {       
            empty(i);
        }
        if (strcmp(arr, "清空") == 0)
        {
            clear(&i);
            printf("%d", clear(&i));
        }
        if (strcmp(arr, "退出") == 0)
        {
            return;
        }   
        getchar();
    }
}

1._QUEUE有两个指针,一个代表头,一个代表尾,
在queue->front==NULL的时候,尾和头是指向同一个节点的;
其他情况下都是一个指头一个指尾的; 其他都差不多;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值