user-0 提问: 用c语言写的一个银行排队问题，有几个问题自己不能解决，求教

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 9 楼 冷风1023 的回复：2、 ElementType DeleteQ(Queue Q，ElementType * E_next);  这个错了，应该是int DeleteQ(Queue Q，ElementType * E_next);问题差不多解决了，可以帮我测试一下程序吗，去除了一下东西，如果可以帮忙我把代码发出来

user: user-2
content: 2、 ElementType DeleteQ(Queue Q，ElementType * E_next);  这个错了，应该是int DeleteQ(Queue Q，ElementType * E_next);

user: user-2
content: 你这有两种方法修改，一种是返回指针，通过判断指针来确认成功失败，成功就返回指向元素的指针，失败返回NULL，另外一种方法返回int，成功返回0，失败返回-1，可以增加一个指针参数，通过这个指针来返回出下一个元素。 1、 ElementType * DeleteQ(Queue Q); ElementType * E_next = DeleteQ(Queue Q); if(E_next ) {} else {}  2、 ElementType DeleteQ(Queue Q，ElementType * E_next);

user: user-0
content: 引用 6 楼 冷风1023 的回复：[quote=引用 4 楼 Crival 的回复:] 可是error又是必要的条件，又该怎么样改才可以正确返回error 函数的返回值只能是一种，通常队列的增加和删除操作的返回值只有成功失败，也就是0和-1，不要返回元素类型，如果你是取元素值操作才返回元素类型，这只是我人个建议。[/quote]那么在c中error怎么返回

user: user-2
content: 引用 4 楼 Crival 的回复:可是error又是必要的条件，又该怎么样改才可以正确返回error 函数的返回值只能是一种，通常队列的增加和删除操作的返回值只有成功失败，也就是0和-1，不要返回元素类型，如果你是取元素值操作才返回元素类型，这只是我人个建议。

user: user-0
content: 引用 3 楼 冷风1023 的回复：ElementType DeleteQ(Queue Q) { if ( IsEmpty(Q) ) { printf("队列空"); return ERROR; } else  { Q->Front =(Q->Front+1)%Q->MaxSize; return  Q->Data[Q->Front]; } } return ERROR; 这里的ERROR你定义的是的-1，但返回值是ElementTypeerror是必要的条件，该怎么修改才可以正确返回

user: user-0
content: 可是error又是必要的条件，又该怎么样改才可以正确返回error

user: user-2
content: ElementType DeleteQ(Queue Q) { if ( IsEmpty(Q) ) { printf("队列空"); return ERROR; } else  { Q->Front =(Q->Front+1)%Q->MaxSize; return  Q->Data[Q->Front]; } } return ERROR; 这里的ERROR你定义的是的-1，但返回值是ElementType

user: user-0
content: 引用 1 楼 冷风1023 的回复：typedef int ElementType; typedef struct People ElementType; 这里定义两个ElementType那么如何解决delete(q)中的错误呢？

user: user-2
content: typedef int ElementType; typedef struct People ElementType; 这里定义两个ElementType

user: user-0
content: 救救孩子吧，没错误了但是得不出结果，求大神们帮忙测试一下程序 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>  typedef int Status;  typedef struct People ElementType; struct People{ int T; int P; };  typedef int Position; struct QNode{ ElementType *Data; Position Front, Rear; int MaxSize; }; typedef struct QNode*Queue; Queue CreateQueue(int MaxSize){ Queue Q=(Queue)malloc(sizeof(struct QNode)); Q->Data=(ElementType*)malloc(MaxSize*sizeof(ElementType)); Q->Front=Q->Rear=0; Q->MaxSize=MaxSize; return 0; } bool IsFull(Queue Q) { return((Q->Rear+1)%Q->MaxSize==Q->Front); } bool AddQ(Queue Q,ElementType X) { if(IsFull(Q)){ printf("full"); return false; } else{ Q->Rear=(Q->Rear+1)%Q->MaxSize; Q->Data[Q->Rear]=X; return true; } } bool IsEmpty(Queue Q) { return(Q->Front==Q->Rear); } ElementType DeleteQ(Queue Q) { if ( IsEmpty(Q) ) { printf("队列空"); } else  { Q->Front =(Q->Front+1)%Q->MaxSize; return  Q->Data[Q->Front]; } }  int FindNextWindow(int W[], int K, int *WaitTime) {//给定K个窗口W[]的状态，返回下一个空闲窗口的位置以及在相邻两次窗口之间所等待的时间waittime int WinAvail;//下一个空闲窗口的位置 int MaxProc; int MinW=MaxProc+1;//最短事务处理时间，初始化超过最大值 int i; for(i=0;i<K;i++)//扫描每个窗口，找到最短事务 if(W[i]<MinW) { MinW=W[i]; WinAvail=i; } *WaitTime=MinW;//最短事务处理时间就是两次空窗间的等待时间 for(i=0;i<K;i++)//刷新所有窗口的事务处理状态 W[i]-=MinW; return WinAvail;//返回下一个空闲窗口的位置 } double QueueingAtBank(Queue Q, int N) { struct People Next;//下一位顾客 int K;//窗口个数 int MaxWindow; int TotalTime;//全体顾客等待总时间 int CurrentTime;//当前时间，开门营业时为0 int Window[MaxWindow];//营业窗口需要处理事务的时间长度 int WaitTime;//相邻两次窗口空闲之间等待的时间 int WinAvail;//空闲窗口位置 int i,j; scanf("%d", &K);//读入营业窗口个数 if(N<K)return 0;//窗口比人多不用等 for(i=0;i<K;i++)//初始化 Window[i]=0; TotalTime=0; while(!IsEmpty(Q))//当队列非空时，持续处理 { WinAvail=FindNextWindow(Window, K, &WaitTime);//处理掉当前最短的事务，得到下一个空闲窗口 CurrentTime+=WaitTime; Next=DeleteQ(Q);//下一位顾客出列 if(CurrentTime>=Next.T) //如果顾客已经到达等待 TotalTime+=(CurrentTime-Next.T);//累计等待时间 else//如果顾客还没到 { WaitTime=Next.T-CurrentTime;//空闲窗口等待顾客的时间 for(j=0;j<K;j++)//刷新所有窗口至顾客到达的状态 { Window[j]-=WaitTime; if(Window[j]<0) Window[j]=0; } CurrentTime=Next.T;//更新当前时间为顾客到达的时间 } Window[WinAvail]=Next.P;//顾客NEXT到WINAVAIL窗口接受服务 } return((double)TotalTime/(double)N); //返回顾客的平均等待时间  }  int main(){ int N; Queue Q; int i; ElementType X; scanf("%d", &N); Q=CreateQueue(N); for(i=0;i<N;i++) { scanf("%d%d", &X.T, &X.P); AddQ(Q, X); } printf("平均等待时间 =%.If minute(s).\n", QueueingAtBank(Q, N)); DestroyQueue(Q); return 0; ｝