一个小型图书馆系统的图书管理分系统中,一本图书的信息包括图书的编号(code),书名(title)和借阅人(reader)。图书列表可以用一个链表来实现。请按要求完成相应的函数。
注意:链表头结点的位置为0,第一个数据结点的位置为1
注意:链表头结点的位置为0,第一个数据结点的位置为1
输入要求
首先输入图书数量n,并输入n本图书的信息,包括书籍编号,书名和借阅人(以id表示),数据之间以空格分隔。
然后,输入命令编码及所需信息。详见代码及样例输入。
输出要求
见样例输出。空表不输出任何信息。
测试数据
输入示例
5
1000 aaa 1002
2000 bbb -1
3000 ccc 0
4000 ddd 4001
5000 eee 5001
2 0 6000 fff -1
2 6 6000 fff -1
3 7
3 1
4 1000 1000
4 2000 2000
4 3000 3000
5 6000
5 5000
1
-1
#include <stdio.h>
#include <stdlib.h>
#define NAMELEN 20 // 名字最长字符数
typedef struct { // 代表一本书的结构体
int code; // 编号
char title[NAMELEN]; // 书名
int reader; // 借阅人,以读者的id表示
}Book;
typedef struct BNode { // 图书结点
Book book;
struct BNode *next;
}BNode, *BookList;
// 根据用户输入,初始化n个图书的列表readers
// 如果一本没有被借阅,其借阅人以-1表示
// 该函数假设用户输入的数据是正确的
void init(BookList &blist, int n);
// 依次显示所有图书的信息。
// 如果某图书的编号为1000,书名为abc,被id为1001的读者借阅,
// 则该图书的输出信息为:1000|abc|1001(分行符)
// 如果某读者的编号为1000,书名为abc,没有被借阅,
// 则该图书的输出信息为:1000|abc|(分行符)
void displayall(BookList &blist);
// 将图书b插入图书列表blist中的第i个位置(从1开始)
// 成功返回1,失败返回0
int insert(BookList &blist, int i, Book b);
// 删除图书列表blist中的第i本书(从1开始)
// 成功返回1,失败返回0
int del(BookList &blist, int i);
// 编号为code的图书被id为 "id" 的读者借阅
// 成功返回1,失败返回0
int borrow(BookList &blist, int code, int id);
// 编号为code的图书被归还
// 成功返回1,失败返回0
int returnB(BookList &blist, int code);
int main()
{
// 变量声明
BookList blist; // 读者列表
// 临时变量
int n; // 初始图书个数
int cmd = 0; // 操作命令,-1表示退出
int result = 0; // 操作结果
int i = -1; // 位置(序号)
int code, id;
Book b;
// 初始化读者列表
scanf("%d", &n);
init(blist, n);
while (scanf("%d", &cmd) && cmd!=-1) { // 选择操作
switch (cmd) {
case 1: // 显示所有读者
displayall(blist);
break;
case 2: // 插入
scanf("%d", &i); // 序号
// 图书的编码、书名和借阅人(-1表示没有被借阅)。
scanf("%d%s%d", &b.code, b.title, &b.reader);
result = insert(blist, i, b);
if (result) printf("Succeed\n");
else printf("Failed\n");
break;
case 3: // 删除
scanf("%d", &i); // 序号
result = del(blist, i);
if (result) printf("Succeed\n");
else printf("Failed\n");
break;
case 4: // 借出
scanf("%d%d", &code, &id); // 书籍编码和借阅人id
result = borrow(blist, code, id);
if (result) printf("Succeed\n");
else printf("Failed\n");
break;
case 5: // 归还
scanf("%d", &code); // 书籍编码
result = returnB(blist, code);
if (result) printf("Succeed\n");
else printf("Failed\n");
break;
default:
printf("Unknown Command.\n");
break;
}
}
return 0;
}
**********************************************************************************************************************
#include <stdio.h>
#include <stdlib.h>
#define NAMELEN 20 // 名字最长字符数
typedef struct { // 代表一本书的结构体
int code; // 编号
char title[NAMELEN]; // 书名
int reader; // 借阅人,以读者的id表示
}Book;
typedef struct BNode { // 图书结点
Book book;
struct BNode *next;
}BNode, *BookList;
// 根据用户输入,初始化n个图书的列表readers
// 如果一本没有被借阅,其借阅人以-1表示
// 该函数假设用户输入的数据是正确的
void init(BookList &blist, int n);
// 依次显示所有图书的信息。
// 如果某图书的编号为1000,书名为abc,被id为1001的读者借阅,
// 则该图书的输出信息为:1000|abc|1001(分行符)
// 如果某读者的编号为1000,书名为abc,没有被借阅,
// 则该图书的输出信息为:1000|abc|(分行符)
void displayall(BookList &blist);
// 将图书b插入图书列表blist中的第i个位置(从1开始)
// 成功返回1,失败返回0
int insert(BookList &blist, int i, Book b);
// 删除图书列表blist中的第i本书(从1开始)
// 成功返回1,失败返回0
int del(BookList &blist, int i);
// 编号为code的图书被id为 "id" 的读者借阅
// 成功返回1,失败返回0
int borrow(BookList &blist, int code, int id);
// 编号为code的图书被归还
// 成功返回1,失败返回0
int returnB(BookList &blist, int code);
int main()
{
// 变量声明
BookList blist; // 读者列表
// 临时变量
int n; // 初始图书个数
int cmd = 0; // 操作命令,-1表示退出
int result = 0; // 操作结果
int i = -1; // 位置(序号)
int code, id;
Book b;
// 初始化读者列表
scanf("%d", &n);
init(blist, n);
while (scanf("%d", &cmd) && cmd!=-1) { // 选择操作
switch (cmd) {
case 1: // 显示所有读者
displayall(blist);
break;
case 2: // 插入
scanf("%d", &i); // 序号
// 图书的编码、书名和借阅人(-1表示没有被借阅)。
scanf("%d%s%d", &b.code, b.title, &b.reader);
result = insert(blist, i, b);
if (result) printf("Succeed\n");
else printf("Failed\n");
break;
case 3: // 删除
scanf("%d", &i); // 序号
result = del(blist, i);
if (result) printf("Succeed\n");
else printf("Failed\n");
break;
case 4: // 借出
scanf("%d%d", &code, &id); // 书籍编码和借阅人id
result = borrow(blist, code, id);
if (result) printf("Succeed\n");
else printf("Failed\n");
break;
case 5: // 归还
scanf("%d", &code); // 书籍编码
result = returnB(blist, code);
if (result) printf("Succeed\n");
else printf("Failed\n");
break;
default:
printf("Unknown Command.\n");
break;
}
}
return 0;
}
void init(BookList &blist, int n){
blist = new BNode[20];
blist->next = NULL;
BNode *r = blist;
for(int i=0;i<n;i++){
BNode *p= new BNode;
scanf("%d %s %d",&p->book.code,&p->book.title,&p->book.reader);
p->next = NULL;
r->next = p;
r = p;
}
}
void displayall(BookList &blist){
BNode *p = blist->next;
while(p){
if(p->book.reader == -1)
printf("%d|%s|\n", p->book.code,p->book.title);
else
printf("%d|%s|%d\n", p->book.code,p->book.title,p->book.reader);
p = p->next;
}
printf("\n");
}
int insert(BookList &blist, int i, Book b){
BNode *p = blist;
int j = 0 ;
while(p && (j<i-1))
{
p = p->next;
j++;
}
if(!p || j >i -1)
return 0;
BNode *s = new BNode;
s->book = b;
s->next = p->next;
p->next = s;
return 1;
}
int del(BookList &blist, int i){
BNode *p=blist;
int j = 0;
while((p->next) && (j<i - 1)){
p = p->next;
j++;
}
if(!(p->next) || (j>i-1))
return 0;
BNode *q = new BNode;
q = p->next;
p ->next = q->next;
delete q;
return 1;
}
int borrow(BookList &blist, int code, int id){
BNode *blist1 = blist;
blist1 = blist1->next;
while(blist1){
if(blist1->book.code == code){
if(blist1->book.reader == -1){
blist1->book.reader = id;
return 1;
}
else
return 0;
}
blist1 = blist1->next;
}
return 0;
}
int returnB(BookList &blist, int code){
BNode *blist1 = blist;
blist1 = blist1->next;
while(blist1){
if(blist1->book.code == code){
if(blist1->book.reader != -1){
blist1->book.reader = -1;
return 1;
}
}
blist1 = blist1->next;
}
return 0;
}