C语言之课程设计之简易通讯录

课余时间做的一个C课程设计,仅供参考。需要C99标准才能成功编译
一、题目:学生通讯录管理系统
设一个学生的通讯录信息有以下几项数据信息构成:姓名、学院、班级、微信号、QQ号(为数字字符串)、电话号码等组成。系统主要功能:
1)系统要求能够建立、查询、修改和增删学生通讯录信息。包括:可对记录中的电话号码、微信号、QQ号进行修改;可增加和删除记录等。
2)能够按多种方式进行查询。包括按人名、电话号码、班级等进行查询。
要求界面友好,易于查询,用文件保存信息。
(这几乎是我的全部课设报告了,最后附有代码。)
二、总体设计
本学生通讯录管理系统分为五个功能模块,分别为添加新的联系人、查询所有信息、修改联系人信息、删除联系人、查找特定联系人。
在这里插入图片描述
三、各函数模块的功能介绍
1.int main()
此函数保存于main.c文件中。
main中先把文件内容读入链表,再让用户输入命令,并根据命令来选择对应的函数来实现需求,如此不断循环直到用户输入6选择退出或文件不存在时退出。
在这里插入图片描述
2. void inputfile(struct MyList list)
此函数保存于main.c文件中。
inputfile函数作用是把链表中的内容写入文件中,方便之后释放掉旧链表所占的内存和在main函数中建立新的链表,从而达到文件内信息的及时更新同时不用退出程序。只有修改过链表内容才需要调用该函数。
在这里插入图片描述
3.void insertlist(struct MyList list)与 void insertNode(struct MyList list,char name[ ],char id[ ],char phone[ ],char college[ ],int clas,char wechat[ ],char qq[ ])
此两函数保存于insert.c文件中。
当用户选择“1”时,调用insertlist,传结构体指针于insertlist,通过循环录入多个节点数据;每一次循环都调用一次insertNode函数,把输入的数据都传过去,再把输入的数据录入链表中。注意调用insertNode()时是否为空链表,不是则要找到最新的节点再录入数据。当用户不再需要继续录入时,调用inputfile,把新的内容写进文件中,并循环释放掉链表所占的内存。
在这里插入图片描述
4.void displaylist(struct MyList
list)
此函数保存于display.c文件中。
当用户选择“2”时,调用displaylist函数用于展示通讯录中的所有信息。通过循环即可展示,展示结束后循后释放掉链表所占的内存。
在这里插入图片描述
5.void changelist(struct MyList list)与void changeNode(struct Node p)
此两函数保存于change.c文件中。
当用户选择“3”时,调用changelist,让用户输入需要更改的联系人的姓名,通过循环寻找该联系人所在的节点,若找不到则打印“未找到”并退出;若找到则调用changeNode,在changeNode中通过循环和选择结构来更改多个具体信息(而不是该联系人的所有信息);更改结束后,结束调用changeNode,调用inputfile,把新的内容写进文件中,并循环释放掉链表所占的内存。
在这里插入图片描述
6.void deletelist(struct MyList *list)
此函数保存于delete.c文件中。
当用户选择“4”时,调用deletelist,若为空链表则直接结束调用,否则,让用户输入需要更改的联系人的姓名,通过循环寻找该联系人所在的节点,若找不到则打印“未找到”并退出,若找到则删去该节点。
在这里插入图片描述
7.
(1)void visitlist(struct MyList *list);
(2)void visitname(struct MyList *list);
(3)void visitphone(struct MyList *list);
(4)void visitclas(struct MyList *list);
(5)void visitid(struct MyList *list);
(6)void visitcollege(struct MyList *list);
(7)void visitwechat(struct MyList *list);
(8)void visitqq(struct MyList *list);
以上函数保存于visit.c文件中。
当用户选择“5”时,调用visitlist,之后,让用户选择对应的查询方式,分别为:1姓名(英文),2电话号码,3班级,4学号,5学院,6微信号,7QQ号;对于其中的姓名、电话号码、学号、微信号、QQ号,因为每个人的这些信息都是独一无二的(假设没有重名),仅需找出对应的节点并打印所有信息即可;而对于班级和学院,由于会存在复数对象,所以要把所有的拥有同一属性的对象的信息都找出来并打印;查询结束后循环释放掉链表所占的内存。
在这里插入图片描述
四、附录:程序清单
在main.c文件中:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*设计结构体记录联系人信息*/
struct	Node
{
	char name[50];//姓名 
	char id[20];//学号 
	char phone[20];//电话号码 
	char college[100];//学院 
	int clas;//班级 
	char wechat[20];//微信号 
	char qq[20];//QQ号 
	struct	Node *next;
};

