#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
struct Book
{
char number[8];//图书编号
char name[20];//书名
float price;//价格
char press[20];//出版商
};
typedef struct LNode
{
Book data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
int length;
Status InitList_L(LinkList &L) //单链表的初始化
{
L = new LNode; //新结点作为头结点
L->next = NULL; //令头结点的指针域为空
return 1;
}
Status ListInsert_L(LinkList &L, int i, Book &e) //单链表的插入
{
int j;
LinkList p, s;
p = L;
j = 0;
while (p && j < i - 1)
{
p = p->next;
++j;
}//查找第i-1个结点,p指向该结点
if (!p || j > i - 1)
return 0; //i>n+1或者i<1
s = new LNode; //创建新结点
s->data = e; //将新结点的数据域置为e
s->next = p->next; //将新结点的指针域指向结点p
p->next = s; //将结点p的指针域指向结点s
++length;
return 1;
}
Status ListDelete_L(LinkList &L, int i) // 单链表的删除
{
LinkList p, q;
int j;
p = L;
j = 0;
while ((p->next) && (j < i - 1)) //查找第i-1个结点,p指向该结点
{
p = p->next;
++j;
}
if (!(p->next) || (j > i - 1))
return 0; //当i>n或i<1时,不合理
q = p->next; //临时保存地址以备释放
p->next = q->next; //改变删除结点前驱结点的指针域
delete q; //释放删除结点的空间
--length;
return 1;
}
int main()
{
int a, n,m;
double price;
Book e;
LinkList L, p;
printf(" 欢迎使用图书管理系统 ");
printf(" 1.插入图书信息 ");
printf(" 2.删除图书信息 ");
printf(" 3.输出图书信息 ");
printf(" 0.退出管理系统 ");
m = -1;
while (m != 0)
{
printf("请选择你所需要的功能:");
scanf("%d",&m);
switch (m)
{
case 1: //插入图书信息
printf("请输入插入的位置和书的信息,包括:图书编号 书名 价格 出版商: ");
scanf("%d",&a);
scanf("%c %c %f",&e.number,&e.name,&e.price,&e.press);
if (ListInsert_L(L, a, e))
printf("图书信息插入成功. ");
else
printf("图书信息插入失败! ");
break;
case 2: //删除图书信息
printf("请输入所要删除的图书信息的位置:");
scanf("%d",&a);
if (ListDelete_L(L, a))
printf("图书信息删除成功! ");
else
printf("图书信息删除失败! ");
break;
case 3: //输出图书信息
printf("当前图书系统信息: ");
p = L->next;
}
}
}