相比于简单的C语言程序,用C语言写一个管理系统就显得相对复杂很多。在写代码之前,我们首先应有应有一个系统的基本框架,如该系统应该要实现那一些功能,这里我们以“员工管理系统”为例,我们应该建立一个菜单,读取文件的数据并创建链表,将链表中的信息写进文件,删除结点,增加结点,修改结点,以及链表的遍历。当我们明确一个系统应该要实现的功能后,便找到了问题的突破口,接下来只需要将各个功能用函数一一实现即可。
我们接下来以"员工管理系统为例",来进行具体的分析:
为了方便阅读后面文章的代码,我们这里将h设为头指针,结构类型为EMP,结构成员有员工编号number,员工年龄age,员工性别sex,员工姓名name。
1.增加结点与增加员工信息
为使系统代码更加简单化,我们在写"读取文件的数据并创建链表"这部分函数时,可以调用增加结点函数,简化代码。同时在增加员工信息时我们同样可以调用增加结点的函数,减少主函数的代码量,使主函数更加具有可读性。
void add(EMP *p2) //增加结点函数
{
EMP *p1; / /EMP为结构体,再定义一个结构指针
p1=h->next; //h为头指针
if(h==null)
{
p1=h->next; //链表为空时
}
else
{
while(p1 != null)
{
p1=p1->null; //找到尾节点
}
p2=p1->next;
p2->next=null;
}
}
add information() //增加员工信息
{
EMP *p; //定义结构指针存放信息
p=(EMP *)malloc(sizeof(EMP)); //动态分布内存
printf(“please input the employee’s information :(number ,age ,sex ,name)\n”);
scanf("%d%d%s%d",&p->number,&p->age,p->sex,p->name);
add§;
}
用户操作时用的使 add information()函数,而实际上实现该功能的是add(EMP *p2)函数,这样大大减少了主函数的代码量,增加程序的可读性。
总的来说,该部分函数的难点可能在于对尾节点的理解和判断,巧妙的使用while循环便解决了这个问题。
2.删除结点与删除员工信息
同理在删除结点上,我们同样可以将删除用户信息和删除结点联系在一起。简化主函数代码的同时,是程序的条理性变得更好。
void del(char name[20]) //删除结点
{
EMP *p1,*p2;
int flag=0;
p1=h->next;
p2=p1->next;
while(p2->next != null) //保证不是尾节点
{
if((strcmp(name,p2->name))==null)
{
p1->next=p2->next;
free(p2);
flag=1;
break;
}
p1=p2;
p2=p2->next;
}
if(flag==0)
printf("no exist this people !");
else
printf("succeed !");
}
void del_information()
{
char name[20];
printf(“please input the employee’s name:”);
scanf("%s",name);
void del(name);
}
3.读取文件并创建链表
此函数的功能在于读取文件的同时,将文件的信息存到链表中,存储信息时,我们可以调用add(EMP *p2) 函数来简化代码。实现该功能关键是将创建链表和读取文件同时进行。以下的while循环就巧妙的实现了这个操作。
void load();
{
FILE *fp;
fp=fopen(“文件路径”,“文件的打开方式”);
if(fp == NULL)
{
printf(“error ! \n”);
return; //如果文件打开失败,返回到调用函数的地方
}
while(!feof(fp))
{
EMP *P=(EMP *)malloc(sizeof(EMP));
fsacnf(fp,"%d%d%s%s",&p->number,&p->age,p->sex,p->name);
add(p); //函数调用增加结点
}
printf("finish read !");
fclose(fp); //关闭文件
}
4.将链表中的信息存储到文件
在进行这一部分操作时,难点在于要同时进行文件信息的存储和链表的遍历。用while语句便可以巧妙的实现二者同时进行。
//将链表中的信息存储到文件
void save (EMP *h)
{
FILE *fp;
EMP *p;
fp=fopen("文件的打开路径","打开方式"); //打开文件
if(fp=null) //如果文件打开错误,则返回调用函数的地方
{
printf("error !");
return ;
}
p=h->next; //将p初始化为头结点,遍历链表
while(p->next != null)
{
fprintf(fp," %d %d %s %s \n",p->number,p->age,p->sex,p->name);
p=p->next;
}
fclose(fp); //关闭文件
}
5.链表结点的修改和员工信息修改
显然类似于增加结点与增加员工信息和删除结点与删除员工信息,为例主函数的简洁性,我们可以将这两个函数联系起来,二者形成调用与被调用关系。也就是说,用户看到的函数是"/员工信息修改函数",而实际修改信息的是"修改链表结点函数"。这样大大增加了函数的可读性。
//修改员工信息
void update_employee(EMP *h)
{
char name[10];
prinft("input the employee's name:\n");
sacnf("%s",name);
updatedoc(name,h); //调用修改结点函数
}
//修改结点信息
void updatedoc(char name[10],EMP *h)
{
EMP *p;
p=h->next; //将指针p初始化为头结点,以此找到相应的结点
while ((strcmp(name,p->name)) != 0)
{
p=p->next;
}
printf("input the employee's age:");
scanf("%d",&p->age);
printf("input the employee's sex:");
scanf("%s",p->sex);
printf("input the employee's name:\n");
scanf("%s",p->name);
}
6.遍历和显示菜单
这两部分相对来说应该比较简单,前者即是对链表的遍历,后者需要注意的是菜单显示的美观性。
以上即是对用C语言编写简单管理系统的分析。