本文是依据数据结构习题解析与实验指导(李冬梅)一书中的第一个实验–基于线性表的图书信息管理系统所写的。
之所以写这个,是因为这个实验不仅涉及到线性表的结构设计,还包括一些线性表的基本操作,个人认为,做完这个实验,基本上对线性表就有一个基本的了解的。
本文采用编程语言为C
先说一下题目简介,自己设计一张图书信息表,包括以下10项常用的基本操作:图书信息表的创建和输出、排序、修改、逆序村春、最贵图书的查找、最爱图书的查找、最佳位置图书的查找、新图书的入库、旧图书的出库、图书去重。
要求分别用顺序存储结构和链式存储结构来实现。
1.首先说一下定义的结构:
#include
#include
#define MAXSIZE 20
typedef struct{
char number[100];
char name[100];
float price;
}information;
typedef struct Node{
information date[MAXSIZE];
int length;
}table;
2.初始化操作
table Init(){
table t;
t.length=0;
return t;
}
还有显示操作:
void ShowTable(table *T){
ChangePrice(T);
for(int i=0;i<T->length;++i){
printf("%s %s %.2f\n",T->date[i].number,T->date[i].name,T->date[i].price);
}
}
3.表的创建和输出(因为输入是有一定的格式的,详情请看书,本人有点懒,没有搜到相关pdf,又不喜欢打字,就辛苦你们了)输入以0 0 0 结束
void CreateTable(table *T){
for(int i=T->length;;++i){
scanf("%s %s %f",&T->date[i].number,&T->date[i].name,&T->date[i].price);
if(T->date[i].number[0]=='0'){
break;
}
else{
T->length++;
}
}
}
4.表的排序(按照图书价格降序排列)
void SortTable(table *T){
for(int i=0;i<T->length;++i){
for(int j=i+1;j<T->length;++j){
if(T->date[i].price<T->date[j].price){
information temp;
temp=T->date[i];
T->date[i]=T->date[j];
T->date[j]=temp;
}
}
}
}
5.表的修改(修改图书相应的价格,这里不厚道的)
void ChangePrice(table *T){
float sum=0;
for(int i=0;i<T->length;++i){
sum+=T->date[i].price;
}
float average = sum/T->length;
for(int i=0;i<T->length;++i){
if(T->date[i].price>=average){
T->date[i].price*=1.1;
}else{
T->date[i].price*=1.2;
}
}
}
6.最贵图书查找(输出相关信息,要是有相同价格的都输出)
void TheMostExpensive(table *T){
float Maxprice=0;
int index;
for(int i=0;i<T->length;++i){
if(Maxprice<T->date[i].price){
Maxprice=T->date[i].price;
index=i;
}
}
int i=index;
printf("%s %s %.2f\n",T->date[i].number,T->date[i].name,T->date[i].price);
}
7.根据名字进行图书查找(第一个输入为查找的个数,然后是书名,找到输出,没找到反馈信息,还要输出找到的个数)
void SearchByName(table *T,int n){
int temp[n];
int cnt=0;
for(int i=0;i<n;i++){
char sttr[MAXSIZE];
scanf("%s",sttr);
for(int j=0;j<T->length;++j){
if(strcmp(sttr,T->date[j].name)==0){
temp[cnt++]=j;
break;
}
if(j==T->length-1){
printf("抱歉,没有你的喜爱\n");
}
}
}
printf("%d\n",cnt);
for(int k=0;k<cnt;++k){
printf("%s %s %.2f\n",T->date[temp[k]].number,T->date[temp[k]].name,T->date[temp[k]].price);
}
}
8.添加新图书(输入:位置,图书相关信息)
void InsertNewDate(table *T,int n){
T->length++;
information temp;
scanf("%s %s %f",&temp.number,&temp.name,&temp.price);
for(int j=T->length-1;j>n-1;j--){
T->date[j]=T->date[j-1];
}
T->date[n-1]=temp;
}
9.图书出库(输入: 位置)
void DeleteInformation(table *T,int n){
if(n>T->length||n<0){
printf("输入有误");
return ;
}
else{
for(int i=n-1;i<T->length;i++){
T->date[i]=T->date[i+1];
}
T->length--;
}
}
10.最佳位置图书(就是根据索引,找图书,输入: 搜索个数n,位置*n)
void BestPostion(table *T,int n){
int number=0;
for(int i=0;i<n;i++){
scanf("%d",&number);
number-=1;
if(number>T->length-1||number<0){
printf("抱歉,最佳位置上的图书不存在!");
}
else{
printf("%s %s %.2f\n",T->date[number].number,T->date[number].name,T->date[number].price);
}
}
}
11图书去重(删除书号重复的图书)
void DeleteRepeatInformation(table *T)
{
int flag;
for(int i=0;i<T->length;++i){
for(int j=i+1;j<T->length;j++){
if(strcmp(T->date[i].name,T->date[j].name)==0){
//printf("%d\n",j);
DeleteInformation(T,j+1);
j=j-1;
}
}
}
}
12.main函数的相关调用
int main()
{
freopen("2.txt","r",stdin);
table t=Init();
table *test=&t;
CreateTable(test);
DeleteRepeatInformation(test);
ShowTable(test);
//SearchByName(test,2);
//TheMostExpensive(test);
return 0;
}
1.相关结构
#include
#include
#define MAXSIZE 20
typedef struct Node
{
char number[100];
char name[100];
float price;
struct Node *next;
}Node,*LinkList;
2.初始化操作(这里初始化就是生成一个头)
LinkList L=(LinkList)malloc(sizeof(Node));
展示链表:
void ShowLinkList(LinkList L){
LinkList p=L->next;
while(p!=NULL){
printf("%s %s %.2f\n",p->number,p->name,p->price);
p=p->next;
}
}
3.创建表(n为创建信息的数目)
void CreateLinkList(LinkList L,int n){
LinkList p=L;
while(n>0){
LinkList temp=(LinkList)malloc(sizeof(Node));
scanf("%s %s %f",&temp->number,&temp->name,&temp->price);
if(strcmp(temp->name,"0")==0)
{
free(temp);
}else{
temp->next=NULL;
p->next=temp;
p=p->next;
}
n--;
}
}
4.表的排序
void SortLinkList(LinkList L){
LinkList p2=L;
int flag=0;
while(p2->next!=NULL){
LinkList p=p2;
float minPrice=10000;
LinkList point=NULL;
while(p->next!=NULL){
if(p->next->price<minPrice){
minPrice=p->next->price;
point=p;
}
p=p->next;
}
LinkList temp=point->next;
point->next=temp->next;
temp->next=L->next;
L->next=temp;
if(flag==0){
p2=p2->next;
flag=1;
}
}
}
5.表逆序存储
void ReverseLinkList(LinkList L){
LinkList p=L->next->next;
L->next->next=NULL;
while(p!=NULL){
LinkList temp=p->next;
p->next=L->next;
L->next=p;
p=temp;
}
}
6.最贵图书查找
void MostExpensivePrice(LinkList L){
SortLinkList(L);
float maxPrice=L->next->price;
LinkList p=L->next->next;
int cnt=1;
while(p->price==maxPrice){
cnt++;
p=p->next;
}
printf("%d\n",cnt);
p=L->next;
while(cnt>0){
printf("%s %s %.2f\n",p->number,p->name,p->price);
p=p->next;
cnt--;
}
}
7.新图书入库(n为位置)
void InsertNewInformation(LinkList L,int n){
LinkList p=L;
while(n-->1){
p=p->next;
}
LinkList temp=(LinkList)malloc(sizeof(Node));
scanf("%s %s %f",&temp->number,&temp->name,&temp->price);
temp->next=p->next;
p->next=temp;
}
8.旧图书出库(n为位置)
void DeleteInformation(LinkList L,int n){
LinkList p=L;
while(n-->1){
p=p->next;
}
LinkList temp=p->next;
p->next=temp->next;
free(temp);
}
因为很多操作比较简单,又和前面顺序存储表类似,就没写,各种操作的要求是一样的。
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础第二版 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与技术应用 26.00
9787810827430 工业计算机控制技术原理与应用 31.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
到这里,就结束了,首先说因为初学,代码写的很不好,但是确实可以实现这些功能,如果觉得代码哪里写的不好的可以在下方评论,我看到了会及时更改的。