📄 源程序.c
字号:
if(p==NULL) /*如果指针为空*/
printf("\nlist no %s \n",i); /*显示没有该学生*/
else /*显示找到的记录信息*/
{
printf("\n\n*****************************havefound***************************\n");
printf("| Name | Units | Tel |\n");
printf("|---------------|--------------------|-----------|\n");
printf("|%-15s|%-20s|%-11s|\n",p->name,p->unit,p->tel);
printf("********************************end*********************************\n");
}
}
/*保存数据到文件*/
void save(ADDRESS *h)
{
FILE *fp; /*定义指向文件的指针*/
ADDRESS *p; /* 定义移动指针*/
char outfile[10]; /*保存输出文件名*/
printf("Enter outfile name,for example x:\\x\\x.txt:\n"); /*提示文件名格式信息*/
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/
{
printf("Can not open file\n");
exit(1);
}
printf("\nSaving file ^_^\n"); /*打开文件,提示正在保存*/
p=h; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,sizeof(ADDRESS),1,fp);/*写入一条记录*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("-----Save success! R_R----\n"); /*显示保存成功*/
}
/* 从文件读数据*/
ADDRESS *load()
{
ADDRESS *p,*q,*h=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[10]; /*保存文件名*/
printf("Enter infile name,for example x:\\x\\x.txt:\n"); scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
{
printf("can not open file\n"); /*如不能打开,则结束程序*/
exit(1);
}
printf("\n -----Loading file!-----\n");
p=(ADDRESS *)malloc(sizeof(ADDRESS)); /*申请空间*/
if(!p)
{
printf("Out of memory!\n"); /*如没有申请到,则内存溢出*/
return h; /*返回空头指针*/
}
h=p; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(1!=fread(p,sizeof(ADDRESS),1,fp))
break; /*如果没读到数据,跳出循环*/
p->next=(ADDRESS *)malloc(sizeof(ADDRESS)); /*为下一个结点申请空间*/
if(!p->next)
{
printf("Out of memory!\n"); /*如没有申请到,则内存溢出*/
return h;
}
q=p; /*保存当前结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("---You have success read data from file!!!---\n");
return h; /*返回头指针*/
}
ADDRESS *insert(ADDRESS *head) /*插入记录*/
{
ADDRESS *p,*q,*info; /*p1指向插入位置,p2是前驱指针,info是新插入记录*/
char x[18]; /*保存插入点位置的名字*/
printf("Please enter location before the Name\n");
scanf("%s",x); /*输入插入点姓名*/
printf("\nPlease new record\n");
info = (ADDRESS *)malloc(sizeof(ADDRESS)); /*申请空间*/
if(!info)
{
printf("Nout of memory"); /*如果没有申请到,内存溢出*/
return NULL;
}
inputs("Enter Name:",info->name,18); /*输入姓名*/
inputs("Enter Unit:",info->unit,20); /*输入单位*/
inputs("Enter TEL :",info->tel,11); /*输入电话*/
info->next=NULL; /*设后继指针为空*/
p=head; /*将指针赋值给p*/
q=head; /*将指针赋值给q*/
while(strcmp(p->name,x)&&p!=NULL) /*查找插入位置*/
{
q=p; /*保存指针p,作为下一个p1的前驱*/
p=p->next; /*将指针p后移*/
}
if(p==NULL) /*如果p指针为空,说明没有指定结点*/
if(p==head) /*同时p等于head,说明链表为空*/
head=info; /*新记录则为头结点*/
else
q->next=info; /*p为空,但p不等于h,将新结点插在表尾*/
else
if(p==head) /*p不为空,则找到了指定结点*/
{
info->next=p; /*如果p等于head,则新结点插入在第一个结点之前*/
head=info;
} /*新结点为新的头结点*/
else
{
info->next=p; /*不是头结点,则是中间某个位置,新结点的后继为p*/
q->next=info;
} /*新结点作为q的后继结点*/
printf("\n-----Have inserted %x name-----\n",info->name);
printf("---Please save!\n");
return(head);
}
/*文件拷贝*/
void copy()
{
char outfile[10],infile[10];
FILE *sfp,*tfp; /*源和目标文件指针*/
ADDRESS *p=NULL; /*移动指针*/
clrscr(); /*清屏*/
printf("Enter infile name,for example x:\\x\\x.txt:\n");
scanf("%s",infile); /*输入源文件名*/
if((sfp=fopen(infile,"rb"))==NULL) /*二进制读方式打开源文件*/
{
printf("Can not open input file\n");
exit(0);
}
printf("Enter outfile name,for example x:\\x\\x.txt:\n"); /*提示输入目标文件名*/
scanf("%s",outfile); /*输入目标文件名*/
if((tfp=fopen(outfile,"wb"))==NULL) /*二进制写方式打开目标文件*/
{
printf("can not open output file \n");
exit(0);
}
while(!feof(sfp)) /*读文件直到文件尾*/
{
if(1!=fread(p,sizeof(ADDRESS),1,sfp))
break; /*块读*/
fwrite(p,sizeof(ADDRESS),1,tfp); /*块写*/
}
fclose(sfp); /*关闭源文件*/
fclose(tfp); /*关闭目标文件*/
printf("You have success copy file^_^\n"); /*显示成功拷贝*/
}
/*按号码查找记录*/
void search2 (ADDRESS *h)
{
ADDRESS *p; /* 移动指针*/
char t[11]; /*存放号码的字符数组*/
clrscr(); /*清屏幕*/
printf("please enter Telephone for search\n");
scanf("%s",t); /*输入号码*/
p=h; /*将头指针赋给p*/
while(strcmp(p->tel,t)&&p!=NULL) /*当记录的号码不是要找的,或指针不为空时*/
p=p->next; /*移动指针,指向下一结点*/
if(p==NULL) /*如果指针为空*/
printf("\nList not have %s \n",t); /*显示没有该号码*/
else /*显示找到的记录信息*/
{
printf("\n\n*****************************havefound***************************\n");
printf("| Name | Units | Tel |\n");
printf("|---------------|--------------------|-----------|\n");
printf("|%-15s|%-20s|%-11s|\n",p->name,p->unit,p->tel);
printf("********************************end*********************************\n");
}
}
/*排序*/
ADDRESS *sort(ADDRESS *h)
{
ADDRESS *p,*q,*t,*h1; /*定义临时指针*/
h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/
h->next=NULL; /*第一个结点为新表的头结点*/
while(h1!=NULL) /*当原表不为空时,进行排序*/
{
t=h1; /*取原表的头结点*/
h1=h1->next; /*原表头结点指针后移*/
p=h; /*设定移动指针p,从头指针开始*/
q=h; /*设定移动指针q做为p的前驱,初值为头指针*/
while(strcmp(t->name,p->name)>0&&p!=NULL) /*作姓名比较*/
{
q=p; /*当排序点字母大,应往后插,所以新表指针后移*/
p=p->next;
}
if(p==q) /*p==q,说明待排序字母小,应排在首位*/
{
t->next=p; /*待排序点的后继为p*/
h=t; /*新头结点为待排序点*/
}
else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/
{
t->next=p; /*t的后继是p*/
q->next=t; /*q的后继是t*/
}
}
printf("Index sucess! ^.^\n"); /*按姓名排序成功*/
return h; /*返回头指针*/
}
/*设置动态密码*/
inputcode()
{char ch;
FILE *fp;
if((fp=fopen("password.txt","w"))==NULL)
{printf("cannot open file\n");
exit(0);}
printf("please set your 6 bit password,end with '#':");
ch=getchar();
while(ch!='#')
{fputc(ch,fp);putchar(ch);ch=getchar();}
fclose(fp);
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -