这个很久以前就完成了,一直没贴出来。
这个同学录实际上就是通讯录,使用链表实现,也算是对链表的一种运用吧。
具体功能看Menu函数。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Student{
char name[20];
char tel[20];
char qq[20];
char address[20];
struct Student *next;
}INFO;
INFO *head;
void Initiate();//初始化
void Menu ();//主菜单
void Add ();//添加联系人
void List ();//显示通讯录
void Alter();//修改
void Find ();//查找联系人
void Find_Name ();//按姓名查找
void Find_Tel ();//按学号查找
void Delate ();//删除联系人
void Delate_Name ();
void Delate_Tel ();
/* void Delate_Name ();//按姓名删除
void Delate_Tel ();//按电话删除 */
//初始化
void Initiate ()
{
if((head=(INFO*)malloc(sizeof(INFO)))==NULL) exit(1);
head->next=NULL;
}
//主菜单
void Menu()
{
printf ("\n");
printf ("\n");
printf ("\n");
printf("**************欢迎使用通讯录系统**************");
printf("\n");
printf("\n");
printf("*********** 1.添加好友 ***********\n");
printf("*********** 2.查询好友 ***********\n");
printf("*********** 3.修改好友 ***********\n");
printf("*********** 4.删除好友 ***********\n");
printf("*********** 5.显示所有好友 ***********\n");
printf("*********** 0.退通讯录 ***********\n\n\n");
}
//添加通讯录好友
void Add()
{
INFO *p,*q;
if ((q=(INFO *)malloc(sizeof(INFO)))==NULL) exit(1);
printf("请输入要添加信息!\n");
printf("姓名:\n"); //添加信息
scanf("%s",&q->name);
printf("电话号码:\n");
scanf("%s",q->tel);
printf("QQ:\n");
scanf("%s",q->qq);
printf("地址:\n");
scanf("%s",q->address);
//保存聊天记录
FILE *file_in = fopen("同学录.txt", "w");
if (file_in == NULL)
{
perror("fopen TXT");
return ;
}
fprintf (file_in, "姓名:\t%s\t", q->name);
fprintf (file_in, "号码:\t%s\t", q->tel);
fprintf (file_in, "QQ:\t%s\t", q->qq);
fprintf (file_in, "地址:\t%s\t", q->address);
fclose (file_in);
for (p = head;p->next!=NULL;p=p->next);
p->next=q;
q->next=NULL;
printf("信息已添加完成!\n");
}
//查找
void Find ()
{
int i;
printf ("\n\n\n\n\n\n**************************************\n");
printf ("\t\t1按姓名查找\n");
printf ("\t\t2按电话号码查找\n");
printf ("**************************************\n");
printf ("请选择:(按其他数字键返回!)");
scanf ("%d",&i);
switch (i)
{
case 1:
{
Find_Name ();
break;
}
case 2:
{
Find_Tel ();
break;
}
}
}
void Find_Name ()
{
INFO *p;
char name[20];
if (head->next==NULL) // 如果是一个空链表;
{
printf("通讯录空!\n");
return;
}
printf("请输入要查找姓名:\n");
scanf("%s",&name);
for (p=head->next;p!=NULL;p=p->next)//循环遍历链表中的节点,找出此时最小的节点
{
if(strcmp(p->name,name)==0)
{
printf("姓名\t电话\tQQ\t地址\n");
printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
}
else if(p->next==NULL)
{
printf("没有该好友信息!\n");
}
}
}
void Find_Tel ()
{
INFO *p;
char tel[20];
if (head->next==NULL)// 如果是一个空链表;
{
printf("通讯录空!\n");
return;
}
printf("请输入要查找电话号码:\n");
scanf("%s",&tel);
for (p=head->next;p!=NULL;p=p->next)//循环遍历链表中的节点,找出此时最小的节点
{
if(strcmp(p->tel,tel)==0)
{
printf("姓名\t电话\tQQ\t地址\n");
printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
}
else if(p->next==NULL)
{
printf("没有该好友信息!\n");
}
}
}
//修改通讯录信息
void Alter()
{
char name [50]; //先查找
INFO *p,*p1;
if(head->next==NULL)
{
printf("通讯录空!\n");
return;
}
printf("请输入要修改姓名:\n");
scanf("%s",name);
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{
break;
}
else if(p->next==NULL)
{
printf("信息!\n");
return;
}
}
p1=(INFO *)malloc(sizeof(INFO));
printf("new姓名:\n"); //添加信息
scanf("%s",p1->name);
strcpy(p->name,p1->name);
printf("new电话号码:\n");
scanf("%s",p1->tel);
strcpy(p->tel,p1->tel);
printf("newQQ:\n");
scanf("%s",p1->qq);
strcpy(p->qq,p1->qq);
printf("new地址:\n");
scanf("%s",p1->address);
strcpy(p->address,p1->address);
printf("信息已修改\n");
//显示修改信息
printf("姓名\t电话\tQQ\t地址\n");
printf("%s\t%s\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
free(p1);
}
//删除通讯录信息
void Delate()
{
int i;
printf ("\n\n\n\n\n\n**************************************\n");
printf ("\t\t1按姓名删除\n");
printf ("\t\t2按电话号码删除\n");
printf ("**************************************\n");
printf ("请选择:(按其他数字键返回!)");
scanf ("%d",&i);
switch (i)
{
case 1:
{
Delate_Name ();
break;
}
case 2:
{
Delate_Tel ();
break;
}
}
}
void Delate_Name()
{
char name[20]; //先查找 删除
INFO *p = head->next, *p1 =head->next,*p2;
if (head->next == NULL)
{
printf("通讯录空\n");
return;
}
printf("请输入要删除姓名:\n");
scanf(" %s",name);
while ((strcmp(p->name,name)!=0 )&& p->next != NULL)
{
p1=p;
p =p->next;
}
if (strcmp(name, p->name)==0) //输删除信息
{
if (p == head->next&&p->next!=NULL)
{
head->next = p->next;
}
else if(p==head->next&&p->next==NULL)
{
head->next=p->next;
printf("好友已全部删除!\n");
return;
}
else
p1->next = p->next;
}
else
{
printf("不存在该好友!\n");
return;
}
printf("信息已删除!\n");
printf("您还有以下好友!\n");
printf("姓名\t电话号码\tQQ\t地址\n");
for(p2=head->next;p2!=NULL;p2=p2->next)
printf("%s\t%s\t%s\t%s\n",p2->name,p2->tel,p2->qq,p2->address);
}
void Delate_Tel()
{
char tel[20]; //先查找 删除
INFO *p = head->next, *p1 =head->next,*p2;
if (head->next == NULL)
{
printf("通讯录空\n");
return;
}
printf("请输入要删除电话号码:\n");
scanf(" %s",tel);
while ((strcmp(p->tel,tel)!=0 )&& p->next != NULL)
{
p1=p;
p =p->next;
}
if (strcmp(tel, p->tel)==0) //输删除信息
{
if (p == head->next&&p->next!=NULL)
{
head->next = p->next;
}
else if(p==head->next&&p->next==NULL)
{
head->next=p->next;
printf("好友已全部删除!\n");
return;
}
else
p1->next = p->next;
}
else
{
printf("不存在该好友!\n");
return;
}
printf("信息已删除!\n");
printf("您还有以下好友!\n");
printf("姓名\t电话号码\tQQ\t地址\n");
for(p2=head->next;p2!=NULL;p2=p2->next)
printf("%s\t%s\t%s\t%s\n",p2->name,p2->tel,p2->qq,p2->address);
}
//显示所记录
void List()
{
INFO *p;
if(head->next==NULL)
{
printf("通讯录记录!\n");
return;
}
printf("姓名\t电话号码\tQQ\t地址\n");
for(p=head->next;p!=NULL;p=p->next)
printf("%s\t%s\t\t%s\t%s\n",p->name,p->tel,p->qq,p->address);
}
int main()
{
int choice;
char yes_no;
Initiate();
do
{
Menu();
printf("请输入指令0-5:\n");
scanf("%d",&choice);
printf("\n");
switch(choice)
{
case 1:Add();
break;
case 2:Find();
break;
case 3:Alter();
break;
case 4:Delate();
break;
case 5:List();
break;
case 0:
printf("************谢您使用************\n");
exit(0); //正常退出
break;
default:
printf("输入误!请重新输入\n");
break;
}
printf("是否继续 Y or N? \n");
do
{
scanf("%c",&yes_no);
}
while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}
while(yes_no=='Y'||yes_no=='y');
}