看前面的是什么类型 指针-> 普通 .
出现指针指向空报错的情况下,传参不能为空,可以传个空间的地址给他
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的时候,尾和头是指向同一个节点的;
其他情况下都是一个指头一个指尾的; 其他都差不多;