C语言 用单链表实现队列

要复制粘贴之后直接可以编译运行的 谢谢!
2024-11-28 19:38:00
推荐回答(1个)
回答1:

网络答案,已验证:
#include
#include
struct Node
{
int data; /*值域*/
struct Node *next; /*链接指针*/
};
struct queue
{
struct Node *front; /*队首指针*/
struct Node *rear; /*队尾指针*/
};
/*初始化链队*/
void initQueue(struct queue *hq)
{
hq->front=hq->rear=NULL; /*把队首和队尾指针置空*/
}
/*向链队中插入一个元素x*/
void inQueue(struct queue *hq, int x)
{
struct Node *newNode; /*得到一个由newNode指针所指向的新结点*/
newNode=malloc(sizeof(struct Node));
if(newNode==NULL)
{
printf("内存空间分配失败! ");
exit(1);
}
newNode->data=x; /*把x的值赋给新结点的值域*/
newNode->next=NULL; /*把新结点的指针域置空*/
/*若链队为空,则新结点即是队首结点又是队尾结点*/
if(hq->rear==NULL)
{
hq->front=hq->rear=newNode;
}else
{
/*若链队非空,则依次修改队尾结点的指针域和队尾指针,使之指向新的队尾结点*/
hq->rear=hq->rear->next=newNode;
}
//return;
}
/*从队列中删除一个元素*/
int delQueue(struct queue*hq)
{
struct Node*p;
int temp;
/*若链队为空则停止运行*/
if(hq->front==NULL)
{
printf("队列为空,无法删除! ");
exit(1);
}
temp=hq->front->data;
/*暂存队首元素以便返回*/
p=hq->front;
/*暂存队首指针以便回收队尾结点*/
hq->front=p->next; /*使队首指针指向下一个结点*/
/*若删除后链队为空,则需同时使队尾指针为空*/
if(hq->front==NULL)
{
hq->rear=NULL;
}
free(p); /*回收原队首结点*/
return temp; /*返回被删除的队首元素值*/
}
/*读取队首元素*/
int peekQueue(struct queue *hq)
{ /*若链队为空则停止运行*/
if(hq->front==NULL)
{
printf("队列为空,无法删除! ");
exit(1);
}
return hq->front->data; /*返回队首元素*/
}
/*检查链队是否为空,若为空则返回1,否则返回0*/
int emptyQueue(struct queue *hq)
{
/*判断队首或队尾任一个指针是否为空即可*/
if(hq->front==NULL)
{
return 1;
}else
{
return 0;
}
}
/*清除链队中的所有元素*/
void clearQueue(struct queue *hq)
{
struct Node *p=hq->front; /*队首指针赋给p*/
/*依次删除队列中的每一个结点,最后使队首指针为空*/
while(p!=NULL)
{
hq->front=hq->front->next;
free(p);
p=hq->front;
}
/*循环结束后队首指针已经为空*/
hq->rear=NULL; /*置队尾指针为空*/
return;
}
int main(int argc,char *argv[])
{
struct queue q;
int a[8]={3,8,5,17,9,30,15,22};
int i;
initQueue(&q);
for(i=0;i<8;i++)
{
inQueue(&q,a[i]);
}
printf("delnode is %d\n",delQueue(&q));
printf("delnode is %d\n",delQueue(&q));
inQueue(&q,68);
printf("peeknode is %d\n",peekQueue(&q));
while(!emptyQueue(&q))
{
printf("%d\n",delQueue(&q));
}
clearQueue(&q);
}