struct MyList//用于封装链表;带有链表头指针同时记录节点数的变化 
{
	struct Node *phead;
	int count;
};

void inputfile(struct MyList *list)//把更改后的内容录入文件 
{
	FILE *fp=fopen("student node.txt","w");//以只写的方式打开文件 
	if(fp==NULL)
	{
		printf("文件打开失败!\n");
		exit(1);
	}	
	struct Node *p=list->phead->next;
	while(p!=NULL)//循环把信息写入文件 
	{
		fprintf(fp,"%s %s %s %s %d %s %s\n",p->name, p->id, p->phone,p->college,p->clas,p->wechat,p->qq);
		p=p->next;
	}
	fclose(fp);//关闭文件 
	return;
}

/*声明要调用的函数所在的文件*/
#include "display.c"
#include "insert.c"
#include "change.c" 
#include "visit.c"
#include "delete.c"
 
int main()
{
	/*声明函数*/
	extern void displaylist(struct MyList* list);
	extern void insertNode(struct MyList* list,char name[],char id[],char phone[],char college[],int clas,char wechat[],char qq[]);
	extern void insertlist(struct MyList *list);
	extern void changelist(struct MyList *list);
	extern void changeNode(struct Node* p);
	extern void visitlist(struct MyList *list);
	extern void visitname(struct MyList *list);
	extern void visitphone(struct MyList *list);
	extern void visitclas(struct MyList *list);
	extern void visitid(struct MyList *list);
	extern void visitcollege(struct MyList *list);
	extern void visitwechat(struct MyList *list);
	extern void visitqq(struct MyList *list);
 	extern void deletelist(struct MyList *list);
	
	int order=6;
	//创建文本文件
	FILE *fc=fopen("student node.txt","a"); 
	fclose(fc);
	while(1)
	{	
		struct MyList *plist=(struct MyList*)malloc(sizeof(struct MyList));
		plist->phead=NULL;//头指针初始化 
		plist->count=0;//初始0个节点 
	
		/*把文件内容写入链表,每个函数修改完链表内容都再次把数据写进文件并释放链表 */
		FILE *fp=fopen("student node.txt","r");/*以只读的形式打开文件*/ 
		if(fp==NULL)
		{
			printf("文件打开失败!\n");
			exit(1);
		}
		plist->phead=(struct Node*)malloc(sizeof(struct Node));
		if(plist->phead!=NULL)
		{
			plist->phead->next=NULL;
		}
		char stu_name[50];
		char stu_id[20];
		char stu_phone[20];
		char stu_college[100];
		int stu_clas;
		char stu_wechat[20];
		char stu_qq[20];
		struct Node *tmp=plist->phead;
		struct Node *exchange=plist->phead;
		while(fscanf(fp,"%s %s %s %s %d %s %s",stu_name,stu_id,stu_phone,stu_college,&stu_clas,stu_wechat,stu_qq)!=EOF)
		{
			tmp=(struct Node*)malloc(sizeof(struct Node));
			strcpy(tmp->name,stu_name);
			strcpy(tmp->id,stu_id);
			strcpy(tmp->phone,stu_phone);
			strcpy(tmp->college,stu_college);
			tmp->clas=stu_clas;
			strcpy(tmp->wechat,stu_wechat);
			strcpy(tmp->qq,stu_qq);
			exchange->next=tmp;//链接节点 
			exchange=tmp;//移动指针 
			plist->count++;
		}
		exchange->next=NULL;
		fclose(fp);//关闭文件 
		
		system("cls");//清屏
		printf("欢迎进入学生通讯录管理系统\n"); 
		printf("请输入您的命令:\n");
		printf(".....||1(添加新的联系人)  ||.....\n");/*菜单*/
		printf(".....||2(查询所有信息  )  ||.....\n");
		printf(".....||3(修改联系人信息)  ||.....\n"); 
		printf(".....||4(删除联系人    )  ||.....\n");
		printf(".....||5(查找特定联系人)  ||.....\n");
		printf(".....||6(退出系统      )  ||.....\n");
		scanf("%d",&order);
		switch(order)
		{
			case 1:
				insertlist(plist);//添加新的联系人 
				break;
			case 2:
				displaylist(plist);//查询所有信息 
				break;
			case 3:
				changelist(plist);//修改联系人信息 
				break;
			case 4:
				deletelist(plist);//删除联系人 
				break;
			case 5:
				visitlist(plist);//查找特定联系人 
				break;
			case 6:
				return 0;//退出程序 
			default:
				printf("命令错误,请重新输入\n");
				break;	
		}
		system("pause");//功能:请按任意键继续
	}
	return 0;
}

