基于顺序存储结构的图书信息表的图书去重
#include<iostream>
#include<stdlib.h>
#include<string.h>typedef int status;#define OK 1using namespace std;typedef struct{char no[50];char name[50];float price;
}Book;typedef struct{Book* elem;int len;
}SqList;status InitList(SqList* L,int n){L->elem=(Book*)malloc((n+5)*sizeof(Book));if(!L->elem) exit(-1);L->len=0;return OK;
}status CreateList(SqList* L,int n){for(int i=0;i<n;i++){bool flag=true;Book b;cin>>b.no>>b.name>>b.price;for(int j=0;j<L->len;j++){if(!strcmp(b.no,L->elem[j].no)){flag=false;break; }}if(flag){L->elem[L->len]=b;L->len++;}}return OK;
}void PrintList(SqList* L){printf("%d\n",L->len);for(int i=0;i<L->len;i++){printf("%s %s %.2f\n",L->elem[i].no,L->elem[i].name,L->elem[i].price);}
}int main(){SqList L;int n=0;cin>>n; //图书数 InitList(&L,n);CreateList(&L,n);PrintList(&L); return 0;
}
终于开链表了开链表了T_T
基于链式存储结构的图书信息表的创建和输出
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList; //这样typedef,可以在后期比较方便地创建指向链表结点的指针 void InitList(LinkList& L){L=new LNode;L->next=NULL;
}//创建链表(含头结点),顺便返回链表长度
int CreateList(LinkList& L){string no,name;float price;LinkList r=L;LinkList p;int elemCnt=0;while(1){//后插法创建链表cin>>no>>name>>price;if(no=="0" && name=="0" && price==0.0)break;else{p=new LNode;p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;r->next=p;r=p;elemCnt++;} } return elemCnt;
}void PrintList(LinkList& L,int n){LinkList p=L->next;cout<<n<<endl;while(p){cout<<fixed<<setprecision(2);cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;p=p->next;}}int main(){LinkList L;int n=0;InitList(L);n=CreateList(L);PrintList(L,n);return 0;
}
知识点
cout<<fixed<<setprecision(2);
需要添加头文件iomanip
这个用于精度控制(不然如果用%.2f,C和C++风格字符串混在一起也太乱糟了)
(顺便,C中其实是没有string的,如果定义了string,再用printf输出的话,要.c_str() )
基于链式存储结构的图书信息表的排序
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList;void InitList(LinkList& L){L=new LNode;L->next=NULL;
}int CreateList(LinkList& L){string no,name;float price;LinkList r,p;r=L;int len=0;while(1){cin>>no>>name>>price;if(no=="0" && name=="0" && price==0.0)break;p=new LNode; //不要漏掉! p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;r->next=p;r=p;len++;}return len;
}//排序
void SortList(LinkList& L,int n){LinkList p;for(int i=0;i<n-1;i++){p=L->next;int j=0;while(p && j<n-1-i){if(p->data.price<p->next->data.price){Book b=p->data;p->data=p->next->data;p->next->data=b;}p=p->next;j++;}}} void PrintList(LinkList& L){LinkList p=L->next;while(p){cout<<fixed<<setprecision(2);cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;p=p->next;}
}int main(){LinkList L;InitList(L);int len=CreateList(L);SortList(L,len);PrintList(L);
}
知识点
对于链表的冒泡排序:(在创建链表时顺便就得到了链表长度,不用再额外遍历一遍了)
另:对定义链表的语句理解:
之后写LinkList L,L就是一个LinkList类型的指针,相当于一个指向链表结点的指针,包括在遍历时用到的辅助指针p等,都是这个类型的。
若想往结点里存数据,那么就先要为它开辟空间,所以常有这样的定义语句:
LinkList p;
p=new LNode;
基于链式存储结构的图书信息表的修改
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList;void InitList(LinkList& L){L=new LNode;L->next=NULL;
}int CreateList(LinkList& L,float &sum){string no,name;float price;LinkList r,p;r=L;int len=0;while(1){cin>>no>>name>>price;if(no=="0" && name=="0" && price==0.0)break;p=new LNode; //不要漏掉! p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;r->next=p;r=p;len++;sum+=price;}return len;
}void ModifyList(LinkList& L,float avg){LinkList p=L->next;while(p){if(p->data.price<avg)p->data.price*=1.2;elsep->data.price*=1.1;p=p->next;}
} void PrintList(LinkList& L){LinkList p=L->next;while(p){cout<<fixed<<setprecision(2);cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;p=p->next;}
}int main(){LinkList L;InitList(L);float sum=0.0;int len=CreateList(L,sum);float avg=sum/(float)len;cout<<fixed<<setprecision(2);cout<<avg<<endl;ModifyList(L,avg);PrintList(L);
}
基于链式存储结构的图书信息表的逆序存储(链表逆序就用头插法实现即可,很简单)
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList;void InitList(LinkList& L){L=new LNode;L->next=NULL;
}void CreateList(LinkList& L){int n;cin>>n; //链表长度 string no,name;float price;LinkList r,p;int cnt=0;while(cnt<n){cin>>no>>name>>price;p=new LNode; //不要漏掉! p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;//头插法实现逆序存储r=L->next;L->next=p;p->next=r; cnt++;}
}void PrintList(LinkList& L){LinkList p=L->next;while(p){cout<<fixed<<setprecision(2);cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;p=p->next;}
}int main(){LinkList L;InitList(L);float sum=0.0;CreateList(L);PrintList(L);
}
查找最贵图书
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList;void InitList(LinkList& L){L=new LNode;L->next=NULL;
}//返回最高图书价格
float CreateList(LinkList& L){int n;cin>>n; //链表长度 string no,name;float price;float max=0.0; LinkList r,p;r=L; //等于L比较好,如果等于L->next,之后会出现r=p->next的情况,这时候r的next就不太好了 int cnt=0;while(cnt<n){cin>>no>>name>>price;p=new LNode; //不要漏掉! p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;if(price>max)max=price;r->next=p;r=p;cnt++;}return max;
}//返回最贵图书的数量
int TraverseList(LinkList&L,float max){LinkList p=L->next;int cnt=0;while(p){if(p->data.price==max)cnt++; p=p->next;}return cnt;
}void PrintList(LinkList& L,float max){LinkList p=L->next;while(p){cout<<fixed<<setprecision(2);if(p->data.price==max){cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;}p=p->next;}
}int main(){LinkList L;InitList(L);float max=CreateList(L);cout<<TraverseList(L,max)<<endl;PrintList(L,max);
}
查找最爱图书(同顺序表,用一个数组存储待查序列,代码写的比较乱功能封装的也不好,摆烂..)
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList;void InitList(LinkList& L){L=new LNode;L->next=NULL;
}//返回最高图书价格
void CreateList(LinkList& L){int n;cin>>n; //链表长度 string no,name;float price;LinkList r,p;r=L; //等于L比较好,如果等于L->next,之后会出现r=p->next的情况,这时候r的next就不太好了 int cnt=0;while(cnt<n){cin>>no>>name>>price;p=new LNode; //不要漏掉! p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;r->next=p;r=p;cnt++;}
}//返回最爱图书的数量
int TraverseList(LinkList&L,string love){LinkList p=L->next;int cnt=0;while(p){if(p->data.name==love)cnt++; p=p->next;}return cnt;
}void PrintList(LinkList& L,string love){LinkList p=L->next;while(p){cout<<fixed<<setprecision(2);if(p->data.name==love){cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;}p=p->next;}}int main(){LinkList L;InitList(L);CreateList(L);int num;cin>>num;string love[num];for(int j=0;j<num;j++)cin>>love[j]; for(int i=0;i<num;i++){if(TraverseList(L,love[i])!=0){cout<<TraverseList(L,love[i])<<endl;PrintList(L,love[i]); }else cout<<"Sorry,there is no your favourite!"<<endl;}}
基于链式存储结构的图书信息表的最佳位置图书的查找
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList;void InitList(LinkList& L){L=new LNode;L->next=NULL;
}int CreateList(LinkList& L){int n;cin>>n; //链表长度 string no,name;float price;LinkList r,p;r=L; //等于L比较好,如果等于L->next,之后会出现r=p->next的情况,这时候r的next就不太好了 int cnt=0;while(cnt<n){cin>>no>>name>>price;p=new LNode; //不要漏掉! p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;r->next=p;r=p;cnt++;}return n;
}//返回最爱图书的数量
int TraverseList(LinkList&L,string love){LinkList p=L->next;int cnt=0;while(p){if(p->data.name==love)cnt++; p=p->next;}return cnt;
}void PrintList(LinkList& L,int place,int n){if(place<1||place>=n)cout<<"Sorry,the book on the best position doesn't exist!"<<endl;else{LinkList p=L->next;int index=0;while(p){cout<<fixed<<setprecision(2);if(index==place-1){cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;break;}p=p->next;index++;}}}int main(){LinkList L;InitList(L);int n=CreateList(L);int searchNum; //要查找的图书的数目cin>>searchNum;int place[searchNum];for(int i=0;i<searchNum;i++){cin>>place[i];} for(int i=0;i<searchNum;i++){PrintList(L,place[i],n);}}
接下来是入库出库(即插入删除)
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList; //这样typedef,可以在后期比较方便地创建指向链表结点的指针 void InitList(LinkList& L){L=new LNode;L->next=NULL;
}//创建链表(含头结点),顺便返回链表长度
int CreateList(LinkList& L){int elemCnt;cin>>elemCnt;string no,name;float price;LinkList r=L;LinkList p;for(int i=0;i<elemCnt;i++){//后插法创建链表cin>>no>>name>>price;p=new LNode;p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;r->next=p;r=p;} return elemCnt;
}//插入链表
bool InsertList(LinkList& L,int n,int place,Book b){bool flag=true;if(place<1 || place>n){cout<<"Sorry,the position to be inserted is invalid!"; flag=false; }else{LinkList p=L; int cnt=0;while(cnt<place-1 && p){p=p->next; //找到要插入位置的前一个cnt++; }//已找到位置LinkList q=new LNode;q->data.no=b.no;q->data.name=b.name;q->data.price=b.price;q->next=NULL;q->next=p->next;p->next=q;}return flag;
} void PrintList(LinkList& L){LinkList p=L->next;while(p){cout<<fixed<<setprecision(2);cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;p=p->next;}}int main(){LinkList L;InitList(L);int n=CreateList(L);int place;cin>>place;Book b;cin>>b.no>>b.name>>b.price;if(InsertList(L,n,place,b))PrintList(L);return 0;
}
知识点
当设计插入、删除这些操作时,因为要输出不合法的情况,所以可以为插入删除函数设置一个bool类型的返回值
下面是出库(搞清楚链表怎么插入怎么删除就行很简单)
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList; //这样typedef,可以在后期比较方便地创建指向链表结点的指针 void InitList(LinkList& L){L=new LNode;L->next=NULL;
}//创建链表(含头结点),顺便返回链表长度
int CreateList(LinkList& L){int elemCnt;cin>>elemCnt;string no,name;float price;LinkList r=L;LinkList p;for(int i=0;i<elemCnt;i++){//后插法创建链表cin>>no>>name>>price;p=new LNode;p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;r->next=p;r=p;} return elemCnt;
}//删除链表
bool DeleteList(LinkList& L,int n,int place){bool flag=true;if(place<1 || place>n){cout<<"Sorry,the position to be deleted is invalid!"; flag=false; }else{LinkList p=L; int cnt=0;while(cnt<place-1 && p){p=p->next; //找到要插入位置的前一个cnt++; }//已找到位置LinkList tmp=p->next;p->next=tmp->next; free(tmp);}return flag;
} void PrintList(LinkList& L){LinkList p=L->next;while(p){cout<<fixed<<setprecision(2);cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;p=p->next;}}int main(){LinkList L;InitList(L);int n=CreateList(L);int place;cin>>place;if(DeleteList(L,n,place))PrintList(L);return 0;
}
图书去重
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>typedef int status;#define OK 1using namespace std;typedef struct{string no;string name;float price;
}Book;typedef struct LNode{Book data;struct LNode* next;
}LNode,*LinkList; //这样typedef,可以在后期比较方便地创建指向链表结点的指针 void InitList(LinkList& L){L=new LNode;L->next=NULL;
}//创建链表(含头结点),顺便返回链表长度
int CreateList(LinkList& L){int elemCnt;cin>>elemCnt;int realCnt=elemCnt;string no,name;float price;LinkList r=L;LinkList p;LinkList tmp;for(int i=0;i<elemCnt;i++){//后插法创建链表cin>>no>>name>>price;tmp=L->next;bool ifInsert=true;while(tmp){if(tmp->data.no==no){cout<<"有重名"<<endl;realCnt--;ifInsert=false;}tmp=tmp->next;}if(ifInsert){p=new LNode;p->data.no=no;p->data.name=name;p->data.price=price;p->next=NULL;r->next=p;r=p;cout<<"成功插入"<<endl;}} return realCnt;
}void PrintList(LinkList& L){LinkList p=L->next;while(p){cout<<fixed<<setprecision(2);cout<<p->data.no<<" "<<p->data.name<<" "<<p->data.price<<endl;p=p->next;}}int main(){LinkList L;InitList(L);cout<<CreateList(L)<<endl;PrintList(L);return 0;
}