c语言单链表实现一个简单收录系统


前言

老师布置的一个项目,我打算用单链表去实现它,有相似的同学在这里可以提供一个思路,技术不精,还望海涵。


一、项目说明

项目名称:影视作品收录系统
要求:
1.设计一个结构体用来表示作品信息,有影视作品名称,导演,编辑,主演,类型,制片国家/地区,语言,上映日期,片长,简介,评价星级等信息。
2.制作菜单可供用户选择使用,分为管理员账户与普通账户。
管理员账户可以添加作品、下架作品,修改作品,按名称查询,按类型查询以及显示所有作品;普通账户只能按名称查询,按类型查询和显示所有作品信息。
3.管理员账户可以根据影视作品的名称、类型修改作品信息。
4.初始默认状态有10部作品。

二、实现步骤

1.构建链表节点

typedef struct movie		//一部电影的信息
{
	char *Name;				//名称
	char *Director;			//导演
	char *Edit;				//编辑
	char *Actor;			//主演
	char *Type;				//类型
	char *Prodct;			//制品国家/区域
	char *Language;			//语言
	char *Release;			//上映
	char *Length;			//片长
	char *Introduction;		//简介
	float Star;				//评价星级
	struct movie *Next;		//指向下一部电影存放的位置
}FILM;

2.给节点开辟空间

FILM *Space(FILM *p)
{
	p = (FILM *)malloc(sizeof(FILM));
	p->Name=(char *)malloc(50);				//电影名称
	p->Director=(char *)malloc(50);			//电影导演
	p->Edit=(char *)malloc(100);			//电影编剧
	p->Actor=(char *)malloc(100);			//电影主演
	p->Type=(char *)malloc(100);			//电影类型
	p->Prodct=(char *)malloc(20);			//制作国家/地区
	p->Language=(char *)malloc(30);			//语言
	p->Release=(char *)malloc(100);			//上映时间
	p->Length=(char *)malloc(60);			//电影时长
	p->Introduction=(char *)malloc(2000);	//电影简介
	p->Next=NULL;
	return p;
}

3.初始化链表

用txt文档的内容作初始化

int check(const char *f)//检查存放作品的文档在不在 参数是argv[1].
{
	FILE *f1;
	f1=fopen(f,"r+");//文档必须存在
	if(f1==NULL)
		return 0;
	else
		return 1;
}
FILM *Init(const char *p,int a)//参数:argv[1]和check函数返回值
{
	if(a==0)
	{
		printf("影视信息库不存在!\n");
		return NULL;	
	}
	else
	{
		char *aName=(char *)malloc(50);
		char *aDirector=(char *)malloc(50);
		char *aEdit=(char *)malloc(100);
		char *aActor=(char *)malloc(100);
		char *aType=(char *)malloc(100);
		char *aProdct=(char *)malloc(10);
		char *aLanguage=(char *)malloc(100);
		char *aRelease=(char *)malloc(100);
		char *aLength=(char *)malloc(100);
		char *aIntroduction=(char *)malloc(2000);
		float aStar;
		FILE *f1;
		FILM *head;
		FILM *tail;
		FILM *new;
		head=Space(head);
		tail=head;
		f1=fopen(p,"r");
		if(f1==NULL)
		{
			printf("影视信息库打开失败\n");
			return NULL;
		}
		else
		{
			while(fscanf(f1,"%s%s%s%s%s%s%s%s%s%s%f\n",
				aName,aDirector,aEdit,aActor,aType,aProdct,aLanguage,
				aRelease,aLength,aIntroduction,&aStar)!=EOF)
			{
				new=Space(new);
				strcpy(new->Name,aName);
				strcpy(new->Director,aDirector);
				strcpy(new->Edit,aEdit);
				strcpy(new->Actor,aActor);
				strcpy(new->Type,aType);
				strcpy(new->Prodct,aProdct);
				strcpy(new->Language,aLanguage);
				strcpy(new->Release,aRelease);
				strcpy(new->Length,aLength);
				strcpy(new->Introduction,aIntroduction);
				new->Star=aStar;
				tail->Next=new;
				tail=new;
			}
		}
		fclose(f1);
		return head;
	}	
}