在insert.c文件中:

 /*声明要调用的函数在别的文件*/
extern void inputfile(struct MyList *list);

void insertNode(struct MyList* list,char name[],char id[],char phone[],char college[],int clas,char wechat[],char qq[])
{
	struct Node* p=NULL;
	list->count++;//记录节点的变化 
	if(list->phead->next==NULL)//空链表时 
	{
		p=(struct Node*)malloc(sizeof(struct Node));//开辟空间
		/*复制信息到链表中*/ 
		strcpy(p->name,name);
		strcpy(p->id,id);
		strcpy(p->phone,phone);
		strcpy(p->college,college);
		p->clas=clas;
		strcpy(p->wechat,wechat);
		strcpy(p->qq,qq);
		p->next=NULL;
		list->phead->next=p;//赋值头指针的地址 
		return;	
	}
	
	p=list->phead->next;//不是空链表时 
	while(p->next)//循环找到找到最新节点 
	{
		p=p->next;
	}
	p->next = (struct Node*)malloc(sizeof(struct Node));
	strcpy(p->next->name,name);
	strcpy(p->next->id,id);
	strcpy(p->next->phone,phone);
	strcpy(p->next->college,college);
	p->next->clas=clas;
	strcpy(p->next->wechat,wechat);
	strcpy(p->next->qq,qq);
	p->next->next=NULL;
	return;
}


void insertlist(struct MyList *list)
{
	char name[50];
	char id[20];
	char phone[20];
	char college[100];
	int clas;
	char wechat[20];
	char qq[20];
	int c=1;
	printf("请输入要录入的学生的信息:\n");
	
	while(c)/*循环录入信息*/
	{
		printf("格式:姓名(英文) 学号(10位) 手机号码(11位) 学院(英文) 班级 微信号 QQ号\n");
		scanf("%s %s %s %s %d %s %s",name,id,phone,college,&clas,wechat,qq);
		insertNode(list,name,id,phone,college,clas,wechat,qq);/*调用insertNode函数*/
		printf("是否继续录入?1继续/0结束\n");
		scanf("%d",&c);
	}
	printf("录入结束\n");
	inputfile(list);//把链表内容写进文件
	//循环释放链表内存 
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);//释放 
		k=list->phead->next;
	}
	return;
}

在display.c文件中:

 void displaylist(struct MyList* list)
{
	struct Node *head;
	head=list->phead->next;
	for(int i=0;i<list->count;i++)/*循环展示链表信息*/
	{
		printf("姓名(英文):%s ",head->name);
		printf("学号:%s ",head->id);
		printf("手机号码:%s ",head->phone);
		printf("学院(英文):%s ",head->college);
		printf("班级:%d ",head->clas);
		printf("微信号:%s ",head->wechat);
		printf("QQ号:%s ",head->qq);
		printf("\n\n");
		head=head->next;//移动指针 
	}
	//循环释放链表内存 
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);//释放 
		k=list->phead->next;
	}
}

在change.c文件中:

 /*声明要调用的函数在别的文件*/
extern void inputfile(struct MyList *list);

