#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}QNode;
typedef struct link{
QNode *front,*rear;
}LinQueue;
LinQueue *initQueue(){
QNode *q=(QNode *)malloc(sizeof (struct node));//为链表的头节点申请存储空间
LinQueue *p=(LinQueue *)malloc (sizeof (struct link));//申请指向头节点的指向队尾很对首的指针
q->next=NULL;//初始化头节点
p->front=p->rear=q;//让头首和尾指向头节点
return p;//返回指针
}
void addQueue(LinQueue *q,int x){
QNode *p=(QNode *)malloc(sizeof (struct node));//创建一个新的链表
p->data=x;//为该节点赋值
p->next=NULL;//最后一个指向null
q->rear->next=p;//将p链接到raer的后继节点
q->rear=p;//让rear指向最后一个节点
}
void delQueue(LinQueue *q,int *x){
QNode *p;
if(q->front==q->rear){//如果两个指针指向的相同代表链表为空
printf("什么都没有你要删个串串!!!!!!!!!!!");
return 0;
}
p=q->front->next;//将当前的节点得到
q->front->next=p->next;//把当前节点删除
*x=p->data;//得到当前节点的值
free(p);//释放掉当前的空间
if(q->front->next==NULL){//当链表已经是个空的时候
q->rear=q->front;//让链的头和尾指向头节点
printf("已经被删干净了没什么东西了,给点面子好不好!");
}
}
/**
2、编写队列管理的模拟算法,队列管理的模拟算法采用如下管理模式:
(1)队列初始化为空队列
(2)当键盘输入奇数时,奇数入队列
(3)当键盘输入偶数时,队头出队列
(4)当键盘输入0时,退出算法
(5)每当键盘输入一个整数时,显示操作后队列中的值
**/
void demo(){
int x;
LinQueue *q=initQueue();//数据的初始化
QNode *p;
scanf("%d",&x);//录入用户输入的值
while(x!=0){
if(x%2){//奇数入栈,偶数输出
addQueue(q,x);//创建链表
}else{
delQueue(q,&x);//删除链表并保存x的值,好像x的值返回也没什么用啊??
}
p=q->front->next;//记录当前的节点
// if(p==NULL){
// printf("什么都没有你要删个串串!!!!!!!!!!!\n");
// scanf("%d",&x);
// continue;
// }
while(p){
printf("这里的输出是:%d\t",p->data);//输出当前节点的值
p=p->next;//指向下一个节点
}
printf("\n");
scanf("%d",&x);//录入之后用户存储的数据
}
}
int main(){
demo();//测试第一个
}
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}QNode;
typedef struct link{
QNode *front,*rear;
}LinQueue;
LinQueue *initQueue(){
QNode *q=(QNode *)malloc(sizeof (struct node));//为链表的头节点申请存储空间
LinQueue *p=(LinQueue *)malloc (sizeof (struct link));//申请指向头节点的指向队尾很对首的指针
q->next=NULL;//初始化头节点
p->front=p->rear=q;//让头首和尾指向头节点
return p;//返回指针
}
void addQueue(LinQueue *q,int x){
QNode *p=(QNode *)malloc(sizeof (struct node));//创建一个新的链表
p->data=x;//为该节点赋值
p->next=NULL;//最后一个指向null
q->rear->next=p;//将p链接到raer的后继节点
q->rear=p;//让rear指向最后一个节点
}
void delQueue(LinQueue *q,int *x){
QNode *p;
if(q->front==q->rear){//如果两个指针指向的相同代表链表为空
printf("什么都没有你要删个串串!!!!!!!!!!!");
return 0;
}
p=q->front->next;//将当前的节点得到
q->front->next=p->next;//把当前节点删除
*x=p->data;//得到当前节点的值
free(p);//释放掉当前的空间
if(q->front->next==NULL){//当链表已经是个空的时候
q->rear=q->front;//让链的头和尾指向头节点
printf("已经被删干净了没什么东西了,给点面子好不好!");
}
}
/**
2、编写队列管理的模拟算法,队列管理的模拟算法采用如下管理模式:
(1)队列初始化为空队列
(2)当键盘输入奇数时,奇数入队列
(3)当键盘输入偶数时,队头出队列
(4)当键盘输入0时,退出算法
(5)每当键盘输入一个整数时,显示操作后队列中的值
**/
void demo(){
int x;
LinQueue *q=initQueue();//数据的初始化
QNode *p;
scanf("%d",&x);//录入用户输入的值
while(x!=0){
if(x%2){//奇数入栈,偶数输出
addQueue(q,x);//创建链表
}else{
delQueue(q,&x);//删除链表并保存x的值,好像x的值返回也没什么用啊??
}
p=q->front->next;//记录当前的节点
// if(p==NULL){
// printf("什么都没有你要删个串串!!!!!!!!!!!\n");
// scanf("%d",&x);
// continue;
// }
while(p){
printf("这里的输出是:%d\t",p->data);//输出当前节点的值
p=p->next;//指向下一个节点
}
printf("\n");
scanf("%d",&x);//录入之后用户存储的数据
}
}
int main(){
demo();//测试第一个
}