70,020
社区成员




/*班级通讯录管理系统
以本班同学的具体数据为背景,设计实现一个本班同学通讯录管理系统,实现以下功能:
1) 通讯录编辑(添加、删除);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。
希望前辈们多多指导,多多提携,让小子在编程的这条路上走的更远,不胜感激!
如果前辈能提供一些您的小程序供我们学习,那最好不过,呵呵...
*/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef struct { //定义结构体
char name[20];
char address[20];
char tel[12];
char youbian[8];
char Email[32];
}Node;
typedef struct { //静态链表
Node *elem;
int length;
int listsize;
}Sqlist;
void InitSqlist(Sqlist *L){ //初始化
L->elem=(Node *)malloc(MaxSize*sizeof(Node));
if(!L->elem) exit(0);
L->length=0;
L->listsize=MaxSize;
}
void InsertElem(Sqlist *L){ //添加成员
Node *base;
int n;
n=L->length;
if(L->length>=L->listsize) {
base=(Node *)realloc(L->elem,(L->listsize+10)*sizeof(Node));
L->elem=base;
(L->listsize)+=10;
}
printf("please input %dth data: ",n+1);
printf("\n name : ");
scanf("%s",L->elem[n].name);
printf("\n address: ");
scanf("%s",L->elem[n].address);
printf("\n tel : ");
scanf("%s",L->elem[n].tel);
printf("\n youbian: ");
scanf("%s",L->elem[n].youbian);
printf("\n Email : ");
scanf("%s",L->elem[n].Email);
/*
printf("please input %dth data: ",n+1);
printf("\n name : ");
gets(L->elem[n].name); //如果只写一行 直接就跳过去了,为什么?
gets(L->elem[n].name);
printf("\n address: ");
gets(L->elem[n].address);
printf("\n tel : ");
gets(L->elem[n].tel);
printf("\n youbian: ");
gets(L->elem[n].youbian);
printf("\n Email : ");
gets(L->elem[n].Email);
*/
printf("\n");
L->length++;
}
void print(Sqlist *L,int n) //输出单个成员信息
{
printf("第%d个联系人资料:\n名字:",n+1);
puts(L->elem[n].name);
printf("\n地址:");
puts(L->elem[n].address);
printf("\n电话:");
puts(L->elem[n].tel);
printf("\n邮编:");
puts(L->elem[n].youbian);
printf("\n邮箱:");
puts(L->elem[n].Email);
printf("\n");
}
int xunzhao(Sqlist *L) //根据姓名查找成员的排序号
{
char q[20];
int i,n;
printf("输入姓名:");
scanf("%s",q);
for(i=0;i<L->length;i++)
{
n=0;
while(L->elem[i].name[n]==q[n])
{
n++;
if(n==strlen(q))
{
return i;
}
}
}
}
void output(Sqlist *L) //输出所有成员信息
{
int n=0;
while(n<L->length)
{
print(L,n);
n++;
printf("\n");
}
}
void DelElem(Sqlist *L)//根据成员姓名删除一个成员
{
Node *d,*q;
int i;
i=xunzhao(L);
printf("\n%d \n\n",i+1);
d=&(L->elem[i]);
q=L->elem+L->length-1 ;
for(++d;d<=q;++d)
{
strcpy((d-1)->name,d->name);
strcpy((d-1)->address,d->address);
strcpy((d-1)->Email,d->Email);
strcpy((d-1)->youbian,d->youbian);
strcpy((d-1)->tel,d->tel);
}
L->length--;
printf("\nOK \n\n");
}
void chazhao(Sqlist *L) //查找成员
{
int i;
i=xunzhao(L);
print(L,i);
}
void swap(char a[],char b[]) //交换 两个字符串
{
char q[30];
strcpy(&q[0],&a[0]);
strcpy(&a[0],&b[0]);
strcpy(&b[0],&q[0]);
}
void paixu(Sqlist *L) //对所有成员按姓名进行排序
{
int i,j,n;
for(i=0;i<L->length;i++)
for(j=i+1;j<L->length;j++)
{
if(strcmp(L->elem[i].name,L->elem[j].name)>0)
{
swap(L->elem[i].name,L->elem[j].name);
swap(L->elem[i].address,L->elem[j].address);
swap(L->elem[i].Email,L->elem[j].Email);
swap(L->elem[i].youbian,L->elem[j].youbian);
swap(L->elem[i].tel,L->elem[j].tel);
}
}
printf("\nOK \n\n");
}
void save(Sqlist *L) //保存至文件
{
FILE *fp;
int i;
if((fp=fopen("F:\\output.txt","w"))==NULL)
{
printf("can not open file\n");
return;
}
for(i=0;i<L->length;i++)
{
if(fwrite(&(L->elem[i]),sizeof(Node),1,fp)!=1)
printf("file write error,\n");
}
printf("\nok\n\n");
fclose(fp);
}
void writein(Sqlist *L) //由文件写入程序
{
FILE *fp;
int i,o=1;
if((fp=fopen("F:\\output.txt","r"))==NULL)
{
printf("can not open file\n");
return;
}
for(i=0;i<MaxSize;i++)
{
if(feof(fp)==1) break;
if(fread(&(L->elem[i]),sizeof(Node),1,fp)!=1)
{
o=0;
printf("file read error,\n");
break;
}
}
fclose(fp);
if(o!=0)
{
printf("\nok\n\n");
output(L);
}
}
main()
{
int j,x;
Sqlist L;
InitSqlist(&L);
while(1)
{
x=508;
do
{
if(x!=508) printf("\nInput wrong,please trying again.\n\n");
printf("请输入:\n1:插入\n2:删除\n3:查找\n4:排序\n5:输出\n6:将通讯录写入文件\n7:将文件写入通讯录\n8:退出\n");
scanf("%d",&x);
}while(x<1 || x>8);
switch(x)
{
case 1: InsertElem(&L); break;
case 2: DelElem(&L); break;
case 3: chazhao(&L); break;
case 4: paixu(&L); break;
case 5: output(&L); break;
case 6: save(&L); break;
case 7: writein(&L); break;
case 8: exit(0);
}
}
}
void InitSqlist(Sqlist *L)
{ //初始化
L->elem=(Node *)malloc(MaxSize*sizeof(Node));
if(!L->elem) exit(0);
memset(L->elem, 0, sizeof(Node)); // 增加这行,原因和你下面的两个初始化一样
L->length=0; // 楼主知道把L->length初始化为0
L->listsize=MaxSize;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxSize 50
typedef struct { //定义结构体
char name[20];
char address[20];
char tel[12];
char youbian[8];
char Email[32];
}Node;
typedef struct { //静态链表
Node *elem;
int length;
int listsize;
}Sqlist;
void InitSqlist(Sqlist *L){ //初始化
L->elem = (Node *)malloc(MaxSize*sizeof(Node));
if(!L->elem) exit(0);
L->length = 0;
L->listsize = MaxSize;
}
void InsertElem(Sqlist *L){ //添加成员
Node *base;
int n = L->length;
if(L->length >= L->listsize) {
base = (Node *)realloc(L->elem, (L->listsize + 10) * sizeof(Node));
L->elem = base;
(L->listsize) += 10;
}
printf("please input %dth data: ",n+1);
printf("\n name : ");
scanf("%s",L->elem[n].name);
printf("\n address: ");
scanf("%s",L->elem[n].address);
printf("\n tel : ");
scanf("%s",L->elem[n].tel);
printf("\n youbian: ");
scanf("%s",L->elem[n].youbian);
printf("\n Email : ");
scanf("%s",L->elem[n].Email);
printf("\n");
L->length++;
}
void print(Sqlist *L,int n) //输出单个成员信息
{
printf("%d) 姓名: %s",n+1, L->elem[n].name);
printf("\t地址:%s", L->elem[n].address);
printf("\t电话:%s", L->elem[n].tel);
printf("\t邮编:%s", L->elem[n].youbian);
printf("\t邮箱:%s\n", L->elem[n].Email);
return;
}
int xunzhao(Sqlist *L) //根据姓名查找成员的排序号
{
char q[20];
int i,n;
printf("输入姓名:");
scanf("%s",q);
for(i=0;i<L->length;i++)
{
n=0;
while(L->elem[i].name[n]==q[n])
{
n++;
if(n==(int)strlen(q))
{
return i;
}
}
}
return -1;
}
void output(Sqlist *L) //输出所有成员信息
{
int n=0;
while(n<L->length)
{
print(L,n);
n++;
printf("\n");
}
}
void DelElem(Sqlist *L)//根据成员姓名删除一个成员
{
Node *d,*q;
int i;
i=xunzhao(L);
printf("\n%d \n\n",i+1);
d=&(L->elem[i]);
q=L->elem+L->length-1 ;
for(++d;d<=q;++d)
{
strcpy((d-1)->name,d->name);
strcpy((d-1)->address,d->address);
strcpy((d-1)->Email,d->Email);
strcpy((d-1)->youbian,d->youbian);
strcpy((d-1)->tel,d->tel);
}
L->length--;
printf("\nOK \n\n");
}
void chazhao(Sqlist *L) //查找成员
{
int i;
i=xunzhao(L);
print(L,i);
}
void swap(char a[],char b[]) //交换 两个字符串
{
char q[30];
strcpy(&q[0],&a[0]);
strcpy(&a[0],&b[0]);
strcpy(&b[0],&q[0]);
}
void paixu(Sqlist *L) //对所有成员按姓名进行排序
{
int i,j;
for(i=0;i<L->length;i++)
for(j=i+1;j<L->length;j++)
{
if(strcmp(L->elem[i].name,L->elem[j].name)>0)
{
swap(L->elem[i].name,L->elem[j].name);
swap(L->elem[i].address,L->elem[j].address);
swap(L->elem[i].Email,L->elem[j].Email);
swap(L->elem[i].youbian,L->elem[j].youbian);
swap(L->elem[i].tel,L->elem[j].tel);
}
}
printf("\nOK \n\n");
}
void save(Sqlist *L){ //保存至文件
FILE *fp;
int i;
if((fp = fopen("d:\\output.txt","wb")) == NULL){
printf("can not open file\n");
return;
}
for(i=0; i<L->length; i++)
{
if(fwrite(&(L->elem[i]),sizeof(Node),1,fp)!=1)
printf("file write error,\n");
}
printf("\nok\n\n");
fclose(fp);
}
void writein(Sqlist *L) //由文件写入程序
{
FILE *fp;
int i;
long len;
Node *base;
if((fp=fopen("d:\\output.txt","rb"))==NULL)
{
printf("can not open file\n");
return;
}
fseek(fp, 0, SEEK_END);
len = ftell(fp) / (int)sizeof(Node);
fseek(fp, 0,SEEK_SET);
L->length = 0;
if(L->length >= L->listsize) {
base = (Node *)realloc(L->elem, (L->listsize + 10) * sizeof(Node));
L->elem = base;
(L->listsize) += 10;
}
for(i=0; i<len; i++)
{
if(fread(&(L->elem[i]),sizeof(Node),1,fp)!=1)
{
printf("file read error,\n");
exit(0);
}
L->length++;
}
fclose(fp);
output(L);
}
int main()
{
int x;
Sqlist L;
InitSqlist(&L);
while(1)
{
do
{
printf("请输入:\n1:插入\n2:删除\n3:查找\n4:排序\n5:输出\n6:将通讯录写入文件\n7:将文件写入通讯录\n8:退出\n");
scanf("%d",&x);
}while(x<1 || x>8);
switch(x)
{
case 1: InsertElem(&L); break;
case 2: DelElem(&L); break;
case 3: chazhao(&L); break;
case 4: paixu(&L); break;
case 5: output(&L); break;
case 6: save(&L); break;
case 7: writein(&L); break;
case 8: exit(0);
}
}
return 0;
}