void changeNode(struct Node* p)
{
	int num;
	while(1)
	{
		printf("输入1,更改姓名(英文)\n输入2,更改学号\n");
		printf("输入3,更改手机号码\n输入4,更改学院(英文)\n");
		printf("输入5,更改班级\n输入6,更改微信号\n");
		printf("输入7,更改QQ号\n输入-1,更改结束\n");
		scanf("%d",&num);
		switch(num)
		{
			case 1:
				printf("请输入新姓名(英文):");
				scanf("%s",p->name);
				break; 
			case 2:
				printf("请输入新学号:");
				scanf("%s",p->id);
				break; 
			case 3:
				printf("请输入新电话号码:");
				scanf("%s",p->phone);
				break; 
			case 4:
				printf("请输入新学院(英文):");
				scanf("%s",p->college);
				break; 
			case 5:
				printf("请输入新班级:");
				scanf("%d",&p->clas);
				break; 
			case 6:
				printf("请输入新微信号:");
				scanf("%s",p->wechat);
				break; 
			case 7:
				printf("请输入新QQ号:");
				scanf("%s",p->qq);
				break; 
			case -1:break;
			default:printf("指令不正确,请重新输入\n");
		}
		if(num==-1)//打破循环,结束调用 
		{
			printf("更改结束!\n");
			break;
		}
	}
}


 

void changelist(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char a[50];
	printf("请输入需要修改的联系人姓名(英文):\n");
	scanf("%s",a);
	while(1)
	{
		num=strcmp(pt->name,a);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		changeNode(pt);//更改信息 
		inputfile(list);//更改后的内容写入文件 
	}
	//循环释放链表内存 
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);//释放 
		k=list->phead->next;
	}
	return ;
}

在delete.c文件中:

 /*声明要调用的函数在别的文件*/
extern void inputfile(struct MyList *list);

void deletelist(struct MyList *list)
{
	if(list->phead->next == NULL)//空链表 
    {
        printf("通讯录为空!\n");
        return;
    }
	int num;
	struct Node *now,*prev;//两个指针,一前一后 
	now=list->phead->next;
	prev=NULL;
	char a[50];
	printf("请输入需要删除的联系人姓名(英文):\n");
	scanf("%s",a);
	while(1)
	{
		num=strcmp(now->name,a);
		if(num==0)
			break;//找到联系人 
		prev=now;
		now=now->next;
		if(now==NULL)
		{
			printf("未找到对应的联系人...\n");
			return;//结束调用 
		}
	}
	if(now==list->phead->next)//联系人在头节点时 
	{
		list->phead->next=now->next;
		free(now);
	}
	else//联系人在中间或尾节点时 
	{
		prev->next=now->next;
		free(now);
	}
	printf("删除结束!\n");
	inputfile(list);//更改后的内容写入文件 
	list->count--;
	//循环释放链表内存 
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);//释放 
		k=list->phead->next;
	}
	return ;
}

在visit.c文件中:

 /*声明可能要调用的函数在别的文件*/
extern void inputfile(struct MyList *list);

