在股票交易中,股民可以通过各种手段将委托送到股票交易所。每个委托主要说明了股民身份、买卖的股票、价格和数量。交易的规则是价格优先、时间优先,即出的价格最高的人先买,出的价格最低的人先卖。两个委托只有价格合适时才能成交,未成交的委托按价格顺序放在撮合队列中。每个股票有两个撮合队列:买队列和卖队列。只有当买委托的价格高于等于卖委托的价格,两个委托才可以成交,成交价取两个委托价格的平均值,成交量取两个委托数量的最小值。委托可以是完全成交或部分成交,部分成交的委托保留在撮合队列中继续交易。试利用单链表作为存放委托的数据结构(撮合队列),编写一模拟股票交易的程序,该程序有以下几个功能:
1. 委托申请:
输入:每个委托包括四个数据项,股票编码( 4 位数字)、价格(浮点数)、数量(整数)、买 / 卖( B/S )
输出: a. 程序为每个委托产生一个唯一的序号( d ),该序号从 1 开始; b. 每笔成交包括:成交价格( %6.1f )、成交量( M )、新的委托序号( d )、匹配的委托序号( d )。
2. 查询未成交的委托:
输入:股票编码
输出:按撮合队列中委托的顺序,分别输出该股票未成交的委托,每个输出的委托包括:委托序号( d )、 股票编码 ( d ) 、 价格( %6.1f )、数量( M )、 B/S (买 / 卖 )
3. 委托撤消:
输入:要撤消的委托号。
输出:若成功,显示该委托信息,其中委托包括数据项:委托序号、股票编码、价格、数量、 B/S (买 / 卖 ) ;否则显示“ not found ”失败信息。
委托输入格式 : 1 股票编码 价格 数量 买卖
查询输入格式 : 2 股票编码
委托撤销 : .3 委托号
退出: 0
例: (下面的黑斜体为输入, 输入输出格式参见测试用例)
1 0038 20 1000 b
orderid: 0001
1 0278 18 2000 s
orderid: 0002
1 0003 8 5000 b
orderid: 0003
1 0003 12 1000 b
orderid: 0004
1 0003 10 500 b
orderid: 0005
1 0003 11 9000 b
orderid: 0006
1 0003 18 1000 s
orderid: 0007
2 0003
buy orders:
orderid: 0004, stockid:0003, price: 12.0, quantity: 1000, b/s: b
orderid: 0006, stockid:0003, price: 11.0, quantity: 9000, b/s: b
orderid: 0005, stockid:0003, price: 10.0, quantity: 500, b/s: b
orderid: 0003, stockid:0003, price: 8.0, quantity: 5000, b/s: b
sell orders:
orderid: 0007, stockid:0003, price: 18.0, quantity: 1000, b/s: s
3 0006
deleted order:orderid: 0006, stockid:0003, price: 11.0, quantity: 9000, b/s: b
3 0197
not found
2 0003
buy orders:
orderid: 0004, stockid:0003, price: 12.0, quantity: 1000, b/s: b
orderid: 0005, stockid:0003, price: 10.0, quantity: 500, b/s: b
orderid: 0003, stockid:0003, price: 8.0, quantity: 5000, b/s: b
sell orders:
orderid: 0007, stockid:0003, price: 18.0, quantity: 1000, b/s: s
1 0003 9 1200 s
orderid: 0008
deal--price: 10.5 quantity:1000 sellorder:0008 buyorder:0004
deal--price: 9.5 quantity: 200 sellorder:0008 buyorder:0005
2 0003
buy orders:
orderid: 0005, stockid:0003, price: 10.0, quantity: 300, b/s: b
orderid: 0003, stockid:0003, price: 8.0, quantity: 5000, b/s: b
sell orders:
orderid: 0007, stockid:0003, price: 18.0, quantity: 1000, b/s: s
注意:
1、当查询未成交委托时,如果没有委托,仍要输出“buy orders:”或“sell orders: ”。
2、输入的委托price>=0。
3、输入的委托quantity>=0,当接受一个新的委托时,首先根据委托的股票编码和价格与现有队列中的委托进行撮合,若撮合后有剩余的数量没有得到满足(即quantity>0),则将新委托插入到相应队列中。
测试输入
1 9990 8 1000 s 1 0001 9 500 s 1 0001 8 200 s 1 0001 12 1000 s 1 0001 10 1000 b 2 0001 0 测试输出
orderid: 0001 orderid: 0002 orderid: 0003 orderid: 0004 orderid: 0005 deal--price: 9.0 quantity: 200 buyorder:0005 sellorder:0003 deal--price: 9.5 quantity: 500 buyorder:0005 sellorder:0002 buy orders: orderid: 0005, stockid:0001, price: 10.0, quantity: 300, b/s: b sell orders: orderid: 0004, stockid:0001, price: 12.0, quantity: 1000, b/s: s 源代码
#include<stdio.h> #include<malloc.h> typedef struct node{ int code; //股票编码 float price; //价格 int number; //数量 char record; //记录(B/S) int order; //序号 struct node *next; }Node; int main(){ Node *buyer; // 从队头指针开始,买队列从大到小排列 Node *seller; //从队头指针开始,卖队列从小到大排列 Node *p,*q,*r,*b,*s,*b1,*s1,*r1,*q1; int x,cod,number1; float price1; char order1; int k=1,bi=0,si=0; int i,a[2]; int flag,flag1,flag2; p=(Node*)malloc(sizeof(Node)); p->next=NULL; buyer=p; b=buyer; p=(Node*)malloc(sizeof(Node)); p->next=NULL; seller=p; s=seller; while(1){ scanf("%d",&x); if(x==0) break; b=buyer; b1=b->next; s=seller; s1=s->next; if(x==1){//输入1命令 scanf("%d %f %d %c",&cod,&price1,&number1,&order1); printf("orderid: d\n",k++); if(order1=='b'){ while(s1!=NULL){ if(price1>=s1->price){ if(cod==s1->code){ if(number1==s1->number){ printf("deal--price:%6.1f quantity:M buyorder:d sellorder:d\n",(price1+s1->price)/2,number1,k-1,s1->order); number1=0; s->next=s1->next; free(s1); si--; break; } else if(number1>s1->number){//买 > 卖 printf("deal--price:%6.1f quantity:M buyorder:d sellorder:d\n",(price1+s1->price)/2,s1->number,k-1,s1->order); number1=number1-s1->number; s->next=s1->next; free(s1); s1=s->next; i--; si--; continue; } else if(number1<s1->number){//买 < 卖 printf("deal--price:%6.1f quantity:M buyorder:d sellorder:d\n",(price1+s1->price)/2,number1,k-1,s1->order); s1->number=s1->number-number1; number1=0; break; } } else {s=s->next;s1=s->next;continue;} } else break; } if(number1!=0){//若交易有剩余 q=buyer; q1=q->next; flag=0; while(q1!=NULL){ if(price1>q1->price){ p=(Node*)malloc(sizeof(Node)); p->code=cod; p->price=price1; p->number=number1; p->record=order1; p->order=k-1; p->next=q1; q->next=p; flag=1; bi++; if(flag==1) break; } else { q=q->next; q1=q->next; } } if(flag==0){ p=(Node*)malloc(sizeof(Node)); p->code=cod; p->price=price1; p->number=number1; p->record=order1; p->order=k-1; p->next=NULL; q->next=p; bi++; } } } if(order1=='s'){ while(b1!=NULL){ if(price1<=b1->price){ if(cod==b1->code){ if(number1==b1->number){ printf("deal--price:%6.1f quantity:M sellorder:d buyorder:d\n",(price1+b1->price)/2,number1,k-1,b1->order); number1=0; b->next=b1->next; free(b1); bi--; break; } else if(number1>b1->number){ printf("deal--price:%6.1f quantity:M sellorder:d buyorder:d\n",(price1+b1->price)/2,b1->number,k-1,b1->order); number1=number1-b1->number; b->next=b1->next; free(b1); b1=b->next; i--; bi--; continue; } else if(number1<b1->number){ printf("deal--price:%6.1f quantity:M sellorder:d buyorder:d\n",(price1+b1->price)/2,number1,k-1,b1->order); b1->number=b1->number-number1; number1=0; break; } } else { b=b->next; b1=b->next; continue; } } else break; } if(number1!=0){ q=seller; q1=q->next; flag=0; while(q1!=NULL){ if(price1<q1->price){ p=(Node*)malloc(sizeof(Node)); p->code=cod; p->price=price1; p->number=number1; p->record=order1; p->order=k-1; p->next=q1; q->next=p; flag=1; si++; if(flag==1)break; } else { q=q->next; q1=q->next; } } if(flag==0){ p=(Node*)malloc(sizeof(Node)); p->code=cod; p->price=price1; p->number=number1; p->record=order1; p->order=k-1; p->next=NULL; q->next=p; si++; } } } }//输入1命令 else if(x==2){//输入2命令 scanf("%d",&cod); printf("buy orders:\n"); r=buyer; r1=r->next; while(r1!=NULL){ if(cod==r1->code) printf("orderid: d, stockid:d, price: %6.1f, quantity: M, b/s: %c\n",r1->order,r1->code,r1->price,r1->number,r1->record); r=r->next; r1=r->next; } printf("sell orders:\n"); r=seller; r1=r->next; while(r1!=NULL){ if(cod==r1->code) printf("orderid: d, stockid:d, price: %6.1f, quantity: M, b/s: %c\n",r1->order,r1->code,r1->price,r1->number,r1->record); r=r->next; r1=r->next; } }//输入2命令 else if(x==3){ scanf("%d",&a[1]); b1=buyer; b=b1->next==NULL?NULL:b1->next; flag1=0; flag2=0; while(b!=NULL){ if(b->order==a[1]){ flag1=1; b1->next=b->next; printf("deleted order:orderid: d, stockid:d, price: %6.1f, quantity: M, b/s: %c\n",a[1],b->code,b->price,b->number,b->record); free(b); b=NULL; } else{ b=b->next; b1=b1->next; } } s1=seller; s=seller->next==NULL?NULL:seller->next; while(s!=NULL&&flag1==0){ if(s->order==a[1]){ flag2=1; s1->next=s->next; printf("deleted order:orderid: d, stockid:d, price: %6.1f, quantity: M, b/s: %c\n",a[1],s->code,s->price,s->number,s->record); free(s); s=NULL; } else{ s=s->next; s1=s1->next; } } if(flag1==0&&flag2==0) printf("not found\n"); } }//while大循环 }
