单链表方面的问题,求大神解答
小弟不才,才学习c,数据结构,不过要求编一个股票撮合交易的程序,好不容易弄出来,错误太多,运行下就崩了,麻烦大神能抽空看看,指点一下,谢了。以下是要求···
在股票交易中,股民可以通过各种手段将委托送到股票交易所。每个委托主要说明了股民身份、买卖的股票、价格和数量。交易的规则是价格优先、时间优先,即出的价格最高的人先买,出的价格最低的人先卖。两个委托只有价格合适时才能成交,未成交的委托按价格顺序放在撮合队列中。每个股票有两个撮合队列:买队列和卖队列。只有当买委托的价格高于等于卖委托的价格,两个委托才可以成交,成交价取两个委托价格的平均值,成交量取两个委托数量的最小值。委托可以是完全成交或部分成交,部分成交的委托保留在撮合队列中继续交易。试利用单链表作为存放委托的数据结构(撮合队列),编写一模拟股票交易的程序,该程序有以下几个功能:
1. 委托申请:
输入:每个委托包括四个数据项,股票编码(4位数字)、价格(浮点数)、数量(整数)、买/卖(B/S)
输出:a. 程序为每个委托产生一个唯一的序号(%04d),该序号从1开始;b. 每笔成交包括:成交价格(%6.1f)、成交量(%4d)、买委托序号(%04d)、卖委托序号(%04d)。
2. 查询未成交的委托:
输入:股票编码
输出:按撮合队列中委托的顺序,分别输出该股票未成交的委托,每个输出的委托包括:委托序号(%04d)、股票编码(%04d)、价格(%6.1f)、数量(%4d)、B/S(买/卖)
3. 委托撤消:
输入:要撤消的委托号。
输出:若成功,显示该委托信息,其中委托包括数据项:委托序号、股票编码、价格、数量、B/S(买/卖);否则显示“not found”失败信息。
这是我的代码···求指点,问题在哪
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <malloc.h>
typedef struct stock
{int cord;
int number;
float price;
int quantity;
char bos;
struct stock * next;
}snode;
typedef snode buylist,selllist;
buylist *p,*head1;
selllist *q,*head2;
void listInitiate(snode **head)
{
*head=(snode*)malloc(sizeof(snode));
//(*head)=NULL;
(*head)->next=NULL;
}
int listInsert(snode *head,int a,int b,float c,int d,char e)
{
snode *m,*n;
n=head;
m=(snode*)malloc(sizeof(snode));
m->cord=a;
m->number=b;
m->price=c;
m->quantity=d;
m->bos=e;
m->next = NULL;
while(n->next!=NULL)
{n=n->next;}
n->next=m;
return 1;
}
int listdelete(snode *head,snode *p)
{
snode *q;
q=head;
while(q->next!=p)
{
q=q->next;
}
q->next=p->next;
free(p);
return 1;
}
int exchange(buylist *head1,selllist *head2)
{
float averageprice;
buylist *p;
selllist *q;
p=head1,q=head2;
for(;p->next==NULL;p==p->next)
for(;q->next==NULL;q==q->next)
{
if(p->cord==q->cord) averageprice=(p->price+q->price)/2;
{
if(p->quantity>q->quantity)
{
p->quantity=p->quantity-q->quantity;
listdelete(head2, q);
printf("成交价格:%6.1f,成交量:%4d,买委托序号:%04d,卖委托序号:%04d",averageprice,q->quantity,p->cord,q->cord);
}
else if(p->quantity<q->quantity)
{
q->quantity=q->quantity-p->quantity;
listdelete(head1,p);
printf("成交价格:%6.1f,成交量:%4d,买委托序号:%04d,卖委托序号:%04d",averageprice,p->quantity,p->cord,q->cord);
}
else if(p->quantity=q->quantity)
{
listdelete(head1,p);
listdelete(head2,q);
printf("成交价格:%6.1f,成交量:%4d,买委托序号:%04d,卖委托序号:%04d",averageprice,q->quantity,p->cord,q->cord);
}
}
}
return 1;
}
int orderb(buylist *head1)
{
buylist *k,*l;
k=(snode*)malloc(sizeof(snode));
l=(snode*)malloc(sizeof(snode));
k=head1;
l=head1->next;
if(l->next==NULL) return 0;
while(l!=NULL)
{
l=l->next;
while(k->next!=l&&l!=NULL)
{ if(l->price>k->next->price)
{ k->next->next=l->next;
l->next=k->next;
k->next=l;}
k=k->next;}
}
return 1;
}
int orders(selllist *head2)
{
selllist *k,*l;
k=(snode*)malloc(sizeof(snode));
l=(snode*)malloc(sizeof(snode));
k=head2;
l=head2->next;
if(l->next==NULL) return 0;
while(l!=NULL)
{
l=l->next;
while(k->next!=l&&l!=NULL)
{ if(l->price<k->next->price)
{ k->next->next=l->next;
l->next=k->next;
k->next=l;}
k=k->next;}
}
return 1;
}
void main()
{
int a,b,c,i=0;
snode sd;
buylist bt;
selllist st;
listInitiate(&head1);
listInitiate(&head2);
// cout<<head1;
sta:
cout<<"请选择交易类型\n"<<"1.委托申请\n"<<"2.查询未成交的委托\n"<<"3.委托撤消\n";
cin>>a;
switch(a)
{
case 1:
cout<<"股票编码(4位):";cin>>sd.number;
cout<<" 价格:";cin>>sd.price;
cout<<" 数量:";cin>>sd.quantity;
cout<<" 买/卖(B/S):";cin>>sd.bos;
i=i+1;
printf("该委托序号为:%04d",i);
if (sd.bos=='B')
{
bt.bos=sd.bos;
bt.number=sd.number;
bt.price=sd.price;
bt.quantity=sd.quantity;
bt.cord=i;
p=head1;
listInsert(p,bt.cord,bt.number,bt.price,bt.quantity,bt.bos);
}
else
{
st.bos=sd.bos;
st.number=sd.number;
st.price=sd.price;
st.quantity=sd.quantity;
st.cord=i;
q=head2;
listInsert(q,st.cord,st.number,st.price,st.quantity,st.bos);
}
exchange(head1,head2);
orderb(head1);
orders(head2);
goto sta;
case 2:cout<<"请输入股票编码:";
cin>>b;
buylist *u;
selllist *v;
u=head1;
v=head2;
for(;u->next!=NULL;u=u->next)
if(u->number==b) printf("委托序号:%04d, 股票编码:%04d, 价格:%6.1f, 数量:%4d, B/S(买/卖):",u->cord,u->number,u->price,u->quantity,u->bos);
for(;v->next!=NULL;v=v->next)
if(v->number==b) printf("委托序号:%04d, 股票编码:%04d, 价格:%6.1f, 数量:%4d, B/S(买/卖):",v->cord,v->number,v->price,v->quantity,v->bos);
goto sta;
case 3:cout<<"请输入要撤消的委托号:";
cin>>c;
buylist *g;
selllist *h;
g=head1;
h=head2;
for(;g->next!=NULL;g=g->next)
if(g->cord=c)
{printf("委托序号:%04d, 股票编码:%04d, 价格:%6.1f, 数量:%4d, B/S(买/卖):",g->cord,g->number,g->price,g->quantity,g->bos);
listdelete(head1,g);
}
for(;h->next!=NULL;h=h->next)
if(h->cord=c)
{printf("委托序号:%04d, 股票编码:%04d, 价格:%6.1f, 数量:%4d, B/S(买/卖):",h->cord,h->number,h->price,h->quantity,h->bos);
listdelete(head2,h);
}
else cout<<"not found/n";
goto sta;
}
}