📄 booksystem.cpp
字号:
#include "StdAfx.h"
#include "BookSystem.h"
int BookSystem::j=5;
int BookSystem::storage=0;
BookSystem* BookSystem::t=new BookSystem;
BookSystem* BookSystem::re=new BookSystem;
BookSystem::BookSystem()
{
press_next=NULL;bookname_next=NULL;author_next=NULL;same=NULL;other=NULL;
note[0]=1;note[1]=1,note[2]=1,ID=0;booknameID=0;
}
BookSystem::~BookSystem()
{
}
void BookSystem::Set(CString y,CString m,CString d)
{press=y;bookname=m;author=d;
}
int BookSystem::ReturnStorage()
{return storage;}
/////////////////////////////////////////////////////////////////////////////////////////
//对出版社的坐标链表查找
//J付1说明确实找到了该书名
//J不等于1说明确实找不到了该书名
BookSystem* BookSystem::Search_Press(CString s,BookSystem* root) //对出版社的坐标链表查找
{BookSystem* temp=NULL;
j=3;//先对J设定一个不会冲突的值
if(root->press==s)
{t->press_next=root;j=1;return root;} //先看根节点,看其出版设是否是要查找的出版社,是就返回
if(root->press_next==NULL)//若第一步不成功,看是否还有另外的出版社,若另外的出版社为空。也就是说没有
{t->press_next=root;j=0;return root;} //那么就返回,把J付0
temp=root->press_next; //当还存在别的出版社
while((temp->press!=s)&&(temp->press_next!=NULL))//再看其出版设是否是要查找的出版社,是就返回
{t->press_next=temp;temp=temp->press_next;} //指向随后的节点
if(temp->press==s)
{t->press_next=temp;j=1;return temp;}
if(temp->press_next==NULL)
{t->press_next=temp;j=2;return temp;}
return temp;
}
/////////////////////////////////////////////////////////////////////////////////////
//对书名的坐标链表查找
BookSystem* BookSystem::Search_Bookname(CString s,BookSystem*root)
{BookSystem* temp=NULL;
temp=root;
j=3;
if(root->bookname==s)
{t->bookname_next=root;j=1;return root;}
if(root->bookname_next==NULL)
{t->bookname_next=root;j=0;return temp;}
while((temp->bookname!=s)&&(temp->bookname_next!=NULL))
{t->bookname_next=temp;temp=temp->bookname_next;}
if(temp->bookname==s)
{t->bookname_next=temp;j=1;return temp;} //加1说明确实找到了该书名
if(temp->bookname_next==NULL)
{t->bookname_next=temp;j=2;return temp;} //没有加1说明找不到该书名,找到了只是该书名前面的一个书名
return temp;
}
////////////////////////////////////////////////////////////////////////////////////////
//对作者的坐标链表查找
BookSystem* BookSystem::Search_Author(CString s,BookSystem* root)
{BookSystem* temp=NULL;
temp=root;
j=3;
if(root->author==s)
{t->author_next=root;j=1;return root;}
if(root->author_next==NULL)
{t->author_next=root;j=0;return t->author_next;}
while((temp->author!=s)&&(temp->author_next!=NULL))
{t->author_next=temp;temp=temp->author_next;}
if(temp->author==s)
{t->author_next=temp;j=1;return temp;}
else if(temp->author_next==NULL)
{t->author_next=temp;j=2;return temp;}
return temp;
}
////////////////////////////////////////////////////////////////////////////////////////
//对类型的坐标链表查找,与上面的几个查找不同,因为这个是基于跳跃链表的
BookSystem* BookSystem::ResearchInsert_Type(BookSystem* root,BookSystem* tt) //对类型查找
{BookSystem* temp=NULL;
BookSystem* temp1=NULL;
BookSystem* temp2=NULL;
if(root->same==NULL&&root->other==NULL) //既这是插入第二个节点时,在这之前只有根节点root一个节点
{if(root->type==tt->type) //若和根节点同类型
{root->same=tt;return root;}//把根节点的same指针指向该节点
root->other=tt;return tt;//否则,也就是说第二个节点和跟节点不同类型,就把根节点的other指针指向该节点
}
temp=root; //但上面第一个条件语句不成立,也就是说现在是插如第三个或以上的节点
while(temp->type!=tt->type&&temp->other!=NULL){temp2=temp;temp=temp->other;}//找寻同样的类型
if(temp->type==tt->type)//若该类型已经存在,则把与它是同类型的节点的same指针指向它
{if(temp->same==NULL){temp->same=tt;return temp;};
temp2=temp->same;temp->same=tt;tt->same=temp2;return temp;}
temp->other=tt;return tt;//否则,说明这是一个新的类型,把最后一种类型的other指针指向它
return tt;
}
//////////////////////////////////////////////////////////////////////////////////////
//对出版社和书名查找
BookSystem* BookSystem::Search_PandB(CString a, CString b,BookSystem* root) //以出版社和书名为关键字来查找
{BookSystem* temp=NULL;
int a1=3,b1=3;
BookSystem* temp1=NULL;
BookSystem* temp2=NULL;
temp1=Search_Press(a,root);
a1=j;
temp2=Search_Bookname(b,root);
b1=j;
if((a1)!=1||(b1)!=1){j=0;return temp;}
else {temp=temp2 ; //即两样要素都存在
while(temp->press!=a&&temp->press_next!=NULL){temp=temp->press_next;}
if(temp->press==a){j=1;return temp;}
else{ j=0;return temp;} //找到
}
}
///////////////////////////////////////////////////////////////////////////////////////////
//对出版社和作者查找
BookSystem* BookSystem::Search_BandA(CString a, CString b,BookSystem* root) //以人名和书名为关键字来查找
{BookSystem* temp=NULL;
int a1=3;
int b1=3;
BookSystem* temp1=NULL;
BookSystem* temp2=NULL;
temp1=Search_Bookname(a,root);
a1=j;
temp2=Search_Author(b,root);
b1=j;
if((a1)!=1||(b1)!=1){j=0;return temp;}
else {temp=temp2 ; //即两样要素都存在
while(temp->bookname!=a&&temp->bookname_next!=NULL){temp=temp->bookname_next;}
if(temp->bookname==a){j=1;return temp;} //已找尽
else{j=0;return temp;} //找到
}
}
//////////////////////////////////////////////////////////////////////////////////
//对书名和作者查找
BookSystem* BookSystem::Search_PandA(CString a, CString b,BookSystem* root) //以出版社和书名为关键字来查找
{BookSystem* temp=NULL;
BookSystem* temp1=NULL;
BookSystem* temp2=NULL;
int a1=3,b1=3;
temp1=Search_Press(a,root);
a1=j;
temp2=Search_Author(b,root);
b1=j;
if((a1)!=1||(b1)!=1){j=0;return temp;}
else {temp=temp2; //即两样要素都存在
while(temp->press!=a&&temp->press_next!=NULL){temp=temp->press_next;}
if(temp->press==a){j=1;return temp;} //已找尽
else{ j=0;return temp;} //找到
};
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//对出版社,书名和作者查找
BookSystem* BookSystem::Search_PandBandA(CString a, CString b, CString c, BookSystem* root) //以出版社,书名和人名为关键字来查找
{
BookSystem*temp4=NULL;
BookSystem* temp1=NULL;
BookSystem* temp2=NULL;
BookSystem* temp3=NULL;
int a1=3,b1=3,c1=3;
j=3; //每个位标记一样属性
temp1=Search_Press(a,root);a1=j;
temp2=Search_Bookname(b,root);b1=j;
temp3=Search_Author(c,root);c1=j;
if(a1!=1){j=0;} //如果没有该书的出版社
if(b1!=1){j=0;} //如果没有该书的书名
if(c1!=1){j=0;} //如果没有该书的人名
if(j==0){return temp4;}
if(a1==1){temp2=Search_Bookname(b,temp1);b1=j;
if(b1==1)
{temp3=Search_Author(c,temp2);c1=j;
if(c1==1){j=1;return temp3;}
}
}
return temp4;
j=0;
return temp4;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//在出版社和书名的稀疏距阵查找和插入节点
BookSystem* BookSystem::InsertMatrix_PandB(CString f,CString s,BookSystem*root)
{
BookSystem*temp1=NULL;
BookSystem*temp2=NULL;
BookSystem*temp4=NULL;
BookSystem*temp5=NULL;
int a2,b2;
a2=b2=3;
temp1=Search_Press(f,root);a2=j; //先对出版社进行查找,看是否是一个新的出版社
if(a2!=1)//a2不等于一,说明找不到这个出版社,说明是一个新的出版社
{BookSystem*p1;p1=new BookSystem;p1->Set(f,root->bookname,root->author);
p1->note[0]=t->press_next->note[0]+1;
temp1->press_next=p1;t->press_next=p1;temp5=p1;}//创建需要的节点
temp2=Search_Press(s,root);b2=j;//同理可得
if(b2!=1){BookSystem*b1;b1=new BookSystem;b1->Set(root->press,s,root->author);
b1->note[1]=(t->bookname_next->note[1]+1);t->bookname_next->bookname_next=b1;re->bookname_next=b1;temp5=b1;}
temp4=Search_PandB(f,s,root);//对出版社和书名同时查找,看是否已经存在
if(j!=1){ BookSystem*k=NULL;//不存在的话,需要创建,对创建的节点进行相应的付值
k=new BookSystem;k->Set(f,s,root->author);
temp1=Search_Press(f,root);
temp2=Search_Bookname(s,root);
k->note[0]=temp1->note[0];k->note[1]=temp2->note[1];
temp4=temp1;
temp5=temp1;
//将新建的节点插入到适当的位置
while(temp4->bookname_next!=NULL&&temp4->note[1]<k->note[1])
{temp5=temp4;temp4=temp4->bookname_next;}
if(temp4->bookname_next==NULL&&temp4->note[1]<k->note[1])
{temp4->bookname_next=k;}
else{k->bookname_next=temp4;temp5->bookname_next=k;}
temp4=temp2;
temp5=temp2;
while(temp4->press_next!=NULL&&temp4->note[0]<k->note[0])
{temp5=temp4;temp4=temp4->press_next;}
if(temp4->bookname_next==NULL&&temp4->note[0]<k->note[0])
{temp4->press_next=k;}
else{k->press_next=temp4;temp5->press_next=k;}
return k;
}
else{j=7;return temp5;
}
}
/////////////////////////////////////////////////////////////////////
//在出版社和作者的稀疏距阵查找和插入节点
BookSystem* BookSystem::InsertMatrix_PandA(CString f,CString s,BookSystem*root)
{
BookSystem*temp1=NULL;
BookSystem*temp2=NULL;
BookSystem*temp4=NULL;
BookSystem*temp5=NULL;
int a2,b2;
a2=b2=3;
temp1=Search_Press(f,root);a2=j;
if(a2!=1){BookSystem*p1;p1=new BookSystem;p1->Set(f,root->bookname,root->author);
p1->note[0]=t->press_next->note[0]+1;t->press_next->press_next=p1;t->press_next=p1;temp5=p1;}
temp2=Search_Author(s,root);b2=j;
if(b2!=1){BookSystem*b1;b1=new BookSystem;b1->Set(root->press,root->bookname,s);
b1->note[2]=(t->author_next->note[2]+1);t->author_next->author_next=b1;re->bookname_next=b1;temp5=b1;}
temp4=Search_PandA(f,s,root);
if(j!=1){temp1=Search_Press(f,root);
a2=j;
temp2=Search_Author(s,root);
b2=j;
BookSystem*k;
k=new BookSystem;k->Set(f,root->bookname,s);
k->note[0]=temp1->note[0];k->note[2]=temp2->note[2];
temp4=temp1;
temp5=temp1;
while(temp4->author_next!=NULL&&temp4->note[2]<k->note[2])
{temp5=temp4;temp4=temp4->author_next;}
if(temp4->author_next==NULL&&temp4->note[2]<k->note[2])
{temp4->author_next=k;}
else{k->author_next=temp4;temp5->author_next=k;}
temp4=temp2;
temp5=temp2;
while(temp4->press_next!=NULL&&temp4->note[0]<k->note[0])
{temp5=temp4;temp4=temp4->press_next;}
if(temp4->press_next==NULL&&temp4->note[0]<k->note[0])
{temp4->press_next=k;}
else{k->press_next=temp4;temp5->press_next=k;}
return k;
}
else{j=7;return temp5;
}
}
/////////////////////////////////////////////////////
//在出书名和作者的稀疏距阵查找和插入节点
BookSystem* BookSystem::InsertMatrix_BandA(CString f,CString s,BookSystem*root)
{
BookSystem*temp1=NULL;
BookSystem*temp2=NULL;
BookSystem*temp4=NULL;
BookSystem*temp5=NULL;
int a2,b2;
a2=b2=3;
temp1=Search_Bookname(f,root);a2=j;
if(a2!=1){BookSystem*p1;p1=new BookSystem;p1->Set(root->press,f,root->author);
p1->note[1]=t->bookname_next->note[1]+1;t->bookname_next->bookname_next=p1;t->bookname_next=p1;temp5=p1;}
temp2=Search_Author(s,root);b2=j;
if(b2!=1){BookSystem*b1;b1=new BookSystem;b1->Set(root->press,root->bookname,s);
b1->note[2]=(t->author_next->note[2]+1);t->author_next->author_next=b1;t->author_next=b1;temp5=b1;}
temp4=Search_BandA(f,s,root);
if(j!=1){
temp1=Search_Bookname(f,root);
temp2=Search_Author(s,root);
BookSystem*k;k=new BookSystem;k->Set(root->press,f,s);
k->note[1]=temp1->note[1];k->note[2]=temp2->note[2];
temp4=temp1;
while(temp4->author_next!=NULL&&temp4->note[2]<k->note[2]){temp5=temp4;temp4=temp4->author_next;}
if(temp4->author_next==NULL&&temp4->note[2]<k->note[2]){temp4->author_next=k;}
else{k->author_next=temp4;temp5->author_next=k;}
temp4=temp2;
while(temp4->bookname_next!=NULL&&temp4->note[1]<k->note[1]){temp5=temp4;temp4=temp4->bookname_next;}
if(temp4->bookname_next==NULL&&temp4->note[1]<k->note[1]){temp4->bookname_next=k;}
else{k->bookname_next=temp4;temp5->bookname_next=k;}
return k;
}
else {j=7;return temp5;}
}
/////////////////////////////////////////////////////////////////////////////////
//对于需要插入的书,先把它当作一个节点,在把他插进结构当中
bool BookSystem::InsertBookSystem(CString p,CString b,CString m, CString ty,BookSystem *temp)
{if(temp==NULL){ //判断是否存在第一个节点,创立第一个节点
temp->Set(p,b,m);
temp->ID=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -