数据结构实验任务一:链表实现图书管理系统。

该代码为数据结构实验任务一实现代码,使用链表实现图书管理系统。

数据结构实验任务一:链表实现图书管理系统。_第1张图片

#include 
#include 
#include 
#include  
#define N 13
#define M 20
int order =  -1;
typedef struct node{
	char id[N];
	char name[M];
	float price;
	struct node* next;
}Node; 
typedef struct Link{
	Node* head;
	int size;
};


void Init(Link* a);
void Read(Link* a);
Node* add(Node* head,char* name,char* id,float price);
Node* update(Link* a);
void Lprint(Link* a);
void select(Link* a);
void unique(Link* a); 



//初始化链表 
void Init(Link* a){
	a->head=NULL;
	a->size=0;
} 
//读取信息
void Read(Link* a){
	printf("/*该功能页实现:定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入相应的图书数据来完成图书信息表的创建。*/\n\n\n");
	printf("用法:输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1行是输入结束标志:0 0 0(空格分隔的三个 0)。其中,书号和书名为字符串类型,价格为浮点数类型。\n\n\n");
	char name[M],id[N];
	float price;
	printf("input the information like(id name price) and end with '0 0 0' :\n"); 
	do{ 
		scanf("%s %s %f",id,name,&price);
		if(price!=0){
			a->size+=1;
			a->head=add(a->head,name,id,price);
		}
	}while(price!=0);
	printf("\nSuccess!\n");
	
}
//增加节点

