#include<stdio.h>
#include<stdlib.h>
#define OVERLOW -2
#define ERROR 0
#define OK 1
typedef int Status;
typedef float QElemType;
typedef struct QLNode{
QElemType data;
struct QLNode *next;
}QLNode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//創建空佇列
Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QLNode));
if(!Q.front)
{
exit(OVERLOW);
}
Q.front = NULL;
return OK;
}
//銷毀佇列
Status DestoryQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear = Q.front->next;
free(Q.rear);
Q.front = Q.rear;
}
return OK;
}
//插入元素e為Q的新的隊尾元素
Status EnQueue(LinkQueue &Q, QElemType e)
{
QueuePtr p;
printf("請輸入e的值\n");
scanf("%f", &e);
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
p->data = e;
p->next =NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
//洗掉Q的對頭元素,用e帶回
Status DeQueue(LinkQueue &Q, QElemType &e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
if(Q.front == Q.rear)
{
return ERROR;
}
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (p == Q.rear) //當洗掉最后一個元素時,尾指標可能沒有指向
{
Q.rear = Q.front;
}
free(p);
return OK;
}
//清空佇列
Status ClearQueue(LinkQueue &Q)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
while(!Q.rear)
{
p = Q.front->next;
Q.front->next = p->next;
free(p);
}
Q.rear = Q.front;
return OK;
}
//計算佇列的長度
Status QueueLength(LinkQueue Q)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
Status i = 1;
p = Q.front->next;
while(p != Q.rear)
{
p = p->next;
i++;
}
return i;
}
//用e回傳Q的頭部元素
Status GetHead(LinkQueue Q, QElemType &e)
{
if(Q.front == Q.rear)
{
return ERROR;
}
e = Q.front->next->data;
return OK;
}
//顯示佇列
Status VisitQueue(LinkQueue Q)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
p = Q.front->next;
while(p != Q.rear->next)
{
printf("%f", p->data);
p = p->next;
}
return 0;
}
int main()
{
LinkQueue Q;
QElemType e;
Status flag;
while(1)
{
printf("****************************\n");
printf("********佇列作業系統********\n");
printf("1.創建空佇列 \n");
printf("2.插入元素e為Q的新的隊尾元素\n");
printf("3.洗掉Q的對頭元素,用e帶回 \n");
printf("4.清空佇列 \n");
printf("5.計算佇列的長度 \n");
printf("6.用e回傳Q的頭部元素 \n");
printf("7.顯示佇列 \n");
printf("8.銷毀佇列 \n");
printf("請選擇功能序號:\n");
scanf("%d", &flag);
switch(flag)
{
case 1: InitQueue(Q);
break;
case 2: EnQueue(Q, e);
break;
case 3: DeQueue(Q, e);
break;
case 4: ClearQueue(Q);
break;
case 5: QueueLength(Q);
break;
case 6: GetHead(Q, e);
break;
case 7: VisitQueue(Q);
break;
case 8: DestoryQueue(Q);
break;
}//switch
}//while
return OK;
}
uj5u.com熱心網友回復:
#include<stdio.h>
#include<stdlib.h>
#define OVERLOW -2
#define ERROR 0
#define OK 1
typedef int Status;
typedef float QElemType;
typedef struct QLNode{
QElemType data;
struct QLNode *next;
}QLNode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//創建空佇列
Status InitQueue(LinkQueue &Q)
{
/*
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QLNode));
if(!Q.front)
{
exit(OVERLOW);
}
//Q.front = NULL;
Q.front->next = NULL;
*/
Q.front = Q.rear = NULL;
return OK;
}
Status ClearQueue(LinkQueue &Q);
//銷毀佇列
Status DestoryQueue(LinkQueue &Q)
{
ClearQueue(Q);
/*
while(Q.front)
{
Q.rear = Q.front->next;
free(Q.rear);
Q.front = Q.rear;
}
*/
return OK;
}
//插入元素e為Q的新的隊尾元素
Status EnQueue(LinkQueue &Q, QElemType e)
{
QueuePtr p;
printf("請輸入e的值\n");
scanf("%f", &e);
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
p->data = e;
p->next = NULL;
if (Q.rear == NULL) {
Q.rear = Q.front = p;
} else {
Q.rear->next = p;
Q.rear = p;
}
/*
p->data = e;
p->next =NULL;
Q.rear->next = p;
Q.rear = p;
*/
return OK;
}
//洗掉Q的對頭元素,用e帶回
Status DeQueue(LinkQueue &Q, QElemType &e)
{
QueuePtr p;
if (Q.front == NULL)
return ERROR;
if (Q.front == Q.rear) {
e = Q.front->data;
p = Q.front;
Q.front = Q.rear = NULL;
free(p);
return OK;
}
e = Q.front->data;
p = Q.front;
Q.front = Q.front->next;
free(p);
return OK;
/*
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
if(Q.front == Q.rear)
{
return ERROR;
}
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (p == Q.rear) //當洗掉最后一個元素時,尾指標可能沒有指向
{
Q.rear = Q.front;
}
free(p);
*/
return OK;
}
//清空佇列
Status ClearQueue(LinkQueue &Q)
{
QueuePtr p, q;
p = Q.front;
while (p) {
q = p->next;
free(p);
p = q;
}
Q.front = Q.rear = NULL;
/*
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
while(!Q.rear)
{
p = Q.front->next;
Q.front->next = p->next;
free(p);
}
Q.rear = Q.front;
*/
return OK;
}
//計算佇列的長度
Status QueueLength(LinkQueue Q)
{
QueuePtr p;
int i = 0;
p = Q.front;
while (p) {
i++;
p = p->next;
}
/*
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
Status i = 1;
p = Q.front->next;
while(p != Q.rear)
{
p = p->next;
i++;
}
*/
return i;
}
//用e回傳Q的頭部元素
Status GetHead(LinkQueue Q, QElemType &e)
{
if (!Q.front)
return ERROR;
e = Q.front->data;
/*
if(Q.front == Q.rear)
{
return ERROR;
}
e = Q.front->next->data;
*/
return OK;
}
//顯示佇列
Status VisitQueue(LinkQueue Q)
{
QueuePtr p;
p = Q.front;
while (p) {
printf("%.1f ", p->data);
p = p->next;
}
printf("\n");
/*
p = (QueuePtr)malloc(sizeof(QLNode));
if(!p)
{
exit(OVERLOW);
}
p = Q.front->next;
while(p != Q.rear->next)
{
printf("%f", p->data);
p = p->next;
}
*/
return 0;
}
int main()
{
LinkQueue Q;
QElemType e;
Status flag;
int len;
while(1)
{
printf("****************************\n");
printf("********佇列作業系統********\n");
printf("1.創建空佇列 \n");
printf("2.插入元素e為Q的新的隊尾元素\n");
printf("3.洗掉Q的對頭元素,用e帶回 \n");
printf("4.清空佇列 \n");
printf("5.計算佇列的長度 \n");
printf("6.用e回傳Q的頭部元素 \n");
printf("7.顯示佇列 \n");
printf("8.銷毀佇列 \n");
printf("請選擇功能序號:\n");
scanf("%d", &flag);
switch(flag)
{
case 1: InitQueue(Q);
break;
case 2: EnQueue(Q, e);
break;
case 3: DeQueue(Q, e);
break;
case 4: ClearQueue(Q);
break;
case 5: len = QueueLength(Q);
printf("Queue's length: %d\n", len);
break;
case 6: GetHead(Q, e);
printf("head data: %.1f\n", e);
break;
case 7: VisitQueue(Q);
break;
case 8: DestoryQueue(Q);
break;
}//switch
}//while
return OK;
}
供參考~
除了代碼問題之外,架構設計的也有點問題,初始化佇列,不應該放在選擇項里,而是放在進入回圈之前的操作;
清除佇列和銷毀佇列其實是一個意思~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271659.html
標籤:C語言
