书店有N本书,每本图书的信息包括ISBN编码、书名、单价、库存,要求编写整个程序,其中包括:
- 子函数1 creat,创建一个动态链表,从键盘读入所有图书的数据后,存储至链表中;
形式为:struct LNode *creat(void);
- 子函数2 seek,查找并输出链表中指定ISBN编码的图书信息;
形式为:void seek(struct LNode *head,char *code);
- 编写子函数del,将所有库存低于指定数量的图书从链表中删除。
形式为:struct LNode *del(struct LNode *head, int num);
其中:函数返回值为头指针的地址;
- 子函数4 append,将新进图书的信息添加到当前链表的末尾。
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(book)
typedef struct book
{
char ibsn[20];//ibsn的数目过长,因此用数组的形式存储
char name[20];//书名同上
int price;
int supply;
struct book *next;//常见的套路
}book;
int n;
book *creat(void)
{
book *head=NULL,*p1,*p2;//创建需要三个指针,头指针,主指针,辅助指针
n=0;//书的初始数目是0 ,便于后续进行增加或者减少
p1=p2=(book * )malloc(LEN);//开辟新的节点
cin>>p1->ibsn>>p1->name>>p1->price>>p1->supply;//读取书的相关信息(使用主指针p1实现信息的读取)
while(p1->ibsn[0]!='0')//对于读进来的数据进行初步的条件判断,ibsn码不是0的条件下进行如下循环
{
n++;//进行了初步的条件判断,书的数量+1
if(n==1)
head=p1;//如果书的数量是1,那么head和p1连着
else
p2->next=p1;//如果不是的话,进行常见的套路操作,辅助指针p2的末端接着主指针p1
p2=p1;//辅助指针p2跟上主指针p1
p1=(struct Student * )malloc(len);//再次用主指针进行开辟新的节点
cin>>p1->ibsn>>p1->name>>p1->price>>p1->supply;//读取新的信息
}
p2->next=NULL;//辅助指针置空
return(head);//链表建立完成,返回头指针
}
book *seek(book *head,char k[12])//第二个函数是指针类型,可以用数组代替(起始地址)
{
struct book *p;//查找和输出的时候,接进来一个head指针,以便于访问链表的内容,p指针来访问具体的数据
p=head;//p接着头指针的位置,进行链表的访问
while(p->next!=NULL)//不是最后一个的时候
{
if(strcmp(p->ibsn,k)==0)//如果这个书是我想找的
break;//跳出循环,输出当前的书的信息
p=p->next;//如果这个书不是我想找的,指针下跳
}
return(p);//返回p指针(代表符合条件的书的全部信息)
}
void print(struct book *head)//输出函数接进来的只需要一个头指针
{
struct book *p;//输出函数只需要一个p指针
cout<<"高于指定库存的是:"<<endl;
p=head;//p接着头指针,进行信息的访问
while(p!=NULL)//如果不是空的
{
cout<<"编码为:"<<p->ibsn<<endl<<"书名为:"<<p->name<<endl<<"单价是:"<<p->price<<endl<<"库存为:"<<p->supply<<endl;//输出书的相关信息
p=p->next;//指针下跳
}
}
book *del(book *head,int a)//第二个参数是库存的参考标准
{
book *p1,*p2;//del函数需要一个主指针p1和辅助指针p2
p1=p2=head;//让这两个指针同时指向头结点
if(head!=NULL)//如果头结点不是空的
{
while(p1!=NULL)//如果在访问下跳的过程中p1也不是空的
{
if(p1->supply<a)//如果当前库存小于指定库存
{
if(p1==head)//如果主指针恰好与头指针的位置相同
{
head=p1->next;//采用直接删除法,直接就让头指针指向p1的下一个节点
}
else
p2->next=p1->next;//如果主指针p1与head指针的位置不重合,采用套路删除法,用辅助指针代替主指针(p2->next=p1->next)
}
p2=p1;//访问下一节点,下跳的套路操作 ,辅助指针跟上主指针p1
p1=p1->next;//p1下跳
}
}
return(head);//返回头指针
}
book *append(book *head,book *new)//添加新的图书信息
{
book *p1,*p0;//图书的添加需要两个指针
p1=head;//第一个指针用于访问原来链表的内容
p0=new;//第二个指针用于添加的内容
while(p1->next!=NULL)//如果我的主指针指向的下一个节点的内容不是空的
{
p1=p1->next;//那么指针就下跳
}
p1->next=p0;//进行新的尾结点的建立 ,p0成为新的尾结点
p0->next=NULL;//
return(head);//链表创建完成,返回头指针
}
void main()
{
char a[12];//字符数组a用于储存学号
int b;
struct book *p,*q,*new=(book *)malloc(LEN);
p=creat();
printf("请输入你想找的人的学号:");
gets(a);
q=seek(p,a);//注意a代表的是数组的起始地址
cout<<"书名为:"<<q->name<<endl<<"单价是:"<<q->price<<endl<<"库存为:"<<q->supply<<endl;
cout<<"输入指定库存量:";
cin>>b;
q=del(p,b);
print(q);
cout<<"请输入新添加的数据:";
cin>>new->ibsn>>new->name>>new->price>>new->supply;
q=append(p,new);
print(q);
}