4.按名字查找作品

FILM *Nsearch(FILM *p,char *n)//参数:链表首元节点(也就是第一个空的那个)
{							  //还有就是要查找的作品名称
	FILM *m2=p->Next;
	while(m2!=NULL&&strcmp(m2->Name,n))
		m2=m2->Next;
	if (m2==NULL)
	{
		printf("Sorry,信息库并没有这部电影\n");
		return NULL;
	}
	else
		return m2;
}

5.按类型查找作品

FILM *Tsearch(FILM *p,char *t)//参数:链表首元节点和要查找的作品类型
{
	FILM *m2=p->Next;
	FILM *head;
	FILM *tail;
	FILM *new;
	head=Space(head);
	tail=head;
	while(m2!=NULL)
	{
		if(strstr(m2->Type,t)==NULL)
			m2=m2->Next;
		else
		{
			new=Space(new);
			strcpy(new->Name,m2->Name);
			strcpy(new->Director,m2->Director);
			strcpy(new->Edit,m2->Edit);
			strcpy(new->Actor,m2->Actor);
			strcpy(new->Type,m2->Type);
			strcpy(new->Prodct,m2->Prodct);
			strcpy(new->Language,m2->Language);
			strcpy(new->Release,m2->Release);
			strcpy(new->Length,m2->Length);
			strcpy(new->Introduction,m2->Introduction);
			new->Star=m2->Star;
			tail->Next=new;
			tail=new;
			m2=m2->Next;
		}
	}
	if(head==NULL)
	{
		printf("信息库并没有这个类型的电影\n");
		return head;
	}
	else
		return head;
}

6.添加作品

FILM *Addflim(FILM *p)//参数是链表首元节点
{
	int n;			//添加电影数量
	int flag=1;
	FILM *tial=p->Next;
	FILM *new;		//新添加的电影
	printf("需要添加几部电影:");
	scanf("%d",&n);
	while(tial->Next!=NULL)
		tial=tial->Next;
	for (int i = 0; i < n; ++i)
	{
		new=Space(new);
		printf("请输入新电影的名字: \n");
		scanf("%s",new->Name);
		printf("请输入新电影的导演: \n");
		scanf("%s",new->Director);
		printf("请输入新电影的编辑: \n");
		scanf("%s",new->Edit);
		printf("请输入新电影的主演: \n");
		scanf("%s",new->Actor);
		printf("请输入新电影的类型: \n");
		scanf("%s",new->Type);
		printf("请输入新电影的制作国家/地区: \n");
		scanf("%s",new->Prodct);
		printf("请输入新电影的语言: \n");
		scanf("%s",new->Language);
		printf("请输入新电影的上映时间: \n");
		scanf("%s",new->Release);
		printf("请输入新电影的时长: \n");
		scanf("%s",new->Length);
		printf("请输入新电影的简介: \n");
		scanf("%s",new->Introduction);
		printf("请输入新电影的评价星级: \n");
		scanf("%f",&new->Star);
		tial->Next=new;
		tial=new;
	}		
	return p;	
}

7.修改作品

