单向链表实例

图书管理系统

#include "link.h"
int main(int argc, const char *argv[])
{
	int k, n, ch;
	char aa[20];
	book b2[20];
	Plink L= create();
	while(1)
	{

		printf("\t\t\t1. 前端添加书本\n");
		printf("\t\t\t2. 后端添加书本\n");
		printf("\t\t\t3. 任意位置添加书本\n");
		printf("\t\t\t4. 任意位置删除书本\n");
		printf("\t\t\t5. 搜索任意位置书本\n");
		printf("\t\t\t6. 搜索任意编号书本\n");
		printf("\t\t\t7. 修改任意位置书本\n");
		printf("\t\t\t8. 借出任意书本\n");
#if 0
		printf("\t\t\t7. 表头删除学生\n");
		printf("\t\t\t8. 表尾删除学生\n");
		printf("\t\t\t9. 去除重复学生\n");
		printf("\t\t\t10. 按姓名查找学生并返回位置\n");
		printf("\t\t\t11. 按照学号从小到大排列顺序\n");
		printf("\t\t\t12. 按照学号查找返回学生位置\n");
		printf("\t\t\t13. 按年龄查找并修改\n");
		printf("\t\t\t14. 按位置查找并修改\n");
#endif
		scanf("%d", &ch);

		switch(ch)
		{
		case 1: 
			printf("输入要添加的书本数量\n");
			scanf("%d", &n);
			for(int i=0; i<n; i++)
			{
				printf("输入第%d本书信息(书本id 书名 借出状态(新书为0)):", i+1);
				scanf("%d%s%d", &b2[i].id, b2[i].name, &b2[i].status);			
				front_insert(L, b2[i]);
			}
			output_link(L);
			break;
		case 2: 
			rear_insert(L);
			output_link(L);
			break;
		case 3: 
			printf("输入要插入的位置:");
			scanf("%d", &k);
			any_insert(L, k);
			output_link(L);
			break;
		case 4:
			printf("输入要删除的位置:");
			scanf("%d", &k);
			any_delete(L, k);
			output_link(L);
			break;
		case 5:
			printf("输入要搜索的位置:");
			scanf("%d", &k);
			search_any(L, k);
		case 6:
			printf("输入要搜索的书本名:");
			scanf("%s", aa);
		case 7:
			printf("输入要修改的位置:");
			scanf("%d", &k);
			change_any(L, k);
		case 8:
			printf("输入要借的书本id:");
			scanf("%d", &k);
			borrow(L, k);
			output_link(L);
		}
	}
			

	return 0;
}

main.c

#include "link.h"


Plink create()//创建头结点
{
	Plink p = malloc(sizeof(re_link));
	if(NULL==p)
	{
		printf("申请节点失败\n");
		return NULL;
					
	}
	p->len = 0;
	p->next = NULL;
	return p;//返回头结点
}

int front_insert(Plink L, book x)
{
	if(L==NULL)
	{
		printf("创建失败,单向链表不存在\n");
		return -1;
	}
		
	Plink p = malloc(sizeof(re_link));//申请新节点
	p->b1=x;
 	
	p->next = L->next;//连线右边
	L->next = p;//连线左边
	L->len++;
	return 0;
}

int output_link(Plink L)
{
	int i;
	Plink t = L;
	for(i=0; i<L->len; i++)
	{
		t = t->next;
		if(t->b1.status==0)
		{
			printf("id %d\tname %s\tstatus %d\n", t->b1.id, t->b1.name, t->b1.status);
		}
		if(t->b1.status==1)
		{
			printf("id %d\tname %s\tstatus %d\tborrower name %s\tborrowed time%ld\n", t->b1.id, t->b1.name, t->b1.status, t->b1.b_name, t->b1.timep);
		}
	}
	printf("\n");
	return 0;
}

int output_one(Plink L, int n)
{
	Plink t = L;
	for(int i=0; i<n; i++)
	{
		t = t->next;
	}

	if(t->b1.status==0)
	{
		printf("%d\t%s\t%d\n", t->b1.id, t->b1.name, t->b1.status);
	}
	if(t->b1.status==1)
	{
		printf("%d\t%s\t%d\t%s\t%ld\n", t->b1.id, t->b1.name, t->b1.status, t->b1.b_name, t->b1.timep);
	}
	
}

