->数据结构的引用-用链表实现电话查询功能
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Phone_Number.h"
//用户输入系统
int get_num(){
int n;
//制作用户登录界面
printf("\t\t\t ***************************\n");
printf("\t\t\t ************\n");
printf("\t\t\t 欢迎使用数理学院电话查询系统,请根据下列提示进行选择\n");
printf("\t\t\t <-- 1 创建 -->\n");
printf("\t\t\t <-- 2 查询 -->\n");
printf("\t\t\t <-- 3 插入 -->\n");
printf("\t\t\t <-- 4 修改 -->\n");
printf("\t\t\t <-- 5 删除 -->\n");
printf("\t\t\t <-- 0 退出 -->\n");
printf("\t\t\t <-- 亲爱的用户,您的选择是 -->\n");
for(; ; ){
scanf("%d",&n); //获得用户输入
if(n<0 || n>6){ //异常处理
printf("您的输入有错,请您重新输入\n");
return 0;
}
if(n>=0&&n<6)
break; //退出循环
}
return n; //返回用户请求
}
int main(){
Linklist l;
InitList(l);
//用户查询系统
for(; ;){ //无线循环,接收用户输入的信息(除非用户输入0)
switch(get_num()){ //获取用户输入
case 1:
system("cls");
printf("\t\t\t创建\n\n");
printf("请按照下列格式输入\n姓名 固定电话 移动电话 邮件\n");
printf("\n");
CreatList(l);
//PrintList(l);
break;
case 2:
system("cls");
int n;
printf("如果查看通讯录,请按1,如果查找联系人,请按2\n");
scanf("%d",&n);
if(n ==1){
readFile(l);
}
if(n ==2){
Find_Name(l);
}
if(n>2)
printf("查询失败");
break;
case 3:
system("cls");
printf("\t\t\t插入\n\n");
ListInsert(l);
//PrintList(l);
//readFile(l);
break;
case 4:
system("cls");
printf("\t\t\t修改\n\n");
ChangeList(l);
break;
case 5:
system("cls");
printf("\t\t\t删除\n\n");
ListDelete_LName(l);
break;
case 0:
system("cls");
printf("\t\t\t 感谢您使用数理学院电话查询系统,欢迎下次光临\n\n");
system("pause");
return 0;
}
};
return 0;
}
4.2功能函数
//定义链表节点,并封装相应操作
//用户的节点由数据域和指针域构成
typedef struct{
char name[15];
char phoneNumber[15];
char mobileNumber[15];
char mail[20];
}DataType;
//两边存储结构
typedef struct node{
DataType data;
struct node *next;
}Lnode,*Linklist;
//初始化链表(含头结点)
void InitList(Linklist &L){
L = (Lnode*)malloc(sizeof(Lnode));
L->next = NULL;
}
//保存用户数据
void SaveFile(Linklist &L){
FILE *fp;
Lnode *p;
p = L;
if((fp = fopen("Phone_num.txt","wt")) == NULL){
printf("文件结束");
exit(0); //退出
}
if(p->next == NULL){
printf("保存失败,请确保您的通讯录不为空");
}
else
{
p = p->next;
while(p != NULL){ //遍历链表,读入数据
//数据读入文件
fprintf(fp,"%s %s\t %s %s",p->data.name,p->data.phoneNumber,p->data.mobileNumber,p->data.mail);
fprintf(fp,"\n");
p = p->next;
}
fclose(fp);
printf("您的联系人已保存\n");
}
}
//读取通信录全部信息
void readFile(Linklist &L) //读取文件信息
{
FILE *fp;
fp = fopen("Phone_num.txt","r");
char ch;
while((ch = fgetc(fp))!=EOF){
putchar(ch);
}
fclose(fp);
}
//按姓名查找联系人
void Find_Name(Linklist &L) //按姓名查询
{
Linklist q,p;
q=L->next;
printf("输入要查询的姓名:\n");
p=(Lnode*)malloc(sizeof(Lnode));
scanf("%s",&p->data.name);
while(q!=NULL&& strcmp(q->data.name,p->data.name)!=0)
{
q=q->next;
}
if(q==NULL)
{
printf("对不起,查无此人!\n");
}
else
{
printf("已经找到此联系人!\n");
printf("-------------------------------------------------------------------------------\n");
printf(" 姓名 固定电话 移动电话 邮箱 \n");
printf("-------------------------------------------------------------------------------\n");
printf("%s %s %s %s",q->data.name,q->data.phoneNumber,q->data.mobileNumber,q->data.mail);
}
}
//在单链线性表L的第i个元素之前插入元素
bool ListInsert(Linklist &L)
{
Linklist s,p=L;
int j = 1,i;
printf("输入要插入的位置:");
scanf("%d",&i);
while (p&&j < i)
{ // 寻找第i个结点
p = p->next;
++j;
}
if (!p || j > i) {
printf("----插入失败-----\n");
return false;
} // i小于1或者大于表长
s = (Linklist)malloc(sizeof(Lnode)); // 生成新结点
printf("插入的联系人信息为:\n");
printf("-------------------------------------------------------------------------------\n");
printf(" 姓名 固定电话 移动电话 邮箱 \n");
printf("-------------------------------------------------------------------------------\n");
scanf("%s%s%s%s",&p->data.name,&p->data.phoneNumber,&p->data.mobileNumber,&p->data.mail);
s->next = p->next; // 插入L中
p->next = s;
SaveFile(L);
printf("插入成功\n");
return true;
}
int Fund_LName(Linklist &L) //寻找该姓名的位置
{
Linklist s,p=L->next;
int i=0;
s=(Lnode*)malloc(sizeof(Lnode));
printf("请输入您要寻找用户的名字\n");
scanf("%s",s->data.name);
while(p!=NULL&&strcmp(p->data.name,s->data.name)!=0)
{
p=p->next;
++i;
}
return i+1;
}
bool ListDelete_LName(Linklist &L) //删除姓名为“XXX”的学生记录
{
Linklist p=L,q;
printf("输入要删除的学生的姓名:\n");
int j = 0,i=Fund_LName(L);
while (p->next && j < i-1)
{ // 寻找第i个结点,并令p指向其前趋
p = p->next; ++j;
}
if (!(p->next) || j > i-1) {printf("----查无此人删除失败-----\n");return false;} // 删除位置不合理
q = p->next;
p->next = q->next; // 删除并释放结点
free(q);
printf("----删除成功-----\n");
SaveFile(L);
return true;
}
bool CreatList(Linklist &L) //采用尾插法在尾部插入元素
{
Linklist r, s;
r=L; //r指针始终动态指向链表的当前表尾
while(r->next)
{//尾插法,直接把指针移位到尾部
r=r->next;
}
s=(Lnode*)malloc(sizeof(Lnode));
//printf("在尾部插入的联系人信息为:\n");
printf("-------------------------------------------------------------------------------\n");
printf(" 姓名 固定电话 移动电话 邮箱 \n");
printf("-------------------------------------------------------------------------------\n");
scanf("%s%s%s%s",&s->data.name,&s->data.phoneNumber,&s->data.mobileNumber,&s->data.mail);
s->next=NULL;
r->next=s;
SaveFile(L);
return true;
}
//输出链表数据
void PrintList(Linklist &L){
Lnode *p;
p = L->next;
while(p != NULL){
printf("%s %s %s %s",p->data.name,p->data.phoneNumber,p->data.mobileNumber,p->data.mail);
p = p->next;
}
printf("\n");
}
//修改
bool ChangeList(Linklist &L){
//printf("请输入你要修改的用户的名字\n");
int i = Fund_LName(L);
//1.删除该节点
Linklist p=L,q;
//printf("输入要删除的学生的姓名:");
int j = 0;//i=Fund_LName(L);
while (p->next && j < i-1)
{ // 寻找第i个结点,并令p指向其前趋
p = p->next; ++j;
}
if (!(p->next) || j > i-1) {printf("----查无此人删除失败-----\n");return false;} // 删除位置不合理
q = p->next;
p->next = q->next; // 删除并释放结点
free(q);
//printf("----删除成功-----\n");
SaveFile(L);
//2.在第i个位置重新插入
Linklist s,r=L;
int k = 1;
//printf("输入要插入的位置:");
//scanf("%d",&i);
while (r&&k < i)
{ // 寻找第i个结点
r = r->next;
++k;
}
if (!r || k > i) {
printf("修改失败\n");
return false;
} // i小于1或者大于表长
s = (Linklist)malloc(sizeof(Lnode)); // 生成新结点
printf("修改的联系人信息为:\n");
printf("-------------------------------------------------------------------------------\n");
printf(" 姓名 固定电话 移动电话 邮箱 \n");
printf("-------------------------------------------------------------------------------\n");
scanf("%s%s%s%s",&s->data.name,&s->data.phoneNumber,&s->data.mobileNumber,&s->data.mail);
s->next = p->next; // 插入L中
p->next = s;
SaveFile(L);
}
网友评论