【求助】C语言数据管理源代码(前面发过帖,但不满意,问题多了)大家帮忙完善下
大家帮我改下源代码,不要和我说什么程序通过,你试着输入些数据就会发现问题了,我试过了说程序可执行,但修改数据模块好像有点问题,另外我想把/*创建链表,完成数据录入功能,新结点在表头插入*/改成从表尾插入,可是自己改老出错,不得已写成表头插入,下面是源代码(还有加密没弄,不会。。。)1)程序执行时,首先要进行密码检测,以不让非法用户使用本程序。标准密码预先在程序中设定,程序运行时,若用户的输入密码和标准密码相同,则显示“口令正确!”,并转去执行后续程序,若不想等责重新输入,3次不行等则显示“您是非法用户!!”,并终止程序执行。
2)将自己需要保护的数据加密后存入指定文件中。现在每个人在不同网站都有用户名和密码等信息,还有银行卡卡号及密码信息,众多的信息经常忘记,现在我们可通过C编程将其加密后存入指定的文件中。(至少要对密码加密,加密方法不限,简单加密方法如将字符的ASCII值加2)
3)需要保护的数据信息包括编号,账号位置,账号描述,账号名,密码等如:
**********************************************************************
编号 账号位置 账号描述 账号名 密码
1 http://www. 科大邮箱 daxiang@hnust. 123456
2 http://mail. 手机邮箱 13187323020@ 654321
3 http://wwww. 程序开发网 xiangdesheng 123456
**********************************************************************
4)对指定文件中的信息要能进行添加、删除和明文显示等功能
5)具体提供以下功能:
1.开始运行程序是要进行密码验证
2.系统以菜单方式工作
3.带保护数据的录入功能(用文件保存)----输入。要求通过命令行给出文件名,设程序可执行名为jiami.exe,baocunshujude文件起名为my.dat,则要在DOS窗口输入命令jiami my.dat(也可以在VC6中设置程序参数my.dat)。若文件my.dat已经存在,则在该文件中追加数据,如果不存在,则新建。
4.保护数据的明文浏览功能----输出
5.保护数据的查询功能----算法。按账号名查询,如输入“xiang”查询,上表中两条记录均应查询出来
6.保护数据的删除、修改功能----算法
7.数据信息存入文件或激昂文件中的数据信息导入
6)主要应用点:数组、指针、结构体、文件
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "string.h"
#define N 50
typedef struct stu
{
char address[N]; //账号位置
char score[N]; //账号描述
char name[N]; //账号名
char order[N]; //密码
struct stu *next;
}STUDENT;
/*菜单函数,返回值为整数*/
int menu_select()
{
char s[3];
int c;
printf("\n ***************主菜单**************\n");
printf(" 1. 输入记录\n");
printf(" 2. 显示所有记录\n");
printf(" 3. 按账号名查找记录并显示\n");
printf(" 4. 插入记录\n");
printf(" 5. 修改记录\n");
printf(" 6. 删除记录\n");
printf(" 7. 将所有记录保存到文件\n");
printf(" 8. 从文件中读入所有记录\n");
printf(" 9. 退出\n");
printf(" ***********************************\n\n");
do
{
printf(" 请选择操作(1-9):");
scanf("%s",s);
c=atoi(s);
}while(c<0||c>9); /*选择项不在0~9之间重输*/
return(c); /*返回选择项,主程序根据该数调用相应的函数*/
}
/*创建链表,完成数据录入功能,新结点在表头插入*/
STUDENT *create()
{
STUDENT *h=NULL,*info; /*h:头结点指针;info:新结点指针*/
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!info) /*如果指针info为空*/
{
printf("\n内存分配失败");
return NULL; /*返回空指针*/
}
printf("\n请按如下提示输入相关信息.\n\n");
printf("输入账号位置(输入'#'跳出):"); /*如果输入首字符为#则结束输入*/
scanf("%s",info->address);
if(info->address[0]=='#') break;
printf("输入账号描述:");
scanf("%s",info->score);
printf("输入账号名:");
scanf("%s",info->name);
printf("输入密码:");
scanf("%s",info->order);
info->next=h;
h=info;
}
return(h); /*返回头指针*/
}
/*显示模块*/
void print(STUDENT *h)
{
int i=0; /* 统计记录条数*/
STUDENT *p; /*移动指针*/
p=h; /*初值为头指针*/
if(p==NULL)
{
printf("\n 很遗憾,空表中没有任何记录可供显示!\n");
}
else
{
printf("******************************* STUDENT ***************************************\n");
printf(" 编号 账号位置 账号描述 账号名 密码 \n");
printf("--------------------------------------------------------------------------------\n");
while(p!=NULL)
{
i++;
printf(" %-7ld%-21s %-15s%-24s%s\n",i,p->address,p->score,p->name,p->order);
p=p->next;
}
printf("*******************************************************************************\n\n");
}
}
/*查找记录模块*/
void search(STUDENT *h)
{
STUDENT *p; /*移动指针*/
char s[15]; /*存放字符数组*/
printf("请输入您要查找的账号名:\n");
scanf("%s",s);
p=h; /*将头指针赋给p*/
while(p!=NULL&&strcmp(p->name,s)!=0) /*当记录的账号名不是要找的,并且指针不为空时*/
p=p->next; /*移动指针,指向下一结点,继续查找*/
if(p==NULL) /*指针为空,说明未能找到所要的结点*/
printf("\n您要查找的是%s,很遗憾,查无此账号!\n",s);
else
{
printf("******************************** Found ****************************************\n");
printf(" 账号位置 账号描述 账号名 密码 \n");
printf("-------------------------------------------------------------------------------\n");
printf(" %-21s %-15s%-24s%s\n",p->address,p->score,p->name,p->order);
printf("*******************************************************************************\n");
}
}
/*修改记录模块*/
STUDENT *check(STUDENT *h)
{
STUDENT *p=h; /*将头指针赋给p*/
char b[N]; /*定义要输入字符的数组*/
printf("请输入你要修改的账号名(输入'#'返回主菜单):"); /*如果输入首字符为#则结束输入*/
scanf("%s",b);
if(b[0]=='#') return h; /*返回主菜单8?
while(strcmp(p->name,b)!=0||p->next==NULL) /*当记录的账号名不是要找的,并且指针不为空时*/
p=p->next; /*移动指针,指向下一结点,继续查找*/
if(strcmp(p->name,b)==0) /*当记录的账号名是要找的,输入要修改成的数据*/
{
printf("输入您要修改成的账号位置:");
scanf("%s",p->address);
printf("输入您要修改成的账号描述:");
scanf("%s",p->score);
printf("输入您要修改成的账号名:");
scanf("%s",p->name);
printf("输入您要修改成的密码:");
scanf("%s",p->order);
printf("修改成功!!!");
}
if(p->next==NULL)
{
printf("查无此账号!!!\n");
}
return h; /*返回头指针*/
}
/*添加记录模块*/
STUDENT *insert(STUDENT *h)
{
STUDENT *info,*p=h; /*p指向插入位置,头指针赋给p,info指新插入记录*/
int n=0;
while(p->next!=NULL)
p=p->next;
printf("\n请添加新记录!\n");
info=(STUDENT *)malloc(sizeof(STUDENT));
if(!info)
{
printf("\n内存分配失败!");
return NULL; /*返回空指针*/
}
printf("输入账号位置:");
scanf("%s",info->address);
printf("输入账号描述:");
scanf("%s",info->score);
printf("输入账号名:");
scanf("%s",info->name);
printf("输入密码:");
scanf("%s",info->order);
p->next=info ;
info->next=NULL;
printf("\n ----已经添加 %s 到链表!----\n",info->name);
return(h); /*返回头指针*/
}
/*删除记录模块*/
STUDENT *delete1(STUDENT *h)
{
char k[5]; /*定义字符串数组,用来确认删除信息*/
STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
char s[N];
printf("请输入要删除数据的账号名(输入'#'返回主菜单):\n");
scanf("%s",s); /*输入要删除记录的账号名*/
if(s[0]=='#') return h; /*如果输入首字符为#则结束输入*/
q=p=h; /*给q和p赋初值头指针*/
while(p!=NULL&&strcmp(p->name,s)) /*当记录的账号名不是要找的,或指针不为空时*/
{
q=p; /*将p指针值赋给q作为p的前驱指针*/
p=p->next; /*将p指针指向下一条记录*/
}
if(p==NULL) /*如果p为空,说明链表中没有该结点*/
printf("\n很遗憾,链表中没有您要删除数据的账号!\n",s);
else
{
printf("******************************** Found ****************************************\n");
printf(" 账号位置 账号描述 账号名 密码 \n");
printf("-------------------------------------------------------------------------------\n");
printf(" %-21s %-15s%-24s%s\n",p->address,p->score,p->name,p->order);
printf("*******************************************************************************\n");
do{
printf("您确实要删除此记录吗?(y/n):");
scanf("%s",k);
}while(k[0]!='y'&&k[0]!='n');
if(k[0]!='n')
{
if(p==h) /*如果p==h,说明被删结点是头结点*/
h=p->next; /*修改头指针指向下一条记录*/
else
q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
free(p); /*释放p所指结点空间*/
printf("\n 已经成功删除账号为%s的记录!\n",s);
}
}
return(h); /*返回头指针*/
}
/*保存数据到文件模块*/
void save(STUDENT *h)
{
FILE *fp; /*定义指向文件的指针*/
STUDENT *p; /*定义移动指针*/
char outfile[20]; /*保存输出文件名*/
printf("请输入导出文件名,例如:d:\\xds\\score.txt:\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/
{
printf("不能打开文件,文件保存失败!\n");
}
else
{
p=h; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,sizeof(STUDENT),1,fp); /*写入一条记录*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("-----所有记录已经成功保存至文件%s中!-----\n",outfile); /*显示保存成功*/
}
}
/*导入信息模块*/
STUDENT *load()
{
STUDENT *p,*q,*h=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[20]; /*保存文件名*/
printf("请输入导入文件名,例如:d:\\xds\\score.txt:\n");
scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
{
printf("文件打开失败!\n"); /*如不能打开,返回头指针*/
return h;
}
p=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!p)
{
printf("内存分配失败!\n"); /*如没有申请到,则内存溢出*/
return h; /*返回空头指针*/
}
h=p; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(1!=fread(p,sizeof(STUDENT),1,fp))
break; /*如果没读到数据,跳出循环*/
p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*为下一个结点申请空间*/
if(!p->next)
{
printf("内存分配失败!\n"); /*如没有申请到,则内存溢出*/
return h;
}
q=p; /*保存当前结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("已经成功从文件%s导入数据!!!\n",infile);
return h; /*返回头指针*/
}
/******主函数开始*******/
void main()
{
{
char password[10]={"123456"}; /*设定密码*/
char key[40]; /*定义输入密码的数组*/
int i=0; /*记录输入密码次数*/
while(1)
{
printf("\n请输入密码:");
gets(key); /*输入密码*/
if(strcmp(key,password)!=0) /*输入的密码与原设定密码*/
printf("\n密码错误!\n"); /*对输入的密码错误*/
else
break; /*输入的密码与原设定密码相同,跳出循环*/
i++; /*对下一次输入密码记录*/
if(i==3)
exit(0); /*输入密码次数大于3时结束*/
}
printf("\n密码正确!\n");
}
STUDENT *head = NULL; /*链表定义头指针*/
system("color 5e"); /*调DOS命令清屏,可用color ?命令查看命令格式*/
for(;;) /*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{
case 1: head=create();break; /*创建链表*/
case 2: print(head);break; /*显示全部记录*/
case 3: search(head);break; /*查找记录*/
case 4: head=insert(head);break; /*插入记录*/
case 5: head=check(head);break; /*修改记录*/
case 6: head=delete1(head);break; /*删除记录*/
case 7: save(head);break; /*保存文件*/
case 8: head=load();break; /*读文件*/
case 9: exit(0); /*程序结束*/
}
}
}
[ 本帖最后由 huang6896 于 2010-6-30 20:24 编辑 ]