#include <malloc.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define len sizeof(LNode)
typedef struct
{
int no; //8位书号
char name[20]; //书名
int price; //定价
}Book;
typedef struct LNode
{
Book data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
int d=0;
void CreateList(LinkList &L){ //输入书本信息
int i,n;
LNode *r,*p;
if(!d){
printf("要输入的图书数为:");
scanf("%d",&n);
L=new LNode;
L->next=NULL;
r=L;
for (i=0;i<n;++i)
{
p=new LNode;
for(i=1;i<=n;i++){ //通过n控制输入书本数
printf("请输入第%d本图书信息:\n",i);
printf("书号:");
scanf("%d",&p->data.no);
printf("书名:");
scanf("%s",p->data.name);
printf("定价:");
scanf("%d",&p->data.price);
}
p->next=NULL;r->next=p;
d=1;
}
}else
{printf("已输入完毕,请插入信息!"); //每次执行程序只能生成一次链表,之后只能进行插入、删除操作
getch();}
}
void Findname(LinkList L){ //根据书名进行查找
char ch[10];
int d2=0;
LNode *p;
p=L->next;
printf("请输入书名:");
scanf("%s",ch);
while(p){
if(strcmp(p->data.name,ch)==0) //判断和查询书名是否相等
{printf("书号:%d 书名:%s 定价:%d",p->data.no,p->data.name,p->data.price);
d2=1;
getch();}
p=p->next;
}
if(!d2)
{ printf("没有该书本信息!");
getch();}
}
void Getlocation(LinkList L){ //根据指定位置进行查找
LNode *p=L;
p=p->next;
int i=1,pos;
printf("请输入书号:");
getch();
scanf("%d",&pos);
while(p && i<pos)
{
p=p->next;
i++;
}
if(!p || i>pos)
printf("该位置不存在!\n");
else
{
printf("该位置书的信息为: \n");
printf("书号: %d\n",p->data.no);
printf("书名: %s\n",p->data.name);
printf("定价: %d\n",p->data.price);
}
getch();
}
void ListInsert(LinkList&L){ //插入图书信息到指定位置
Book b;
int pos;
printf("请输入图书插入的位置: ");
scanf("%d",&pos);
printf("请输入要插入图书的信息: \n");
printf("请输入书号: ");
scanf("%d",&b.no);
printf("请输入书名: ");
scanf("%s",b.name);
printf("请输入定价: ");
scanf("%d",&b.price);
LNode *p=(LNode*)malloc(sizeof(LNode));
strcpy(p->data.name,b.name);
p->data.no=b.no;
p->data.price=b.price;
p->next=NULL;
int i=1;
LNode *q=L;
while(q && i<=pos-1) //找到pos
{
q=q->next;
++i;
}
if(!q || i-1>=pos)
printf("该位置不存在!插入失败!\n");
else
{
p->next=q->next;
q->next=p;
}
getch();
}
void ListDelete_L(LinkList &L){ //删除指定位置的图书记录
int i=1,pos;
LNode *q=L;
printf("请输入删除书本位置:");
scanf("%d",&pos);
while(q && i<=pos-1) //找到pos
{
q=q->next;
++i;
}
if(!q || i>pos)
printf("该位置不存在!删除失败!\n"); //容错处理,删除位置不合理
else
{
LNode *p=q->next;
q->next=p->next;
delete p; //删除并释放结点
printf("已将原表中第%d个书本信息删除!",pos);
}
getch();
}
int Count(LinkList L) //统计表中图书个数
{
int count=0;
LNode *p=L;
while(p->next)
{
p=p->next;
++count;
}
return count;
}
void Print(LinkList L){ // 显示所有图书信息
LNode *p=L;
int i=1;
while (p->next)
{
p=p->next;
printf("第%d本书:\n",i);
printf("书号: %d",p->data.no);
printf("书名: %s",p->data.name);
printf("定价: %d",p->data.price);
printf("\n");
i++;
}
getch();
}
void main(){
LinkList L;
char c;
int e=0;
while(1){
system("cls");
printf("**************************** 欢迎使用学生信息查询系统!*************************\n");//菜单选项
printf("\n");
printf("(1)输入书本信息;\n");
printf("(2)根据书名进行查找;\n");
printf("(3)根据指定位置进行查找;\n");
printf("(4)插入图书信息到指定位置;\n");
printf("(5)删除指定位置的图书记录;\n");
printf("(6)统计表中图书个数;\n");
printf("(7)显示所有图书信息;\n");
printf("(8)退出系统.\n");
printf("\n");
c=getch();
switch(c){
case '1':CreateList(L);
e=d;
break;
case '2':if(e)Findname(L); //通过b1的值,控制先执行(1)的操作,即生成链表
else
{printf("请先输入书本信息!");
getch();};break;
case '3':if(e)Getlocation(L); //通过b1的值,控制先执行(1)的操作,即生成链表
else
{printf("请先输入书本信息!");
getch();};break;
case '4':if(e)ListInsert(L); //通过b1的值,控制先执行(1)的操作,即生成链表
else
{printf("请先输入书本信息!");
getch();};break;
case '5':if(e)ListDelete_L(L); //通过b1的值,控制先执行(1)的操作,即生成链表
else
{printf("请先输入书本信息!");
getch();};break;
case '6':if(e)
{printf("图书个数为: %d",Count(L)); //通过b1的值,控制先执行(1)的操作,即生成链表
getch();}
else
{printf("请先输入书本信息!");
getch();};break;
case '7':if(e)Print(L); //通过b1的值,控制先执行(1)的操作,即生成链表
else
{printf("请先输入书本信息!");
getch();};break;
case '8':
exit(0);
break;
default :printf("输入错误,请重新选择!");
getch();
}
}
}
评论0