/*
图书信息包括图书的登陆号(长整型)、书名(字符串)、作者(字符串)和价钱(整型)。
要求具有以下功能:
(1) 创建图书信息表。从键盘读入完整的图书信息, 如果表创建失败,给出"创建表失败!"的提示信息。
(2) 分行显示所有图书信息的列表。(要有表头)
(3) 按书名查询图书信息。如果查找成功,显示所有该书名图书的作者和价钱,如果查找不成功,则给出"没有该读书!"的提示信息;
(4) 在指定位置插入新的图书记录,如果指定位置不合理,给出"插入位置错误,插入失败!"的提示信息;
*/
#include<string.h>
#include<stdio.h>
#include <stdlib.h>
typedef struct
{
long LandNumber;
char Name[20],Writer[10];
int Price;
}Book;
typedef struct
{
Book *elem;
int length;
int listsize;
}List;
Create(List *p)
{
p->elem= (Book *)calloc(100,sizeof(Book));
if (!(p->elem))
{
printf("申请图书信息存储空间失败");
exit(0);
}
p->length=0;
p->listsize=100;
}
InitList(List *p)
{
int i,a;
Book *e;
e=p->elem;
printf("下面创建一个图书信息表,请输入图书信息!/n");
printf("请输入要存储的图书的本数!/n");
while (scanf("%d",&a)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin); /*清空输入缓冲区*/
}
/*c=getchar();
a=(int)c;*/ /*用强制类型转换纠错*/
while (a>p->listsize||a<=0)
{
printf("输入有误,请重新输入!/n");
printf("请输入要存储的图书的本数!/n");
while (scanf("%d",&a)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
}
p->length=a;
for (i=0;i<p->length;i++)
{
printf("请输入图书登陆号/n");
while (scanf("%ld",&p->elem->LandNumber)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
printf("请输入书名/n");
scanf("%s",p->elem->Name);
printf("请输入作者姓名/n");
scanf("%s",p->elem->Writer);
printf("请输入价格/n");
while (scanf("%d",&p->elem->Price)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
(p->elem)++;
}
p->elem=e;
}
print(List *p)
{
int i;
Book *q;
q=p->elem;
printf("登陆号 书名 作者 价钱/n");
for (i=0;i<p->length;i++)
{
printf("%-15ld%-15s%-15s%-15d/n",q->LandNumber,q->Name,q->Writer,q->Price);
q++;
}
}
GetBook(List *p,char * ch)
{
int i;
Book *e;
e=p->elem;
if (p!=NULL)
{
for (i=1;i<p->length+1;i++)
{
if (strcmp(ch,p->elem->Name)==0)
{
printf("登陆号 书名 作者 价钱/n");
printf("%-15ld%-15s%-15s%-15d/n",p->elem->LandNumber,p->elem->Name,p->elem->Writer,p->elem->Price);
break;
}
p->elem++;
}
}
if (i==p->length+1) printf("没有该图书!/n");
p->elem=e;
}
int insert(List *l1,int n,int k) /*插入n本图书信息 在第k本图书前*/
{
int i,j;
Book *p,*q;
i=k;
if (i<1||i>l1->length+1||n<1) return 0;
if (l1->length>=l1->listsize) /*当前存储空间已满,增加分配*/
{
Book *newelem;
newelem=(Book *)realloc(l1->elem,(l1->listsize+n)*sizeof(Book));
if (newelem==NULL)
{
printf("当前存储空间已满,无法增加!");
return 1;
}
l1->elem=newelem;
l1->listsize+=n;
}
q=&(l1->elem[k-1]);
for (p=&(l1->elem[l1->length-1]);p>=q;p--) /*插入位置及之后元素右移*/
{
(p+n)->LandNumber=p->LandNumber ;
strcpy((p+n)->Name,p->Name);
strcpy((p+n)->Writer,p->Name);
(p+n)->Price=p->Price;
}
p++;
for (j=0;j<n;j++)
{
printf("下面插入第%d本图书,共插入%d本图书/n",j+1,n);
printf("请输入图书登陆号/n");
while (scanf("%ld",&p->LandNumber)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
printf("请输入书名");
while (scanf("%s",p->Name)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
printf("请输入作者姓名");
while (scanf("%s",p->Writer)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
printf("请输入价钱");
while (scanf("%d",&p->Price)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
p++;
l1->length++;
}
return 1;
}
void main()
{
int a,k,n,m;
char nam[20];
List list1;
List *l1;
l1=&list1;
Create(l1);
InitList(l1); /*动态输入图书信息*/
while (1)
{
printf("1.分行显示所有图书信息/n");
printf("2.按书名查询图书信息/n");
printf("3.在指定位置插入新的图书信息/n");
printf("4.退出!/n");
printf("请输入相关操作序号!/n");
while (scanf("%d",&a)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
if (a>=1&&a<=4)
{
switch (a)
{
case 1:
print(l1);
break;
case 2: /*查找图书*/
{
printf("请输入要查找的图书名/n");
scanf("%s",nam);
GetBook(l1,nam);
}
break;
case 3: /*在指定位置插入图书*/
{
printf("要插入几本图书信息?/n请输入");
while (scanf("%d",&n)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
printf("在第几个图书前插入一个图书信息?/n请输入");
while (scanf("%d",&k)!=1)
{
printf("输入有误,请重新输入!/n");
fflush(stdin);
}
m=insert(l1,n,k);
if (m==0) printf("插入错误,插入失败!/n");
}
break;
case 4:
exit(0);
}
}
else
{
printf("输入有误,请重新输入!/n");
}
}
}