数据结构(C语言)-案例分析(图书管理系统)

图书管理系统

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
struct Book{
	char ID[20];//编号 
	char Name[50];//书名 
	int price;//定价 
}; 
typedef struct Librarysystem{
	Book Data;//定义结点的数据域 
	struct Librarysystem *next;//定义结点的指针域 
}LinkList;
LinkList *InitList(){//初始化链表 
	LinkList *System;
	System=(LinkList *)malloc(sizeof(LinkList));//分配动态空间 
	System->next=NULL;
	return System;//头结点指针域为空,表示空表 
}
void CreateList(LinkList *System,int n){//尾插法插入 
	LinkList *s,*last;//定义指针 
	int i;
	last=System;//last始终指向表尾,开始时指向表头 
	for(i=0;i<n;i++){
		printf("输入ID:");
		s=(LinkList *)malloc(sizeof(LinkList));//生成新结点 
		scanf("%c",&s->Data);//读入新结点的数据域 
		gets(s->Data.ID);//向数据的ID块输入数据 
		printf("\n输入书名:");
		gets(s->Data.Name);//向数据的Name块输入数据 
		printf("\n输入价格:");
		scanf("%d",&s->Data.price);//向数据的price块输入数据 
		s->next=NULL;//将新结点指针设为空 
		last->next=s;//将新结点插入表尾 
		last=s;//将last指针指向表尾结点 
	} 
	s=System->next; //s指针指向表头 
	if(s!=NULL){//判断s是否为空 
		printf("录入成功!!");
	}else{
		printf("录入失败!!"); 
	}
}
void InsList(LinkList *System,int x){//插入数据 
	LinkList *s,*last;//定义指针 
	last=System;//last始终指向表尾,开始时指向表头 
	int i=0;
	int l=0;
	while(last!=NULL){
		last=last->next;//循环一次last向前移一次 
		i++; 
	}//统计表长 
	last=System;//last始终指向表尾,开始时指向表头 
	while(last!=NULL&&l<i-1){//定点插入 
		last=last->next;//循环一次last向前移一次 
		l++; 
	}
	for(i=0;i<x;i++){
		printf("\n输入ID:");
		s=(LinkList *)malloc(sizeof(LinkList));//生成新结点 
		scanf("%c",&s->Data);//读入新结点的数据域 
		gets(s->Data.ID);
		printf("\n输入书名:");
		gets(s->Data.Name);
		printf("\n输入价格:");
		scanf("%d",&s->Data.price);
		s->next=last->next;
		last->next=s;
	} 
	l=0;
	s=System->next;//s指向表头 
	while(s!=NULL){
		s=s->next;
		l++; 
	}
	if(l>=x){//l>x输入成功 
		printf("录入成功!!\n");
	}else{
		printf("录入失败!!\n"); 
	}
}
void Locate(LinkList *System){//查询信息 
	char p[50];//定义一个字符数组 
	printf("输入查询信息(ID或者Name或者Price):");
	int i;
	i=0;
	gets(p);//输入字符串 
	LinkList *s;//定义指针 
	s=System->next;//s指向表头 
	printf("\n查询到以下:\n"); 
	while(s!=NULL){
		if(strcmp(s->Data.ID,p)==0||strcmp(s->Data.Name,p)==0||s->Data.price==atoi(p)){//判断是否与输入的查询信息相等 
		   printf("\nID:");
		   puts(s->Data.ID);
		   printf("Name:");
		   puts(s->Data.Name);
		   printf("price:");
		   printf("%d",s->Data.price);
		   i++;
		}
		s=s->next;//s指向表的一下项next 
	} 
	if(i==0){
		printf("\n查无此书!!");
	}
	
}
void Delist(LinkList *System){//按顺序删除图书 
	char p[50];//定义一个字符数组 
	printf("按顺序输入要删除的书名或者ID(1~2项):");
	gets(p);//输入字符串 
	int i=0;
	int j=0;
	int l=0;
	LinkList *s,*x;//定义指针 
	s=System->next;//s指向表头 
	while (s!=NULL)//统计表长 
	{
		s=s->next;
		i++;
	}
	s=System->next;//s指向表头
	while(s!=NULL){//寻找要删除的位置 
		if(strcmp(s->Data.ID,p)==0||strcmp(s->Data.Name,p)==0||s->Data.price==atoi(p)){
			l++;
			break;	
		}
		s=s->next;
		l++;//记录指针指的位置 
	} 

	while(s!=NULL){
		if(l==1){
		    s=s->next;//s指针指向第一项 
			x=s;//s为要删除的结点 
			if(s==NULL){//如果指针为空 
	 	       printf("出错了!!系统以没有图书!!请添加图书\n");
			   System->next=s;//把表制空 
	 	       break;//跳出 
	         }
			s->next=x->next;//将x的结点与s结点相接 
			System->next=s;//将表的数据删除 
			s=System->next;//s指针删除数据以后的表 
	        while(s!=NULL){
		      s=s->next;
			  j++;//记录表长 
	         }
			if(j==i){//如果表等于以前长度则判断出错 
				printf("删除失败!!\n");
			}else{
			printf("删除成功!!\n");
			}
	   }else{//如果位置变化 
		    s=System->next;//s指向表头 
			x=s->next;  //s为要删除的结点 
			s->next=x->next;//将x的结点与s结点相接 
			System->next=s;//将表的这一项数据删除 
			s=System->next;//s指针删除数据以后的表
	        while(s!=NULL){
		      s=s->next;
			  j++;
	         }
			if(j==i){//如果表等于以前长度则判断出错 
				printf("删除失败!!\n");
			}else{
			printf("删除成功!!\n");
			}
		}
	}
	if(j==i||i==l){//判断删除是否正确 
		printf("出错了!!系统没有这本图书\n");
	}else if(j!=0){
         s=System->next;
	     printf("删除后的图书:\n");
	      while(s!=NULL){
		   printf("\nID:");
		   puts(s->Data.ID);
		   printf("Name:");
		   puts(s->Data.Name);
		   printf("\nprice:");
		   printf("%d",s->Data.price);
		   s=s->next;
	   }
	 }
}
void Issue(LinkList *System){//购买图书 
	char p[50];
	int i,x,y;
	x=i=y=0;
	LinkList *s;
	printf("输入0结束购书!\n");
	printf("输入要购买的书号或者书名:"); 
	while(*p!='0'){
		gets(p);
		if(*p=='0'){
			break;
		}
		s=System->next;
		while(s!=NULL){
			if(strcmp(s->Data.ID,p)==0){
				i=s->Data.price;
			}
			else if(strcmp(s->Data.Name,p)==0){
				i=s->Data.price;
				break;
			}
			s=s->next;
		}
		x=i;
		y=x+y;
	}
	printf("\n本次购买图书一共花费:%d¥\n欢迎下次光临",y);
	
}
void Menu(){
	printf("\n          图书系统");
	printf("\n--------------------------------------");
	printf("\n              1--创建系统             ");
	printf("\n              2--增加书籍             ");
	printf("\n              3--查询书籍             ");
	printf("\n              4--购买书籍             ");
	printf("\n              5--按顺序删除书籍       ");
	printf("\n              0--退出                 ");
	printf("\n--------------------------------------");
	printf("\n请输入菜单号(0-5):"); 
}
int main(){
	LinkList *System;
	int n,x;
	char ch1,ch2,a;
	ch1='y';
		while(ch1=='y'||ch1=='Y'){
		Menu();
	    scanf("%c",&ch2);
		getchar();
		switch(ch2){
			case '1':
			System=InitList();
			printf("输入录入书籍数:");
			scanf("%d",&n);
			CreateList(System,n); 
			break;
			case '2':
			printf("输入增加书籍数:");
			scanf("%d",&x);
			InsList(System,x);
			break;
			case '3':
			Locate(System);
			break;
			case '4':
			Issue(System);
			break;
			case '5':
				Delist(System);
				break;
			case '0':
			    ch1='n';
				break;
			default:
			    printf("输入有误!!!!");  
			}
			if(ch2!='0'){
			printf("\n按回车键继续,按任意键返回主菜单!\n");
			a=getchar();
			if(a!='\xA'){
				getchar();
				ch1='n';
			}
		}	
		
	}
}
  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值