FILM *Modify(FILM *p)//参数链表首元节点
{
	int flag=1;
	int n;
	char *n1=(char *)malloc(50);
	char *t1=(char *)malloc(50);
	FILM *m1=p;
	FILM *m2;
	FILM *m3;
	FILM *m4;
	while(flag)
	{
		printf("1-按名字查找并修改  2-按类型查找并修改  3-退出修改\n");
		scanf("%d",&n);
		switch(n)
		{
			case 1:
				printf("请输入要修改的电影名称: ");
				scanf("%s",n1);
				m2=Nsearch(m1,n1);
				//Display1(m2);break;//测试
				if(m2==NULL)
					break;
				else
				{
					printf("修改电影名称: \n");
					scanf("%s",m2->Name);
					printf("修改电影的导演: \n");
					scanf("%s",m2->Director);
					printf("修改电影的编辑: \n");
					scanf("%s",m2->Edit);
					printf("修改电影的主演: \n");
					scanf("%s",m2->Actor);
					printf("修改电影的类型: \n");
					scanf("%s",m2->Type);
					printf("修改电影的制作国家/地区: \n");
					scanf("%s",m2->Prodct);
					printf("修改电影的语言: \n");
					scanf("%s",m2->Language);
					printf("修改电影的上映时间: \n");
					scanf("%s",m2->Release);
					printf("修改电影的时长: \n");
					scanf("%s",m2->Length);
					printf("修改电影的简介: \n");
					scanf("%s",m2->Introduction);
					printf("修改电影的评价星级: \n");
					scanf("%f",&m2->Star);
					break;
				}
			case 2:
				printf("请输入要修改的电影类型: ");
				scanf("%s",t1);
				m2=Tsearch(m1,t1);
				if(m2==NULL)
					break;
				else
				{
					printf("符合该类型的电影如下:\n");
					Displayall(m2);
					m2=m2->Next;
					while(m2!=NULL)
					{
						m3=Nsearch(m1,m2->Name);
						printf("请修改%s\n", m2->Name);
						printf("\n");
						printf("修改电影名称: \n");
						scanf("%s",m3->Name);
						printf("修改电影的导演: \n");
						scanf("%s",m3->Director);
						printf("修改电影的编辑: \n");
						scanf("%s",m3->Edit);
						printf("修改电影的主演: \n");
						scanf("%s",m3->Actor);
						printf("修改电影的类型: \n");
						scanf("%s",m3->Type);
						printf("修改电影的制作国家/地区: \n");
						scanf("%s",m3->Prodct);
						printf("修改电影的语言: \n");
						scanf("%s",m3->Language);
						printf("修改电影的上映时间: \n");
						scanf("%s",m3->Release);
						printf("修改电影的时长: \n");
						scanf("%s",m3->Length);
						printf("修改电影的简介: \n");
						scanf("%s",m3->Introduction);
						printf("修改电影的评价星级: \n");
						scanf("%f",&m3->Star);
						m2=m2->Next;
					}
				}break;
			case 3:flag=0;break;
			default:printf("输入错误,请重新选择\n");getchar();break;
		}
	}
	return p;
}

8.下架作品

FILM *Delete(FILM *p)//参数:链表首元节点
{
	char *n1=(char *)malloc(50);
	FILM *m1=p;
	FILM *m2;
	printf("请输入要删除的电影名称: ");
	scanf("%s",n1);

	while(m1->Next!=NULL)
	{
		if(strcmp(m1->Next->Name,n1))
			m1=m1->Next;
		else
		{
			m1->Next=m1->Next->Next;
			return p;		
		}
	}
	printf("信息库没有这部电影,无法删除\n");
	return NULL;
}

9.显示所有作品

void Displayall(FILM *p)//参数:链表首元节点
{
	FILM *m1=p->Next;
	while(m1!=NULL)
	{
		printf("\n电影名称:%s\n", m1->Name);
		printf("电影导演:%s\n", m1->Director);
		printf("电影编剧:%s\n", m1->Edit);
		printf("电影主演:%s\n", m1->Actor);
		printf("电影类型:%s\n", m1->Type);
		printf("制作国家/地区:%s\n", m1->Prodct);
		printf("语言:%s\n", m1->Language);
		printf("上映时间:%s\n", m1->Release);
		printf("电影时长:%s\n", m1->Length);
		printf("电影简介:%s\n", m1->Introduction);
		printf("评价星级:%.1f\n", m1->Star);
		printf("\n");
		m1=m1->Next;
	}
}

10.只显示一部作品