int rear_insert(Plink L)
{
	Plink t = L;
	if(L==NULL)
	{
		printf("创建失败,单向链表不存在\n");//申请新节点
		return -1;
	}

	for(int i=0; i<L->len; i++)
	{		
		t = t->next;	
	}	
	Plink p = malloc(sizeof(re_link));
	printf("输入书本信息(书本id 书名 借出状态(新书为0)):");
	scanf("%d%s%d", &p->b1.id, p->b1.name, &p->b1.status);


	p->next = NULL;
	t->next = p;
	L->len++;
	return 0;
}

int any_insert(Plink L, int pos)
{
	
	if(pos<1||pos>L->len+1||L==NULL)
		
	{
		printf("创建失败,单向链表不存在\n");//申请新节点
		return -1;
	}
	Plink t = L;
	for(int i=1; i<pos; i++)
	{
		t = t->next;
	}
	Plink p = malloc(sizeof(re_link));
	printf("输入书本信息(书本id 书名 借出状态(新书为0)):");
	scanf("%d%s%d", &p->b1.id, p->b1.name, &p->b1.status);

	p->next = t->next;
	t->next = p;
	L->len++;
	return 0;
}

int any_delete(Plink L, int pos)
{	
	if(pos<1||pos>L->len||L==NULL)
		
	{
		printf("创建失败,单向链表不存在\n");//申请新节点
		return -1;
	}
	Plink t = L;
	for(int i=1; i<pos; i++)
	{
		t = t->next;
	}
	Plink Q = t->next;//定义结构体类型指针Q指向要删除的节点
	t->next = t->next->next;//左边接线到右边,跳过Q
	L->len--;//长度减一

	free(Q);//释放删除的节点
	Q = NULL;//删除的节点指针置空
	printf("删除成功\n");
	return 0;
}

int search_any(Plink L, int pos)
{
	
	if(pos<1||pos>L->len||L==NULL)
		
	{
		printf("创建失败,单向链表不存在\n");//申请新节点
		return -1;
	}	
	Plink t = L;
	for(int i=1; i<pos; i++)
	{
		t = t->next;
	}
	printf("该位置书本为");
	output_link(L);
}

int search_name(Plink L, char aa[20])
{
	Plink t = L;
	for(int i=1; i<L->len+1; i++)
	{
		t = t->next;
		if(strcmp(aa, t->b1.name)==0)
		{
			printf("该书存在");
		}
	}
}

int change_any(Plink L, int pos)
{
	
	if(pos<1||pos>L->len||L==NULL)
		
	{
		printf("创建失败,单向链表不存在\n");//申请新节点
		return -1;
	}
	Plink t = L;
	for(int i=1; i<pos; i++)
	{
		t = t->next;
	}
	printf("输入书本信息(书本id 书名 借出状态(新书为0)):");
	scanf("%d%s%d", &t->next->b1.id, t->next->b1.name, &t->next->b1.status);

	return 0;
}

int borrow(Plink L, int e)
{
	Plink t = L;
	char yn='1', y='y', n='n';
	time(&t->b1.timep);
	struct tm *now;
	now=localtime(&t->b1.timep);
	for(int i=0; i<L->len; i++) 
	{

		t = t->next;
		if(e==t->b1.id)
		{
			printf("该书存在\n");	
			if(t->b1.status==0)
			{
				printf("%d\t%s\t%d\n", t->b1.id, t->b1.name, t->b1.status);
				printf("是否要借出该书?(y/n)");
				scanf("%c", &yn);
				if(yn==y)
				{
					t->b1.status=1;
					printf("请输入借书人名字");
					scanf("%s", t->b1.b_name);
        			printf("借出成功!借书时间为:%s\n", asctime(now));
					t->b1.timep = asctime(now);
					output_one(L, i);
					break;
				}
				if(yn==n)
				{
					break;
				}
			}
			if(t->b1.status==1)
			{
				printf("%d\t%s\t%d\t%s\t\n", t->b1.id, t->b1.name, t->b1.status, t->b1.b_name);
			}
		}
	}
	return 0;
}

link.c

#ifndef _LINK_H_
#define _LINK_H_
#include <myhead.h>
#include <time.h>
typedef struct 
{
	int id;//书编号
	char name[20];//书名
	int status;//书借出状态
	char b_name[20];//借书人名字
	time_t timep;//借书时间
}book;


typedef struct library
{
	union
	{
		int len;//用于头结点,存储长度
		book b1;
	};
	struct library *next;//指针域
}re_link, *Plink;

Plink create();
int front_insert(Plink, book);
int output_link(Plink);
int output_one(Plink, int);
int rear_insert(Plink);
int any_insert(Plink, int);
int any_delete(Plink, int);
int search_any(Plink, int);
int search_name(Plink, char*);
int change_any(Plink, int);
int borrow(Plink, int);
#endif

link.h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值