C语言期末复习链表模块(1)

书店有N本书,每本图书的信息包括ISBN编码、书名、单价、库存,要求编写整个程序,其中包括:

  1. 子函数1  creat,创建一个动态链表,从键盘读入所有图书的数据后,存储至链表中;

形式为:struct LNode *creat(void);

  1. 子函数2  seek,查找并输出链表中指定ISBN编码的图书信息;

形式为:void seek(struct LNode *head,char *code);

  1. 编写子函数del,将所有库存低于指定数量的图书从链表中删除。

形式为:struct LNode *del(struct LNode *head, int num);

其中:函数返回值为头指针的地址;

  1. 子函数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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值