void Display1(FILM *p)//参数:按名称找到的节点位置
{
	FILM *m1=p;
	printf("\n电影名称:%s\n", m1->Name);
	printf("电影导演:%s\n", m1->Director);
	printf("电影编剧:%s\n", m1->Edit);
	printf("电影主演:%s\n", m1->Actor);
	printf("电影类型:%s\n", m1->Type);
	printf("制作国家/地区:%s\n", m1->Prodct);
	printf("语言:%s\n", m1->Language);
	printf("上映时间:%s\n", m1->Release);
	printf("电影时长:%s\n", m1->Length);
	printf("电影简介:%s\n", m1->Introduction);
	printf("评价星级:%.1f\n", m1->Star);
	printf("\n");
}

11.普通账户菜单

void Ordinary(FILM *p)
{
	int n;
	int flag=1;
	char *n1;
	char *t1;
	FILM *m1;		//找按名称的电影
	FILM *m2=p;		//传参
	FILM *m3;		//找按类型的电影
	n1=(char *)malloc(50);
	t1=(char *)malloc(50);
	while(flag)
	{
		printf("1-查询所有电影信息  2-按名称查询电影信息  3-按类型查询电影信息  4-退出用户模式\n");
		scanf("%d",&n);
		switch(n)
		{
			case 1:Displayall(p);break;
			case 2:
				printf("请输入想看的电影名称: ");
				scanf("%s",n1);
				m1=Nsearch(m2,n1);
				if(m1==NULL)
					break;
				else
				{
					Display1(m1);
					break;
				}
			case 3:
				printf("请输入想看的电影类型: ");
				scanf("%s",t1);
				m3=Tsearch(m2,t1);
				if(m3==NULL)
					break;
				else
				{
					Displayall(m3);
					break;
				}
			case 4:flag=0;break;
			default:printf("输入错误,请重新输入\n");getchar();break;
		}
	}
}

12.管理员账户菜单

void Admini(FILM *p)
{
	char *password="123456";
	char *n1=(char *)malloc(50);
	char *t1=(char *)malloc(50);
	char *mima=(char *)malloc(10);
	int flag=1;							//退出管理员模式标志
	int n;								//管理员功能选择

	FILM *m1;							//按名称查找电影
	FILM *m2=p;							//函数传参
	FILM *m3;							//按类型查找电影
	FILM *m4=p;							//改变电影库前
	FILM *m5;							//改变电影库后
	printf("请输入管理员密码: ");
	scanf("%s",mima);
	while(strcmp(mima,password))
	{
		printf("密码错误,请重新输入: ");
		scanf("%s",mima);
	}
	while(flag)
	{
		if (!strcmp(mima,password))
		{
			printf("<----------------------1-添加电影  2-修改电影  3-下架电影---------------------->\n");
			printf("4-查询所有电影信息  5-按名称查找电影信息  6-按类型查找电影信息  7-退出管理员模式\n");
			scanf("%d",&n);
			switch(n)
			{
				case 1:
					m5=Addflim(m4);
					printf("增加后的电影列表如下\n");
					Displayall(m5);
					break;
				case 2:
					m5=Modify(m4);
					printf("修改后的电影列表如下\n");
					Displayall(m5);
					break;
				case 3:
					m5=Delete(m4);
					if(m5==NULL)
						break;
					else
					{
						printf("下架后的电影列表如下\n");
						Displayall(m5);
						break;
					}
					
				case 4:Displayall(p);break;
				case 5:
					printf("请输入查找的电影名称: ");
					scanf("%s",n1);
					m1=Nsearch(m2,n1);
					if(m1==NULL)
						break;
					else
					{
						Display1(m1);
						break;
					}
				case 6:
					printf("请输入查找的电影类型: ");
					scanf("%s",t1);
					m3=Tsearch(m2,t1);
					if(m3==NULL)
						break;
					else
					{
						Displayall(m3);
						break;
					}
				case 7:flag=0;break;
				default:printf("输入错误,请重新选择\n");getchar();break;
			}
		}
	}
}

总结

