图书管理系统
#include "link.h"
int main(int argc, const char *argv[])
{
int k, n, ch;
char aa[20];
book b2[20];
Plink L= create();
while(1)
{
printf("\t\t\t1. 前端添加书本\n");
printf("\t\t\t2. 后端添加书本\n");
printf("\t\t\t3. 任意位置添加书本\n");
printf("\t\t\t4. 任意位置删除书本\n");
printf("\t\t\t5. 搜索任意位置书本\n");
printf("\t\t\t6. 搜索任意编号书本\n");
printf("\t\t\t7. 修改任意位置书本\n");
printf("\t\t\t8. 借出任意书本\n");
#if 0
printf("\t\t\t7. 表头删除学生\n");
printf("\t\t\t8. 表尾删除学生\n");
printf("\t\t\t9. 去除重复学生\n");
printf("\t\t\t10. 按姓名查找学生并返回位置\n");
printf("\t\t\t11. 按照学号从小到大排列顺序\n");
printf("\t\t\t12. 按照学号查找返回学生位置\n");
printf("\t\t\t13. 按年龄查找并修改\n");
printf("\t\t\t14. 按位置查找并修改\n");
#endif
scanf("%d", &ch);
switch(ch)
{
case 1:
printf("输入要添加的书本数量\n");
scanf("%d", &n);
for(int i=0; i<n; i++)
{
printf("输入第%d本书信息(书本id 书名 借出状态(新书为0)):", i+1);
scanf("%d%s%d", &b2[i].id, b2[i].name, &b2[i].status);
front_insert(L, b2[i]);
}
output_link(L);
break;
case 2:
rear_insert(L);
output_link(L);
break;
case 3:
printf("输入要插入的位置:");
scanf("%d", &k);
any_insert(L, k);
output_link(L);
break;
case 4:
printf("输入要删除的位置:");
scanf("%d", &k);
any_delete(L, k);
output_link(L);
break;
case 5:
printf("输入要搜索的位置:");
scanf("%d", &k);
search_any(L, k);
case 6:
printf("输入要搜索的书本名:");
scanf("%s", aa);
case 7:
printf("输入要修改的位置:");
scanf("%d", &k);
change_any(L, k);
case 8:
printf("输入要借的书本id:");
scanf("%d", &k);
borrow(L, k);
output_link(L);
}
}
return 0;
}
main.c
#include "link.h"
Plink create()//创建头结点
{
Plink p = malloc(sizeof(re_link));
if(NULL==p)
{
printf("申请节点失败\n");
return NULL;
}
p->len = 0;
p->next = NULL;
return p;//返回头结点
}
int front_insert(Plink L, book x)
{
if(L==NULL)
{
printf("创建失败,单向链表不存在\n");
return -1;
}
Plink p = malloc(sizeof(re_link));//申请新节点
p->b1=x;
p->next = L->next;//连线右边
L->next = p;//连线左边
L->len++;
return 0;
}
int output_link(Plink L)
{
int i;
Plink t = L;
for(i=0; i<L->len; i++)
{
t = t->next;
if(t->b1.status==0)
{
printf("id %d\tname %s\tstatus %d\n", t->b1.id, t->b1.name, t->b1.status);
}
if(t->b1.status==1)
{
printf("id %d\tname %s\tstatus %d\tborrower name %s\tborrowed time%ld\n", t->b1.id, t->b1.name, t->b1.status, t->b1.b_name, t->b1.timep);
}
}
printf("\n");
return 0;
}
int output_one(Plink L, int n)
{
Plink t = L;
for(int i=0; i<n; i++)
{
t = t->next;
}
if(t->b1.status==0)
{
printf("%d\t%s\t%d\n", t->b1.id, t->b1.name, t->b1.status);
}
if(t->b1.status==1)
{
printf("%d\t%s\t%d\t%s\t%ld\n", t->b1.id, t->b1.name, t->b1.status, t->b1.b_name, t->b1.timep);
}
}
int rear_insert(Plink L)
{
Plink t = L;
if(L==NULL)
{
printf("创建失败,单向链表不存在\n");//申请新节点
return -1;
}
for(int i=0; i<L->len; i++)
{
t = t->next;
}
Plink p = malloc(sizeof(re_link));
printf("输入书本信息(书本id 书名 借出状态(新书为0)):");
scanf("%d%s%d", &p->b1.id, p->b1.name, &p->b1.status);
p->next = NULL;
t->next = p;
L->len++;
return 0;
}
int any_insert(Plink L, int pos)
{
if(pos<1||pos>L->len+1||L==NULL)
{
printf("创建失败,单向链表不存在\n");//申请新节点
return -1;
}
Plink t = L;
for(int i=1; i<pos; i++)
{
t = t->next;
}
Plink p = malloc(sizeof(re_link));
printf("输入书本信息(书本id 书名 借出状态(新书为0)):");
scanf("%d%s%d", &p->b1.id, p->b1.name, &p->b1.status);
p->next = t->next;
t->next = p;
L->len++;
return 0;
}
int any_delete(Plink L, int pos)
{
if(pos<1||pos>L->len||L==NULL)
{
printf("创建失败,单向链表不存在\n");//申请新节点
return -1;
}
Plink t = L;
for(int i=1; i<pos; i++)
{
t = t->next;
}
Plink Q = t->next;//定义结构体类型指针Q指向要删除的节点
t->next = t->next->next;//左边接线到右边,跳过Q
L->len--;//长度减一
free(Q);//释放删除的节点
Q = NULL;//删除的节点指针置空
printf("删除成功\n");
return 0;
}
int search_any(Plink L, int pos)
{
if(pos<1||pos>L->len||L==NULL)
{
printf("创建失败,单向链表不存在\n");//申请新节点
return -1;
}
Plink t = L;
for(int i=1; i<pos; i++)
{
t = t->next;
}
printf("该位置书本为");
output_link(L);
}
int search_name(Plink L, char aa[20])
{
Plink t = L;
for(int i=1; i<L->len+1; i++)
{
t = t->next;
if(strcmp(aa, t->b1.name)==0)
{
printf("该书存在");
}
}
}
int change_any(Plink L, int pos)
{
if(pos<1||pos>L->len||L==NULL)
{
printf("创建失败,单向链表不存在\n");//申请新节点
return -1;
}
Plink t = L;
for(int i=1; i<pos; i++)
{
t = t->next;
}
printf("输入书本信息(书本id 书名 借出状态(新书为0)):");
scanf("%d%s%d", &t->next->b1.id, t->next->b1.name, &t->next->b1.status);
return 0;
}
int borrow(Plink L, int e)
{
Plink t = L;
char yn='1', y='y', n='n';
time(&t->b1.timep);
struct tm *now;
now=localtime(&t->b1.timep);
for(int i=0; i<L->len; i++)
{
t = t->next;
if(e==t->b1.id)
{
printf("该书存在\n");
if(t->b1.status==0)
{
printf("%d\t%s\t%d\n", t->b1.id, t->b1.name, t->b1.status);
printf("是否要借出该书?(y/n)");
scanf("%c", &yn);
if(yn==y)
{
t->b1.status=1;
printf("请输入借书人名字");
scanf("%s", t->b1.b_name);
printf("借出成功!借书时间为:%s\n", asctime(now));
t->b1.timep = asctime(now);
output_one(L, i);
break;
}
if(yn==n)
{
break;
}
}
if(t->b1.status==1)
{
printf("%d\t%s\t%d\t%s\t\n", t->b1.id, t->b1.name, t->b1.status, t->b1.b_name);
}
}
}
return 0;
}
link.c
#ifndef _LINK_H_
#define _LINK_H_
#include <myhead.h>
#include <time.h>
typedef struct
{
int id;//书编号
char name[20];//书名
int status;//书借出状态
char b_name[20];//借书人名字
time_t timep;//借书时间
}book;
typedef struct library
{
union
{
int len;//用于头结点,存储长度
book b1;
};
struct library *next;//指针域
}re_link, *Plink;
Plink create();
int front_insert(Plink, book);
int output_link(Plink);
int output_one(Plink, int);
int rear_insert(Plink);
int any_insert(Plink, int);
int any_delete(Plink, int);
int search_any(Plink, int);
int search_name(Plink, char*);
int change_any(Plink, int);
int borrow(Plink, int);
#endif
link.h