void visitname(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char a[50];
	printf("请输入需要搜索的联系人姓名(英文):\n");
	scanf("%s",a);
	while(1)
	{
		num=strcmp(pt->name,a);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名(英文):%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院(英文):%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitphone(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char phonenum[20];
	printf("请输入需要搜索的联系人的手机号码:\n");
	scanf("%s",phonenum);
	while(1)
	{
		num=strcmp(pt->phone,phonenum);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名(英文):%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院(英文):%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitclas(struct MyList *list)
{
	int clasnum;
	struct Node* pt=list->phead->next;
	printf("请输入需要搜索的联系人的班级:\n");
	scanf("%d",&clasnum);
	printf("搜索结果如下:\n");
	for(;;)//可能存在多个人隶属于同一个班 
	{
		if(clasnum==pt->clas)
		{
		printf("姓名(英文):%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院(英文):%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
		}
		pt=pt->next;
		if(pt==NULL)
		{
			printf("搜索结束...\n");
			return;
		}
	}
}

void visitid(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char idnum[20];
	printf("请输入需要搜索的联系人的学号:\n");
	scanf("%s",idnum);
	while(1)
	{
		num=strcmp(pt->id,idnum);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名(英文):%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院(英文):%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitcollege(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char collegename[100];
	printf("请输入需要搜索的联系人的学院:\n");
	scanf("%s",collegename);
	 
	while(1)//可能存在多个人隶属同一个学院 
	{
		num=strcmp(pt->college,collegename);
		if(num==0)
		{
			if(pt!=NULL)
			{
				printf("搜索结果如下:\n");
				printf("姓名(英文):%s ",pt->name);
				printf("学号:%s ",pt->id);
				printf("手机号码:%s ",pt->phone);
				printf("学院(英文):%s ",pt->college);
				printf("班级:%d ",pt->clas);
				printf("微信号:%s ",pt->wechat);
				printf("QQ号:%s ",pt->qq);
				printf("\n\n");
			}
		}
		pt=pt->next;
		if(pt==NULL)
		{
			printf("搜索结束...\n");
			return;
		}
	}
	 
	return;	
}

void visitwechat(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char wechatnum[20];
	printf("请输入需要搜索的联系人的微信号:\n");
	scanf("%s",wechatnum);
	while(1)
	{
		num=strcmp(pt->wechat,wechatnum);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名(英文):%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院(英文):%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitqq(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char qqnum[20];
	printf("请输入需要搜索的联系人的QQ号:\n");
	scanf("%s",qqnum);
	while(1)
	{
		num=strcmp(pt->qq,qqnum);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名(英文):%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院(英文):%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitlist(struct MyList *list)
{
	if(list->phead->next==NULL)//空链表 
	{	
        printf("通讯录为空!\n");
        return;
	}
	printf("请选择搜索方式:1姓名(英文),2电话号码,3班级,4学号,5学院,6微信号,7QQ号\n");
	int num;
	scanf("%d",&num);
	switch(num)
	{
		case 1:
			visitname(list);
			break;
		case 2:
			visitphone(list);
			break;
		case 3:
			visitclas(list);
			break;
		case 4:
			visitid(list);
			break;
		case 5:
			visitcollege(list);
			break;
		case 6:
			visitwechat(list);
			break;
		case 7:
			visitqq(list);
			break;	
		default:
			printf("命令错误\n");
			break;
	}
	//循环释放链表内存 
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);//释放 
		k=list->phead->next;
	}
	return;
} 

五、结果展示
这里就不完全展示了,随意贴几张图吧。
在这里插入图片描述
 求赞
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、体会与总结
该系统完成了建立、查询、修改和增删学生通讯录信息,做到了能够按多种方式进行查询,包括按人名、电话号码、班级等进行查询。
系统的界面友好,易于查询,用文件保存信息。
同时,我的课程设计使用多文件多函数编程方式,结合了本学期所学的C语言知识,熟练运用了数组、函数、结构体、指针、链表、文件读写操作等,并且在课程设计中设计了一个结构体用以封装链表,提高代码的解耦性,得到更好的复用率;每次操作结束后使用清屏,从而让系统界面更加美观,而不会把让之前的操作堆积在屏幕上;文件读写贯穿整个系统,并与链表的创建和释放紧密结合,节约了内存空间同时保证了文件的实时更新。
扩展功能:修改联系人的部分,通过选择结构来让用户可以具体更改某一条信息而不必每次修改都要全部重改;提供了多种查询方式,每种都根据该选择的属性来实现搜索。
此次课程设计,让我更加熟练地掌握C语言相关语法知识,特别是对链表的运用,并通过自学掌握了对文件的操作,初步体会到了算法的美妙,同时对做项目的过程有了一个大概的认识;但对于边界问题,特别是链表的边界问题,仍需提升相关能力;对于程序的调试能力,比如断点调试,还有待提高;由于汉字编码问题,文件读写部分中文会出现乱码,所以只能采用英文来录入信息 。
通过该次课程设计,我初步掌握开发一个小型实用系统的基本方法,学会了通过流程图来表达算法,锻炼了书写课程设计报告的能力;我也更深入地体会到结构化设计和低耦合的思想;我也更加深入地理解了面对过程的编程。

(以下是一个.c文件内包含所有内容,实际内容和上方一致,只是少了多文件编译。)

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

struct	Node
{
	char name[50];//姓名 
	char id[20];//学号 
	char phone[20];//电话号码 
	char college[100];//学院 
	int clas;//班级 
	char wechat[20];//微信号 
	char qq[20];//QQ号 
	struct	Node *next;
};

struct MyList//用于封装链表Node;带有Node头指针同时记录节点数的变化 
{
	struct Node *phead;
	int count;
};

void inputfile(struct MyList *list)//把更改后的内容录入文件 
{
	FILE *fp=fopen("student node.txt","w");
	if(fp==NULL)
	{
		printf("文件打开失败!\n");
		exit(1);
	}	
	struct Node *p=list->phead->next;
	while(p!=NULL)
	{
		fprintf(fp,"%s %s %s %s %d %s %s\n",p->name, p->id, p->phone,p->college,p->clas,p->wechat,p->qq);
		p=p->next;
	}
	fclose(fp);
	return;
}

void insertNode(struct MyList* list,char name[],char id[],char phone[],char college[],int clas,char wechat[],char qq[])
{
	struct Node* p=NULL;
	list->count++;
	if(list->phead->next==NULL)//空链表时 
	{
		p=(struct Node*)malloc(sizeof(struct Node));
		strcpy(p->name,name);
		strcpy(p->id,id);
		strcpy(p->phone,phone);
		strcpy(p->college,college);
		p->clas=clas;
		strcpy(p->wechat,wechat);
		strcpy(p->qq,qq);
		p->next=NULL;
		list->phead->next=p;
		return;	
	}
	
	p=list->phead->next;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	p->next = (struct Node*)malloc(sizeof(struct Node));
	strcpy(p->next->name,name);
	strcpy(p->next->id,id);
	strcpy(p->next->phone,phone);
	strcpy(p->next->college,college);
	p->next->clas=clas;
	strcpy(p->next->wechat,wechat);
	strcpy(p->next->qq,qq);
	p->next->next=NULL;
	return;
}


void insertlist(struct MyList *list)
{
	char name[50];
	char id[20];
	char phone[20];
	char college[100];
	int clas;
	char wechat[20];
	char qq[20];
	int c=1;
	printf("请输入要录入的学生的信息:\n");
	
	while(c)
	{
		printf("格式:姓名 学号(10位) 手机号码(11位) 学院 班级 微信号 QQ号\n");
		scanf("%s %s %s %s %d %s %s",name,id,phone,college,&clas,wechat,qq);
		insertNode(list,name,id,phone,college,clas,wechat,qq);
		printf("是否继续录入?1继续/0结束\n");
		scanf("%d",&c);
	}
	printf("录入结束\n");
	inputfile(list);
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);
		k=list->phead->next;
	}
	return;
}

void displaylist(struct MyList* list)
{
	struct Node *head;
	head=list->phead->next;
	for(int i=0;i<list->count;i++)
	{
		printf("姓名:%s ",head->name);
		printf("学号:%s ",head->id);
		printf("手机号码:%s ",head->phone);
		printf("学院:%s ",head->college);
		printf("班级:%d ",head->clas);
		printf("微信号:%s ",head->wechat);
		printf("QQ号:%s ",head->qq);
		printf("\n\n");
		head=head->next;
	}
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);
		k=list->phead->next;
	}
}

void changeNode(struct Node* p)
{
	int num;
	while(1)
	{
		printf("输入1,更改姓名\n输入2,更改学号\n");
		printf("输入3,更改手机号码\n输入4,更改学院\n");
		printf("输入5,更改班级\n输入6,更改微信号\n");
		printf("输入7,更改QQ号\n输入-1,更改结束\n");
		scanf("%d",&num);
		switch(num)
		{
			case 1:
				printf("请输入新姓名:");
				scanf("%s",p->name);
				break; 
			case 2:
				printf("请输入新学号:");
				scanf("%s",p->id);
				break; 
			case 3:
				printf("请输入新电话号码:");
				scanf("%s",p->phone);
				break; 
			case 4:
				printf("请输入新学院:");
				scanf("%s",p->college);
				break; 
			case 5:
				printf("请输入新班级:");
				scanf("%d",&p->clas);
				break; 
			case 6:
				printf("请输入新微信号:");
				scanf("%s",p->wechat);
				break; 
			case 7:
				printf("请输入新QQ号:");
				scanf("%s",p->qq);
				break; 
			case -1:break;
			default:printf("指令不正确,请重新输入\n");
		}
		if(num==-1)
		{
			printf("更改结束!\n");
			break;
		}
	}
}

void changelist(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char a[50];
	printf("请输入需要修改的联系人姓名:\n");
	scanf("%s",a);
	while(1)
	{
		num=strcmp(pt->name,a);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		changeNode(pt);//更改信息 
		inputfile(list);//更改后的内容写入文件 
	}
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);
		k=list->phead->next;
	}
	return ;
}

void deletelist(struct MyList *list)
{
	if(list->phead->next == NULL)
    {
        printf("通讯录为空!\n");
        return;
    }
	int num;
	struct Node *now,*prev;
	now=list->phead->next;
	prev=NULL;
	char a[50];
	printf("请输入需要删除的联系人姓名:\n");
	scanf("%s",a);
	while(1)
	{
		num=strcmp(now->name,a);
		if(num==0)
			break;
		prev=now;
		now=now->next;
		if(now==NULL)
		{
			printf("未找到对应的联系人...\n");
			return;
		}
	}
	if(now==list->phead->next)
	{
		list->phead->next=now->next;
		free(now);
	}
	else
	{
		prev->next=now->next;
		free(now);
	}
	printf("删除结束!\n");
	inputfile(list);//更改后的内容写入文件 
	list->count--;
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);
		k=list->phead->next;
	}
	return ;
}

void visitname(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char a[50];
	printf("请输入需要搜索的联系人姓名:\n");
	scanf("%s",a);
	while(1)
	{
		num=strcmp(pt->name,a);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名:%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院:%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}

	return ;
}

void visitphone(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char phonenum[20];
	printf("请输入需要搜索的联系人的手机号码:\n");
	scanf("%s",phonenum);
	while(1)
	{
		num=strcmp(pt->phone,phonenum);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名:%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院 :%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitclas(struct MyList *list)
{
	int clasnum;
	struct Node* pt=list->phead->next;
	printf("请输入需要搜索的联系人的班级:\n");
	scanf("%d",&clasnum);
	printf("搜索结果如下:\n");
	for(;;)
	{
		if(clasnum==pt->clas)
		{
		printf("姓名 :%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院 :%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
		}
		pt=pt->next;
		if(pt->next==NULL)
		{
			printf("搜索结束...\n");
			return;
		}
	}
}

void visitid(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char idnum[20];
	printf("请输入需要搜索的联系人的学号:\n");
	scanf("%s",idnum);
	while(1)
	{
		num=strcmp(pt->id,idnum);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名 :%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院 :%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitcollege(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char collegename[100];
	printf("请输入需要搜索的联系人的学院:\n");
	scanf("%s",collegename);
	 
	while(1)
	{
		num=strcmp(pt->college,collegename);
		if(num==0)
		{
			if(pt!=NULL)
			{
				printf("搜索结果如下:\n");
				printf("姓名 :%s ",pt->name);
				printf("学号:%s ",pt->id);
				printf("手机号码:%s ",pt->phone);
				printf("学院 :%s ",pt->college);
				printf("班级:%d ",pt->clas);
				printf("微信号:%s ",pt->wechat);
				printf("QQ号:%s ",pt->qq);
				printf("\n\n");
			}
		}
		pt=pt->next;
		if(pt==NULL)
		{
			printf("搜索结束...\n");
			return;
		}
	}
	 
	return;	
}

void visitwechat(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char wechatnum[20];
	printf("请输入需要搜索的联系人的微信号:\n");
	scanf("%s",wechatnum);
	while(1)
	{
		num=strcmp(pt->wechat,wechatnum);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名 :%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院 :%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitqq(struct MyList *list)
{
	int num;
	struct Node* pt=list->phead->next;
	char qqnum[20];
	printf("请输入需要搜索的联系人的QQ号:\n");
	scanf("%s",qqnum);
	while(1)
	{
		num=strcmp(pt->qq,qqnum);
		if(num==0)
			break;//找到对应的联系人 
		pt=pt->next;
		if(pt==NULL)
		{
			printf("未找到对应的联系人...\n");
			break;
		}
	}
	if(pt!=NULL)
	{
		printf("搜索结果如下:\n");
		printf("姓名 :%s ",pt->name);
		printf("学号:%s ",pt->id);
		printf("手机号码:%s ",pt->phone);
		printf("学院 :%s ",pt->college);
		printf("班级:%d ",pt->clas);
		printf("微信号:%s ",pt->wechat);
		printf("QQ号:%s ",pt->qq);
		printf("\n\n");
	}
	return ;
}

void visitlist(struct MyList *list)
{
	if(list->phead->next==NULL)
	{	
        printf("通讯录为空!\n");
        return;
	}
	printf("请选择搜索方式:1姓名 ,2电话号码,3班级,4学号,5学院,6微信号,7QQ号\n");
	int num;
	scanf("%d",&num);
	switch(num)
	{
		case 1:
			visitname(list);
			break;
		case 2:
			visitphone(list);
			break;
		case 3:
			visitclas(list);
			break;
		case 4:
			visitid(list);
			break;
		case 5:
			visitcollege(list);
			break;
		case 6:
			visitwechat(list);
			break;
		case 7:
			visitqq(list);
			break;	
		default:
			printf("命令错误\n");
			return;
	}
	struct Node *k=list->phead->next;
	while(k!=NULL)
	{
		list->phead->next=k->next;
		free(k);
		k=list->phead->next;
	}
	return;
} 

int main()
{
	int order=6;
	FILE *fc=fopen("student node.txt","a");
	fclose(fc);
	while(1)
	{	
		struct MyList *plist=(struct MyList*)malloc(sizeof(struct MyList));
		plist->phead=NULL;//头指针初始化 
		plist->count=0;//初始0个节点 
	
		FILE *fp=fopen("student node.txt","r");//先把文件内容写入链表,每个函数修改完链表都再次把数据写进文件 
		if(fp==NULL)
		{
			printf("文件打开失败!\n");
			exit(1);
		}
		plist->phead=(struct Node*)malloc(sizeof(struct Node));
		if(plist->phead!=NULL)
		{
			plist->phead->next=NULL;
		}
		char stu_name[50];
		char stu_id[20];
		char stu_phone[20];
		char stu_college[100];
		int stu_clas;
		char stu_wechat[20];
		char stu_qq[20];
		struct Node *tmp=plist->phead;
		struct Node *exchange=plist->phead;
		while(fscanf(fp,"%s %s %s %s %d %s %s",stu_name,stu_id,stu_phone,stu_college,&stu_clas,stu_wechat,stu_qq)!=EOF)
		{
			tmp=(struct Node*)malloc(sizeof(struct Node));
			strcpy(tmp->name,stu_name);
			strcpy(tmp->id,stu_id);
			strcpy(tmp->phone,stu_phone);
			strcpy(tmp->college,stu_college);
			tmp->clas=stu_clas;
			strcpy(tmp->wechat,stu_wechat);
			strcpy(tmp->qq,stu_qq);
			exchange->next=tmp;//链接 
			exchange=tmp;//移动 
			plist->count++;
		}
		exchange->next=NULL;
		fclose(fp);
		
		system("cls");//清屏
		printf("欢迎进入学生通讯录管理系统\n"); 
		printf("请输入您的命令:\n");
		printf(".....||1(添加新的联系人)  ||.....\n");
		printf(".....||2(查询所有信息  )  ||.....\n");
		printf(".....||3(修改联系人信息)  ||.....\n");//对记录中的电话号码、微信号、QQ号进行修改
		printf(".....||4(删除联系人    )  ||.....\n");
		printf(".....||5(查找特定联系人)  ||.....\n");
		printf(".....||6(退出系统      )  ||.....\n");
		scanf("%d",&order);
		switch(order)
		{
			case 1:
				insertlist(plist);
				break;
			case 2:
				displaylist(plist);
				break;
			case 3:
				changelist(plist);
				break;
			case 4:
				deletelist(plist);
				break;
			case 5:
				visitlist(plist);
				break;
			case 6:
				return 0;
			default:
				printf("命令错误,请重新输入\n");
				break;	
		}
		system("pause");//功能:请按任意键继续
	}
	return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值