先用文件操作对单链表初始化,单链表储存数据,每次传参时都传递链表的首元节点,便于理解和操作。
缺陷:退出系统后全部恢复默认状态,无法更新数据库。(c语言fprintf函数不支持中文等多字节数据,汉字的文本操作还不会)
由于是初学者,一些地方可能写的不好,希望大家多多包涵,也祝愿大家共同进步。

程序源代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct movie		//一部电影的信息
{
	char *Name;				//名称
	char *Director;			//导演
	char *Edit;				//编辑
	char *Actor;			//主演
	char *Type;				//类型
	char *Prodct;			//制品国家/区域
	char *Language;			//语言
	char *Release;			//上映
	char *Length;			//片长
	char *Introduction;		//简介
	float Star;				//评价星级
	struct movie *Next;		//指向下一部电影存放的位置
}FILM;

FILM *Init(const char *p,int a);	//使用文件操作对进行链表初始化
FILM *Space(FILM *p);				//为链表的节点申请空间
int check(const char *f);			//检查库文件
void Displayall(FILM *p);			//显示所有电影
void Display1(FILM *p);				//显示一部电影
void Ordinary(FILM *p);				//普通用户使用
void Admini(FILM *p);				//管理员使用
FILM *Nsearch(FILM *p,char *n);		//按名字查找电影
FILM *Tsearch(FILM *p,char *t);		//按类型查找电影
FILM *Addflim(FILM *p);				//添加电影
FILM *Modify(FILM *p);				//修改电影
FILM *Delete(FILM *p);				//删除电影


int main(int argc, char const *argv[])
{
	int n;				//选择:普通用户/管理员
	int flag=1;			//结束收录系统标志

	FILM *m1;			//指向链表头的指针

	m1 = Init(argv[1],check(argv[1]));		//给链表初始化
	while(flag)
	{
		printf("1-普通用户  2-管理员  3-退出\n");
		scanf("%d",&n);
		switch(n)
		{
			case 1:Ordinary(m1);break;
			case 2:Admini(m1);break;
			case 3:printf("感谢你的使用,欢迎下次再来\n");flag=0;break;
			default:printf("您的输入存在错误,请重新输入\n");break;
		}
	}	
	return 0;
}

int check(const char *f)
{
	FILE *f1;
	f1=fopen(f,"r+");		//库文件必须存在
	if(f1==NULL)
		return 0;
	else
		return 1;
}

FILM *Init(const char *p,int a)
{
	if(a==0)
	{
		printf("影视信息库不存在!\n");
		return NULL;	
	}
	else
	{
		char *aName=(char *)malloc(50);
		char *aDirector=(char *)malloc(50);
		char *aEdit=(char *)malloc(100);
		char *aActor=(char *)malloc(100);
		char *aType=(char *)malloc(100);
		char *aProdct=(char *)malloc(10);
		char *aLanguage=(char *)malloc(100);
		char *aRelease=(char *)malloc(100);
		char *aLength=(char *)malloc(100);
		char *aIntroduction=(char *)malloc(2000);
		float aStar;

		FILE *f1;

		FILM *head;
		FILM *tail;
		FILM *new;

		head=Space(head);
		tail=head;

		f1=fopen(p,"r");
		if(f1==NULL)
		{
			printf("影视信息库打开失败\n");
			return NULL;
		}
		else
		{
			while(fscanf(f1,"%s%s%s%s%s%s%s%s%s%s%f\n",
				aName,aDirector,aEdit,aActor,aType,aProdct,aLanguage,
				aRelease,aLength,aIntroduction,&aStar)!=EOF)
			{
				new=Space(new);

				strcpy(new->Name,aName);
				strcpy(new->Director,aDirector);
				strcpy(new->Edit,aEdit);
				strcpy(new->Actor,aActor);
				strcpy(new->Type,aType);
				strcpy(new->Prodct,aProdct);
				strcpy(new->Language,aLanguage);
				strcpy(new->Release,aRelease);
				strcpy(new->Length,aLength);
				strcpy(new->Introduction,aIntroduction);
				new->Star=aStar;

				tail->Next=new;
				tail=new;
			}
		}
		fclose(f1);
		return head;
	}	
}

