数据结构算法题(假设以带头结点的循环链表表示队列,
并且只设一个指针指向队尾元素结点(注意不设头指针)
试编写相应的队列初始化,入队列和出队列的算法!)
/* 数据结构算法题(假设以带头结点的循环链表表示队列,
* 并且只设一个指针指向队尾元素结点(注意不设头指针)
* 试编写相应的队列初始化,入队列和出队列的算法!)
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
typedef int QElemType;
typedef int Status;
typedef struct QNode
{
QElemType data;
struct QNode * rear;
struct QNode * next;
}QNode,*LinkQueue;
//链式队列的初始化
Status InitLinkQueue(LinkQueue * L)
{
(*L)=(LinkQueue)malloc(sizeof(QNode));
if((*L)==NULL)
{
printf("内存分配失败!\n");
return OK;
}
(*L)->rear=(*L);
return OK;
}
//链式队列的建立
Status Create(LinkQueue * L,int n)
{
srand(time(0));
LinkQueue P;
for(int i=0;i<n;i++)
{
P=(LinkQueue)malloc(sizeof(QNode));
P->data=rand()%100+1;
(*L)->rear->next=P;
(*L)->rear=P;
}
P->next=(*L);
return OK;
}
//入队操作
Status EnQueue(LinkQueue * L,QElemType e)
{
LinkQueue P;
P=(LinkQueue)malloc(sizeof(QNode));
P->data=e;
P->next=(*L);
(*L)->rear->next=P;
(*L)->rear=P;
return OK;
}
//出队操作
Status DeQueue(LinkQueue * L,QElemType * e)
{
LinkQueue temp;
*e=(*L)->next->data;
temp=(*L)->next;
(*L)->next=(*L)->next->next;
delete(temp);
return OK;
}
//输出
void Print(LinkQueue * L)
{
LinkQueue P;
P=(*L)->next;
printf("输出元素:\n");
while(P!=(*L))
{
printf("%d ",P->data);
P=P->next;
}
printf("\n");
}
int main()
{
LinkQueue L;
int ElemNumber;
QElemType EnElem,DeElem;
InitLinkQueue(&L);
printf("请输入元素个数:\n");
scanf("%d",&ElemNumber);
Create(&L,ElemNumber);
Print(&L);
printf("请输入入队元素:\n");
scanf("%d",&EnElem);
EnQueue(&L,EnElem);
Print(&L);
printf("出队操作,并返回出队元素:\n");
DeQueue(&L,&DeElem);
printf("出队元素为:%d\n",DeElem);
Print(&L);
return 0;
}