双链表队列
2016-10-26 本文已影响18人
b6aed1af4328
#include<stdio.h>//双链表队列
#include<stdlib.h>
typedef struct Queue
{
int num;
struct Queue *pre;
struct Queue *next;
}Queue;
typedef struct pQueue
{
struct Queue *first;
struct Queue *tail;
}pQueue;
pQueue *createQueue(pQueue *queueHead)//这里需要返回值,为什么?因为地址传的
{ //是NULL。
if(queueHead==NULL)
{
queueHead=(pQueue *)malloc(sizeof(pQueue));
queueHead->first=queueHead->tail=NULL;
return queueHead;
}
return queueHead;
}
int getNum()
{
int number;
printf("请输入数据\n");
scanf("%d",&number);
return number;
}
void tailInsertData(pQueue *queueHead)
{
if(queueHead==NULL)
{
printf("队列没有创建\n");
return;
}
if(queueHead->first==NULL&&queueHead->tail==NULL)
{
Queue *p=(Queue *)malloc(sizeof(Queue));
p->pre=NULL;
p->next=NULL;
p->num=getNum();
queueHead->first=p;
queueHead->tail=p;
}
Queue *p=(Queue *)malloc(sizeof(Queue));
p->num=getNum();
queueHead->tail->next=p;
p->next=NULL;
p->pre=queueHead->tail;
queueHead->tail=p;
}
void headDeleteData(pQueue *queueHead)
{
if(queueHead==NULL)
{
printf("队列没有建立\n");
return;
}
if(queueHead->first==NULL&&queueHead->tail==NULL)
{
printf("没有数据供删除\n");
return;
}
if(queueHead->first==queueHead->tail)
{
free(queueHead->first);
queueHead->first=NULL;
queueHead->tail=NULL;
return;
}
Queue *p=queueHead->first;
queueHead->first=p->next;
p->next->pre=NULL;
free(p);
}
void printData(pQueue *queueHead)
{
Queue *p=queueHead->first;
for(;p!=NULL;p=p->next)
{
printf("[%d]<->",p->num);
}
printf("NULL\n");
}
void main()
{
pQueue *queueHead=NULL;
int select;
while(1)
{
printf("=========\n");
printf("1.创建队列\n");
printf("2.插入数据\n");
printf("3.删除数据\n");
printf("4.显示数据\n");
printf("5.退出程序\n");
scanf("%d",&select);
switch(select)
{
case 1:
queueHead=createQueue(queueHead);
break;
case 2:
tailInsertData(queueHead);
break;
case 3:
headDeleteData(queueHead);
break;
case 4:
printData(queueHead);
break;
case 5:
return;
}
}
}