FILM *Space(FILM *p)
{
	p = (FILM *)malloc(sizeof(FILM));
	p->Name=(char *)malloc(50);				//电影名称
	p->Director=(char *)malloc(50);			//电影导演
	p->Edit=(char *)malloc(100);			//电影编剧
	p->Actor=(char *)malloc(100);			//电影主演
	p->Type=(char *)malloc(100);			//电影类型
	p->Prodct=(char *)malloc(20);			//制作国家/地区
	p->Language=(char *)malloc(30);			//语言
	p->Release=(char *)malloc(100);			//上映时间
	p->Length=(char *)malloc(60);			//电影时长
	p->Introduction=(char *)malloc(2000);	//电影简介
	p->Next=NULL;

	return p;
}

void Displayall(FILM *p)
{
	FILM *m1=p->Next;

	while(m1!=NULL)
	{
		printf("\n电影名称:%s\n", m1->Name);
		printf("电影导演:%s\n", m1->Director);
		printf("电影编剧:%s\n", m1->Edit);
		printf("电影主演:%s\n", m1->Actor);
		printf("电影类型:%s\n", m1->Type);
		printf("制作国家/地区:%s\n", m1->Prodct);
		printf("语言:%s\n", m1->Language);
		printf("上映时间:%s\n", m1->Release);
		printf("电影时长:%s\n", m1->Length);
		printf("电影简介:%s\n", m1->Introduction);
		printf("评价星级:%.1f\n", m1->Star);
		printf("\n");

		m1=m1->Next;
	}
}

void Display1(FILM *p)
{
	FILM *m1=p;
	printf("\n电影名称:%s\n", m1->Name);
	printf("电影导演:%s\n", m1->Director);
	printf("电影编剧:%s\n", m1->Edit);
	printf("电影主演:%s\n", m1->Actor);
	printf("电影类型:%s\n", m1->Type);
	printf("制作国家/地区:%s\n", m1->Prodct);
	printf("语言:%s\n", m1->Language);
	printf("上映时间:%s\n", m1->Release);
	printf("电影时长:%s\n", m1->Length);
	printf("电影简介:%s\n", m1->Introduction);
	printf("评价星级:%.1f\n", m1->Star);
	printf("\n");
}


void Ordinary(FILM *p)
{
	int n;
	int flag=1;
	char *n1;
	char *t1;

	FILM *m1;		//找按名称的电影
	FILM *m2=p;		//传参
	FILM *m3;		//找按类型的电影

	n1=(char *)malloc(50);
	t1=(char *)malloc(50);

	while(flag)
	{
		printf("1-查询所有电影信息  2-按名称查询电影信息  3-按类型查询电影信息  4-退出用户模式\n");
		scanf("%d",&n);
		switch(n)
		{
			case 1:Displayall(p);break;
			case 2:
				printf("请输入想看的电影名称: ");
				scanf("%s",n1);
				m1=Nsearch(m2,n1);
				if(m1==NULL)
					break;
				else
				{
					Display1(m1);
					break;
				}
			case 3:
				printf("请输入想看的电影类型: ");
				scanf("%s",t1);
				m3=Tsearch(m2,t1);
				if(m3==NULL)
					break;
				else
				{
					Displayall(m3);
					break;
				}
			case 4:flag=0;break;
			default:printf("输入错误,请重新输入\n");getchar();break;
		}
	}
}

