以前只写了简单的链表操作和文件读写,
今天开始写管理系统,才发现有很多细节的地方需要学习。
比如头结点的问题。一个头结点会影响整个程序的输入输出添加删除,必须再三注意。
今天只写了简单的框架,然后简单的几个功能,完善得自我感觉还行
贴下代码,记录一下
/*(1)任务描述.
查看自己的手机,设计一个手机通讯录管理程序.通讯录中可存储若干个人的联系号码.
(2)功能要求
1.根据自己的手机情况,设计通讯录文件结构.
2.完成通讯录信息的添加,且按联系人姓名字母顺序排列通讯录信息.当发生同名时,提示是否替换,如果是,则直接覆盖以前信息,如果不是,返回添加状态等待修改.
3.提供通讯录按姓名查询功能.
4.提供按群组查询联系电话的功能.
5.提供逐个翻看通讯录查询电话功能.
6.提供逐个\全部删除电话号码功能.
7.当通讯录存在,每次进入程序,模拟手机开机,读出已有的通讯录信息.
(3)设计提示\
由于计算机屏幕显示行数有限,显示整个通讯录时,提供翻页功能,每页显示10个联系号码.*/
#include <stdio.h>
#include<string.h>
#include<windows.h>
typedef struct people
{
char name[20];
char tel[20];
char qunzu[20];
struct people *next;
}peo;
struct peo * creat()
{
int sel, flag=1;
int n=0;
peo *head=NULL,*p=NULL;
head=(peo*)malloc(sizeof(peo));
head->next=NULL;
while(flag==1)
{
n++;
p=(peo*)malloc(sizeof(peo));
printf("请输入联系人姓名\n");
fflush(stdin);
gets(p->name);
printf("请输入联系人电话\n");
fflush(stdin);
gets(p->tel);
printf("请选择联系人分组:1-家人,2-同学,3-同事,4-其他\n");
fflush(stdin);
Flag:scanf("%d",&sel);
switch(sel)
{
case 1:strcpy(p->qunzu,"家人");break;
case 2:strcpy(p->qunzu,"同学");break;
case 3:strcpy(p->qunzu,"同事");break;
case 4:strcpy(p->qunzu,"其他");break;
default:printf("选择错误,请重新选择\n");goto Flag;
}
p->next=head->next;
head->next=p;
printf("是否继续加入联系人:1-是,0-否\n");
fflush(stdin);
scanf("%d",&flag);
if(flag==0)
{
printf("已成功添加%d位联系人,任意键进去通讯录主菜单\n",n);
scanf("%d",&n);
system("cls");
break;
}
}
return head;
}
peo zengjia(peo *head)
{
peo *p=NULL;
int sel,flag;
int n=0;
while(flag)
{
n++;
p=(peo*)malloc(sizeof(peo));
p->next=NULL;
printf("请输入联系人姓名\n");
fflush(stdin);
gets(p->name);
printf("请输入联系人电话\n");
fflush(stdin);
gets(p->tel);
printf("请选择联系人分组:1-家人,2-同学,3-同事,4-其他\n");
fflush(stdin);
Flag:scanf("%d",&sel);
switch(sel)
{
case 1:strcpy(p->qunzu,"家人");break;
case 2:strcpy(p->qunzu,"同学");break;
case 3:strcpy(p->qunzu,"同事");break;
case 4:strcpy(p->qunzu,"其他");break;
default:printf("选择错误,请重新选择\n");goto Flag;
}
p->next=head->next;
head->next=p;
printf("是否继续加入联系人:1-是,0-否\n");
fflush(stdin);
scanf("%d",&flag);
if(flag==0)
{
printf("已成功添加%d位联系人\n\n任意键返回上一层\n",n);
scanf("%d",&n);
system("cls");
}
}
}
peo * shanchu(peo * head)
{
char name[20];
peo *p1,*p2;
p1=head;
printf("请输入联系人姓名\n");
fflush(stdin);
gets(name);
while(strcmp(name,p1->name)!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(name,p1->name)==0)
{
if(p1==head)head=p1->next;
else p2->next=p1->next;
printf("删除成功!\n");
}
else printf("未找到该联系人\n");
return head;
}
void save(peo *head)
{
FILE *fp;
peo *p;
fp=fopen("tongxl.dat","w");
p=head->next;
while (p!=NULL)
{
fwrite((void*)p,sizeof(peo),1,fp);
p=p->next;
}
fclose(fp);
}
peo * load()
{
FILE *fp;
peo *p,*head;
fp=fopen("tongxl.dat","r");
head=(peo*)malloc(sizeof(peo));
head->next=NULL;
while(!feof(fp))
{
p=(peo*)malloc(sizeof(peo));
fread(p,sizeof(peo),1,fp);
p->next=head->next;
head->next=p;
}
return head->next;
fclose(fp);
}
void chaxun()
{
}
void xiugai()
{}
void xianshi(peo *head)
{
peo *p;
int flag=1;
if(head!=NULL)
{
p=head->next;
printf("姓名----------电话----------组群\n");
while(p!=NULL)
{
printf("%-14s",p->name);
printf("%-14s",p->tel);
printf("%-14s",p->qunzu);
printf("\n");
p=p->next;
}
}
else
printf("通讯录为空\n");
printf("任意键返回上一层\n");
fflush(stdin);
scanf("%d",&flag);
if(flag)
system("cls");
}
void main()
{
char ch;
FILE *fp=NULL;
peo *head;
head=NULL;
if((fp=fopen("tongxl.dat","r"))==NULL)
{
printf("\n欢迎首次使用本通讯录\n");
head=creat();
save(head);
}
else
head=load();
do{
printf("\n\t\t|-------------欢迎您使用通讯录管理系统-----------|");
printf("\n\t\t| 1-添加联系人 2-显示联系人 |");
printf("\n\t\t| 3-删除联系人 4-查询联系人 |");
printf("\n\t\t| 5-修改联系人 0-保存退出 |");
printf("\n\t\t|------------------------------------------------|");
printf("\n\t\t请选择您所需要的功能:");
fflush(stdin);
ch=getchar();
switch(ch)
{
case '1':system("cls"); printf("====添加联系人====\n");
zengjia(head);save(head);break;
case '2': system("cls");printf("====显示联系人====\n");
xianshi(head);break;
case '3':system("cls"); printf("====删除联系人====\n");
shanchu(head);save(head);break;
case '4': system("cls");printf("====查询联系人====\n");
chaxun();break;
case '5':system("cls");printf("====修改联系人====\n");
xiugai();break;
default:printf("输入错误\n");break;
}
}while(ch!='0');
}