void PC_Destroy(PC *pc) { Lock_Acquire(&pc->lock); assert(List_IsEmpty(&(pc->list))); Lock_Release(&pc->lock); }
//对座位链表list进行按座位行号和列号排序 void Seat_Srv_SortSeatList(seat_list_t list) { seat_node_t *p, *listLeft; assert(list!=NULL); if(List_IsEmpty(list)) return ; //将next指针构成的循环链表从最后一个结点断开 list->prev->next = NULL; //listLeft指向第一个数据节点 listLeft = list->next; //将list链表置为空 list->next = list->prev = list; while (listLeft != NULL ) { //取出第一个结点 p = listLeft; listLeft = listLeft->next; //将结点p加入到已排序链表list中 Seat_Srv_AddToSoftedList(list, p); } }
static void removeItem(int color, List_Links *list) { Item *i; assert(!List_IsEmpty(list)); assert(((Item *)List_First(list))->color == color); i = (Item *)List_First(list); List_Remove((List_Links *)i); assert(i->color == color); free(i); return; }
//将结点node加入到已排序链表list中 void Seat_Srv_AddToSoftedList(seat_list_t list, seat_node_t *node) { seat_node_t *p; assert(list!=NULL && node!=NULL); if(List_IsEmpty(list)) { List_AddTail(list, node); }else{ //寻找插入位置 p=list->next; while(p!=list && (p->data.row<node->data.row || (p->data.row==node->data.row && p->data.column<node->data.column))){ p=p->next; } //将结点node加入到p之前 List_InsertBefore(p, node); } }
int PC_Get(PC *pc, int color) { Lock_Acquire(&pc->lock); assert(color <= pc->maxColor); while(List_IsEmpty(&(pc->list)) || (((Item *)List_First(&(pc->list)))->color != color)){ pc->waitingC++; Cond_Wait(&pc->stuffAvail, &pc->lock); pc->waitingC--; } removeItem(color, &(pc->list)); pc->used--; Cond_Signal(&pc->spaceAvail, &pc->lock); /* * We just took top item off -- another getter may be * able to proceed */ Cond_Broadcast(&pc->stuffAvail, &pc->lock); Lock_Release(&pc->lock); return color; }
//根据剧目ID显示演出计划 void Sale_UI_ShowScheduler(int playID) { int i, id; char choice; play_t pdata; ticket_list_t tickList; seat_list_t seatList; schedule_list_t head; schedule_node_t *p; Pagination_t paging; Play_Srv_FetchByID(playID, &pdata); List_Init(head, schedule_node_t); paging.offset = 0; paging.pageSize = SCHEDULE_PAGE_SIZE; //载入数据 paging.totalRecords = Schedule_Srv_FetchByPlay(head,playID); Paging_Locate_FirstPage(head, paging); do { system("clear"); printf("\n ================================================================="); printf("\n **************************剧目%s的演出计划*************************"); printf("\n ================================================================="); printf("\t\t%5s\t%5s\t%8s\t%10s\t%10s\t%10s\n", "ID", "剧目编号", "演出厅编号", "上映日期","上映时间","票价"); printf("\n -----------------------------------------------------------------"); if(!List_IsEmpty(head)){ //显示数据 for (i = 0, p = (schedule_node_t *) (paging.curPos);p != head && i < paging.pageSize; i++){ printf("%5d 『%d』%20s 『%d』%2s ", p->data.id, p->data.play_id, p->data.play_name,p->data.studio_id, p->data.studio_name); printf(" %4d-%02d-%02d",p->data.date.year, p->data.date.month, p->data.date.day); printf("\t%2d:%02d:%02d ", p->data.time.hour, p->data.time.minute, p->data.time.second); printf("\t%5d\n", p->data.price); } }else{ printf("\n **没有演出厅信息!**"); printf("\n =================================================================="); } printf("\n =================================================================="); printf("\n |----------总数%2d------------------------------%2d/%2d页---------|",paging.totalRecords, Pageing_CurPage(paging),Pageing_TotalPages(paging)); printf("\n ******************************************************************"); printf("\n | [P]revPage | [N]extPage |"); printf("\n -----------------------------------------------------------------"); printf("\n | [S]ale | [R]eturn |"); printf("\n ******************************************************************"); printf("\n =================================================================="); printf("\n Iput Your choice:"); choice=l_getc(); switch (choice) { case 's': case 'S': { List_Init(tickList, ticket_node_t); List_Init(seatList, seat_node_t); Sale_UI_SellTicket(tickList,seatList); List_Destroy(tickList, ticket_node_t); List_Destroy(seatList, seat_node_t); } break; case 'p': case 'P': system("clear"); if(Pageing_TotalPages(paging)>Pageing_CurPage(paging)){ Paging_Locate_OffsetPage(head,paging,1,schedule_node_t); } break; case 'n': case 'N': system("clear"); if(Pageing_TotalPages(paging)>Pageing_CurPage(paging)){ Paging_Locate_OffsetPage(head,paging,1,schedule_node_t); } break; } } while (choice != 'r' && choice != 'R'); //释放链表空间 List_Destroy(head, schedule_node_t); }
void Schedule_UI_MgtEntry(int play_id){ int i, id; char choice; play_t pdata; schedule_list_t head; schedule_node_t *p; Pagination_t paging; Play_Srv_FetchByID(play_id, &pdata); List_Init(head, schedule_node_t); paging.offset = 0; paging.pageSize = SCHEDULE_PAGE_SIZE; //载入数据 paging.totalRecords = Schedule_Srv_FetchByPlay(head,play_id); Paging_Locate_FirstPage(head, paging); do { system("clear"); printf("\n\n\n\t ================================================================="); printf("\n\t **************************剧目%d的演出计划*************************",play_id); printf("\n\t ================================================================="); printf("\n\t\t\t %-5s%-10s %-12s %-12s %-12s %-5s", "ID", "剧目", "演出厅", "上映日期","上映时间","票价"); printf("\n\t -----------------------------------------------------------------"); //显示数据 for (i = 0, p = (schedule_node_t *) (paging.curPos);p != head && i < paging.pageSize; i++){ printf("\n\t\t\t %-3d 『%d』 \t 『%d』 ", p->data.id, p->data.play_id,p->data.studio_id); printf("\t%4d-%02d-%02d\t",p->data.date.year, p->data.date.month, p->data.date.day); printf("%2d:%02d:00", p->data.time.hour, p->data.time.minute); printf(" %-5d\n", p->data.price); p=p->next; } printf("\n\t =================================================================="); printf("\n\t |-------------总数%2d----------------------------%2d/%2d页-----------|",paging.totalRecords, Pageing_CurPage(paging),Pageing_TotalPages(paging)); printf("\n\t ******************************************************************"); printf("\n\t | [P]revPage | [N]extPage |"); printf("\n\t | [A]dd | [D]elete | [U]udate | [V]iew All |"); printf("\n\t ------------------------[R]eturn----------------------------------"); printf("\n\t =================================================================="); printf("\n\t Iput Your choice:"); choice=l_getc(); switch (choice) { case 'a': case 'A': { studio_list_t slist; List_Init(slist, studio_node_t); Studio_Srv_FetchAll(slist); if(!List_IsEmpty(slist) ){ if (Schedule_UI_Add(pdata.id)) //新添加成功,跳到最后一页显示 { paging.totalRecords =Schedule_Srv_FetchByPlay(head,play_id); Paging_Locate_LastPage(head, paging, schedule_node_t); } }else{ if(List_IsEmpty(slist)){ printf("\n **没有演出厅信息,无法添加计划!** /n"); } printf("\n -------------------------------按任意键返回-------------------------"); getchar(); } } break; case 'd': case 'D': printf("\n\t | 请输入计划ID:"); while(1){ if(scanf("%d",&id)==1){ cl_stdin(); break;} else{ cl_stdin();printf("\n\t **您的输入有误!请重新输入** ");} } if (Schedule_UI_Delete(id)) { //从新载入数据 paging.totalRecords = Schedule_Srv_FetchByPlay(head,play_id); List_Paging(head, paging, schedule_node_t); } break; case 'u': case 'U': printf("\n | 请输入计划ID:"); while(1){ if(scanf("%d",&id)==1){ cl_stdin(); break;} else{ cl_stdin();printf("\n\t **您的输入有误!请重新输入** "); } } if (Schedule_UI_Modify(id)) { //从新载入数据 paging.totalRecords = Schedule_Srv_FetchByPlay(head,play_id); List_Paging(head, paging, schedule_node_t); } break; case 'v': case 'V': Schedule_UI_ListAll(); break; case 't': case 'T': //(); break; case 24 : if (1 < Pageing_CurPage(paging)) { Paging_Locate_OffsetPage(head, paging, -1, schedule_node_t); } break; case 25 : if (Pageing_TotalPages(paging) > Pageing_CurPage(paging)) { Paging_Locate_OffsetPage(head, paging, 1, schedule_node_t); } break; } } while (choice != 'r' && choice != 'R'); //释放链表空间 List_Destroy(head, schedule_node_t); }