void Admini(FILM *p)
{
	char *password="123456";
	char *n1=(char *)malloc(50);
	char *t1=(char *)malloc(50);
	char *mima=(char *)malloc(10);
	int flag=1;							//退出管理员模式标志
	int n;								//管理员功能选择

	FILM *m1;							//按名称查找电影
	FILM *m2=p;							//函数传参
	FILM *m3;							//按类型查找电影
	FILM *m4=p;							//改变电影库前
	FILM *m5;							//改变电影库后
	printf("请输入管理员密码: ");
	scanf("%s",mima);
	while(strcmp(mima,password))
	{
		printf("密码错误,请重新输入: ");
		scanf("%s",mima);
	}
	while(flag)
	{
		if (!strcmp(mima,password))
		{
			printf("<----------------------1-添加电影  2-修改电影  3-下架电影---------------------->\n");
			printf("4-查询所有电影信息  5-按名称查找电影信息  6-按类型查找电影信息  7-退出管理员模式\n");
			scanf("%d",&n);
			switch(n)
			{
				case 1:
					m5=Addflim(m4);
					printf("增加后的电影列表如下\n");
					Displayall(m5);
					break;
				case 2:
					m5=Modify(m4);
					printf("修改后的电影列表如下\n");
					Displayall(m5);
					break;
				case 3:
					m5=Delete(m4);
					if(m5==NULL)
						break;
					else
					{
						printf("下架后的电影列表如下\n");
						Displayall(m5);
						break;
					}
					
				case 4:Displayall(p);break;
				case 5:
					printf("请输入查找的电影名称: ");
					scanf("%s",n1);
					m1=Nsearch(m2,n1);
					if(m1==NULL)
						break;
					else
					{
						Display1(m1);
						break;
					}
				case 6:
					printf("请输入想看的电影类型: ");
					scanf("%s",t1);
					m3=Tsearch(m2,t1);
					if(m3==NULL)
						break;
					else
					{
						Displayall(m3);
						break;
					}
				case 7:flag=0;break;
				default:printf("输入错误,请重新选择\n");getchar();break;
			}
		}
	}
}

FILM *Nsearch(FILM *p,char *n)
{	
	FILM *m2=p->Next;
	while(m2!=NULL&&strcmp(m2->Name,n))
		m2=m2->Next;
	if (m2==NULL)
	{
		printf("Sorry,信息库并没有这部电影\n");
		return NULL;
	}
	else
		return m2;
	
}

FILM *Tsearch(FILM *p,char *t)
{
	int flag=1;
	FILM *m2=p->Next;

	FILM *head;
	FILM *tail;
	FILM *new;

	head=Space(head);
	tail=head;
	while(m2!=NULL)
	{
		if(strstr(m2->Type,t)==NULL)
			m2=m2->Next;
		else
		{
			new=Space(new);

			strcpy(new->Name,m2->Name);
			strcpy(new->Director,m2->Director);
			strcpy(new->Edit,m2->Edit);
			strcpy(new->Actor,m2->Actor);
			strcpy(new->Type,m2->Type);
			strcpy(new->Prodct,m2->Prodct);
			strcpy(new->Language,m2->Language);
			strcpy(new->Release,m2->Release);
			strcpy(new->Length,m2->Length);
			strcpy(new->Introduction,m2->Introduction);
			new->Star=m2->Star;

			tail->Next=new;
			tail=new;
			m2=m2->Next;
		}
	}
	if(head==NULL)
	{
		printf("信息库并没有这个类型的电影\n");
		return head;
	}
	else
		return head;
}

FILM *Addflim(FILM *p)
{
	int n;			//添加电影数量
	int flag=1;

	FILM *tial=p->Next;
	FILM *new;		//新添加的电影

	printf("需要添加几部电影:");
	scanf("%d",&n);
	while(tial->Next!=NULL)
		tial=tial->Next;
	for (int i = 0; i < n; ++i)
	{
		new=Space(new);
		printf("请输入新电影的名字: \n");
		scanf("%s",new->Name);
		printf("请输入新电影的导演: \n");
		scanf("%s",new->Director);
		printf("请输入新电影的编辑: \n");
		scanf("%s",new->Edit);
		printf("请输入新电影的主演: \n");
		scanf("%s",new->Actor);
		printf("请输入新电影的类型: \n");
		scanf("%s",new->Type);
		printf("请输入新电影的制作国家/地区: \n");
		scanf("%s",new->Prodct);
		printf("请输入新电影的语言: \n");
		scanf("%s",new->Language);
		printf("请输入新电影的上映时间: \n");
		scanf("%s",new->Release);
		printf("请输入新电影的时长: \n");
		scanf("%s",new->Length);
		printf("请输入新电影的简介: \n");
		scanf("%s",new->Introduction);
		printf("请输入新电影的评价星级: \n");
		scanf("%f",&new->Star);

		tial->Next=new;
		tial=new;
	}		
	return p;	
}