Node* add(Node* head,char* name,char* id,float price){

	Node* p = (Node*)malloc(sizeof(Node));
	p->next=NULL;
	strcpy(p->id,id);
	strcpy(p->name,name);
	p->price = price;
	
	if(head==NULL){
		head = p;
	}else{
		Node* pr;
		for(pr=head;pr->next;pr=pr->next);//找到队尾 

		pr->next = p;
	}
	return head;
}
//更新节点 
Node* update(Link* a){
		printf("/*该功能页实现:基于顺序(链式)存储结构的图书信息表的修改*/\n\n\n");
	printf("用法:,第 1 行是修改前所有图书的平均价格,第 2 行是所创建的图书信息表中的图书个数,后 n 行是价格修改后 n 本图书的信息(书号、书名、价格)、每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位小数。\n\n\n"); 
		Node* pr;
		float sum=0;
		for(pr=a->head;pr;pr=pr->next){
			sum+=pr->price;
		}
		float ave = sum/a->size;
		printf("average:%.2f\n",sum/a->size);
		for(pr=a->head;pr;pr=pr->next){
			if(pr->priceprice*=1.2;
			}
		}
		printf("\nSuccess!\n");
		Lprint(a);
}
//查找数据
void select(Link* a){
	printf("/*该功能页实现:基于顺序(链式)存储结构的图书信息表的最贵图书的查找*/\n\n\n");
	printf("用法:输出 m+1 行,其中,第 1 行是最贵图书的数目 m(价格最高的图书可能有多本)。后 m 行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位小数\n\n\n"); 
	Node* pr;
	float maxP = 0;
	int cunt = 0;
	for(pr=a->head;pr;pr=pr->next){
		if(maxPprice){
			maxP=pr->price;
			cunt = 1;
		}else if(maxP==pr->price){
			cunt++;
		}
	}
	
	printf("Most Expensive:%d\nWith books:\n",cunt);
	for(pr=a->head;pr;pr=pr->next){
		if(maxP==pr->price){
			printf("%s %s %f\n",pr->id,pr->name,pr->price);
		}
	}
	printf("\nSuccess!\n");
} 
//插入数据
void insert(Link* a){
	printf("/*该功能页实现:4.基于顺序(链式)存储结构的图书信息表的新图书的入库*/\n\n\n");
	printf("用法:,内容仅为一个整数,代表待入库的新图书的位置序号。最后,输入第 n+3 行,内容为新图书的信息,书号、书名、价格用空格分隔\n\n\n"); 
	int n,cunt;
	char name[M],id[N];
	float price;
	Node* pr;
	printf("position:");
	scanf("%d",&n);
	printf("information(id name price):");
	scanf("%s %s %f",id,name,&price);
	
	
	if(n<1||n>a->size+1){
		printf("抱歉,入库位置非法!\n");
		return;
	}
	
	a->size++;
	Node* p = (Node*)malloc(sizeof(Node));
	p->next=NULL;
	strcpy(p->id,id);
	strcpy(p->name,name);
	p->price = price;
	
	if(n == 1){
		p->next = a->head;
		a->head = p;
		Lprint(a);
		return ;
	}
	for(pr=a->head,cunt=1;pr&&cuntnext,cunt++);
	p->next=pr->next;
	pr->next = p;
	printf("\nSuccess!\n");
	Lprint(a);
} 
// 删除
void del(Link* a){
	printf("/*该功能页实现:根据指定的待出库的旧图书的位置,将该图书从图书表中删除。最后输出该图书出库后的所有图书的信息*/\n");
	printf("用法:输入一个整数N表示书的位置\n\n\n"); 
	int n,cunt;
	Node* pr,*pre;
	printf("position of the book to delete:");
	scanf("%d",&n);
	if(n<1||n>a->size+1){
		printf("抱歉,出库位置非法!");
		return;
	}
	a->size--;
	
	if (n==1){
		pre=a->head;
		a->head=pre->next;
		Lprint(a);
		free(pre); 
		return;
	}
	for(pr=a->head,cunt=1;pr&&cuntnext,cunt++);
	pre=pr->next;
	pr->next = pre->next;
	printf("\nSuccess!\n");
	Lprint(a);
	free(pre);
} 
//去重
void unique(Link* a){
	printf("/*该功能页实现:基于顺序(链式)存储结构的图书信息表的图书去重*/\n\n\n");
	printf("用法:无要求\n\n\n"); 
	Node* pr,*pre,*p;
	for(pr=a->head;pr;pr=pr->next){
		for(pre=pr;pre->next;pre=pre->next){
			if(pr->price==pre->next->price&&strcmp(pre->next->id,pr->id)==0&&strcmp(pre->next->name,pr->name)==0){
				p=pre->next;
				pre->next=p->next;
				a->size--;
				free(p);
				if(pre->next == NULL)break; 
			}
		}
	}
	printf("\nSuccess!\n");
	Lprint(a);
}  
//打印链表 
void Lprint(Link* a){

	printf("书本总数:%d\n",a->size);
	Node* pr;
	int cunt=1;
	for(pr=a->head;pr;pr=pr->next){
		printf("%d:[id]:%-10s [name]:%-10s [price]:%-10.2f\n",cunt++,pr->id,pr->name,pr->price);
	}
}
//回到主页面
int main(){
	Link lib;
	Init(&lib);
	while(order==-1){
		printf("================ Lib Manage System==========================\n");
		printf("choose operation:\n\n");
		printf("1.Ceate and Drop \n2.Update\n3.Find\n4.Insert\n5.Delete\n6.Unique\n7.Show\n\n");
		printf("[order]>>");
		scanf("%d",&order);
		system("cls");
		switch (order){
			case 1:
					Read(&lib);
					system("Pause");
					system("cls");
					order = -1;
					break;
			case 2:	
					update(&lib);
					system("Pause");
					system("cls");
					order = -1;
					break;
			case 3:
					select(&lib);
					system("Pause");
					system("cls");
					order = -1;
					break;
			case 4:
					insert(&lib);
					system("Pause");
					system("cls");
					order = -1;
					break;
			case 5:
					del(&lib);
					system("Pause");
					system("cls");
					order = -1;
					break;
			case 6:
					unique(&lib);
					system("Pause");
					system("cls");
					order = -1;
					break;
			case 7:
					printf("/*该功能页实现:输出书本总数即各本信息*/\n\n\n");
					printf("用法:输出书本信息\n\n\n"); 
					Lprint(&lib);
					system("Pause");
					system("cls");
					order = -1;
					break;
		}
			
	}
	
	

	
	//unique(&lib);
	//del(&lib); 
	//insert(&lib);
	//select(&lib);
	//update(&lib);
	//Lprint(&lib);
	return 0;
}

基本使用功能及使用方法已在每个功能页中。如有问题,欢迎交流。

代码仅供参考。

你可能感兴趣的:(数据结构实验,数据结构,链表)