FILM *Modify(FILM *p)
{
	int flag=1;
	int n;
	char *n1=(char *)malloc(50);
	char *t1=(char *)malloc(50);

	FILM *m1=p;
	FILM *m2;
	FILM *m3;
	FILM *m4;

	while(flag)
	{
		printf("1-按名字查找并修改  2-按类型查找并修改  3-退出修改\n");
		scanf("%d",&n);
		switch(n)
		{
			case 1:
				printf("请输入要修改的电影名称: ");
				scanf("%s",n1);
				m2=Nsearch(m1,n1);
				//Display1(m2);break;//测试
				if(m2==NULL)
					break;
				else
				{
					printf("修改电影名称: \n");
					scanf("%s",m2->Name);
					printf("修改电影的导演: \n");
					scanf("%s",m2->Director);
					printf("修改电影的编辑: \n");
					scanf("%s",m2->Edit);
					printf("修改电影的主演: \n");
					scanf("%s",m2->Actor);
					printf("修改电影的类型: \n");
					scanf("%s",m2->Type);
					printf("修改电影的制作国家/地区: \n");
					scanf("%s",m2->Prodct);
					printf("修改电影的语言: \n");
					scanf("%s",m2->Language);
					printf("修改电影的上映时间: \n");
					scanf("%s",m2->Release);
					printf("修改电影的时长: \n");
					scanf("%s",m2->Length);
					printf("修改电影的简介: \n");
					scanf("%s",m2->Introduction);
					printf("修改电影的评价星级: \n");
					scanf("%f",&m2->Star);
					break;
				}
			case 2:
				printf("请输入要修改的电影类型: ");
				scanf("%s",t1);
				m2=Tsearch(m1,t1);
				if(m2==NULL)
					break;
				else
				{

					printf("符合该类型的电影如下:\n");
					Displayall(m2);
					m2=m2->Next;
					while(m2!=NULL)
					{
						m3=Nsearch(m1,m2->Name);
						printf("请修改%s\n", m2->Name);
						printf("\n");
						printf("修改电影名称: \n");
						scanf("%s",m3->Name);
						printf("修改电影的导演: \n");
						scanf("%s",m3->Director);
						printf("修改电影的编辑: \n");
						scanf("%s",m3->Edit);
						printf("修改电影的主演: \n");
						scanf("%s",m3->Actor);
						printf("修改电影的类型: \n");
						scanf("%s",m3->Type);
						printf("修改电影的制作国家/地区: \n");
						scanf("%s",m3->Prodct);
						printf("修改电影的语言: \n");
						scanf("%s",m3->Language);
						printf("修改电影的上映时间: \n");
						scanf("%s",m3->Release);
						printf("修改电影的时长: \n");
						scanf("%s",m3->Length);
						printf("修改电影的简介: \n");
						scanf("%s",m3->Introduction);
						printf("修改电影的评价星级: \n");
						scanf("%f",&m3->Star);
						m2=m2->Next;
					}
				}break;
			case 3:flag=0;break;
			default:printf("输入错误,请重新选择\n");getchar();break;
		}
	}
	return p;
}

FILM *Delete(FILM *p)
{
	char *n1=(char *)malloc(50);

	FILM *m1=p;
	FILM *m2;

	printf("请输入要删除的电影名称: ");
	scanf("%s",n1);

	while(m1->Next!=NULL)
	{
		if(strcmp(m1->Next->Name,n1))
			m1=m1->Next;
		else
		{
			m1->Next=m1->Next->Next;
			return p;		
		}
	}
	printf("信息库没有这部电影,无法删除\n");
	return NULL;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值