实验项目名称:电话号码查询系统的实现
实验目的与要求:
1.基础知识:掌握数据结构中的查找、排序等算法相关知识;掌握C或VC++语言中程序设计的方法。
2.参考教材相关算法,完成以下程序功能:
(1)自选存储结构(顺序表或哈希表)实现电话号码表的初始化创建;
(2)编写一个电话号码查询系统,要求有电话号码记录的录入(插入)存储、查询、删除、打印、排序(顺序表存储结构必须有此功能,哈希表结构则不写此功能)等模块;
实验性质:验证性(4学时)
说明:当存储结构采用哈希表时此方式为推荐方式),数据元素为结构体类型(成 员至少包括姓名、电话号码),以电话号码或姓名为关键字构建哈希表,并进行查询、插入、删除、打印记录等功能模块,(其次子 函数的调用顺序由最终用户决定(可用多分支结构),程序中应有用户的操作选择界面。采用顺序存储结构时,数据元素也应为结构体类型(成员至少包括姓名、电话号码)构造成顺序表,自行设计元素存储(包括插入新元素)的顺序,以电话号码或姓名为关键字完成用户指定元素的查询、删除、排序操作,还应完成顺序表的打印操作。
图源代码:
#include<stdio.h>
#include<string.h>
typedef int Status;
#define length 10
typedef struct list
{
struct node *lnext;
}good;
good lis[length];//去掉good被误以为声明变量
struct node
{
char name[12];
char num[12];
char address[20];
struct node *next;
};
Status hash(struct node record)//11位电话号码相加,再取7的余数为哈希地址
{
int key=0;
for(int i=0;i<11;i++)
{
key=key+(int)(record.num[i]-'0');//强制转换为整形
}
key=key%7;
return key;
}
Status createnode()//插入电话记录
{
struct node *temp= new node;
temp->next=NULL;
printf("请输入姓名:");
scanf("%s",temp->name);
printf("输入电话:");
scanf("%s",temp->num);
printf("输入地址:");
scanf("%s",temp->address);
int k=hash(*temp);
struct list *p=&lis[k];
if(p->lnext!=NULL)
temp->next=p->lnext;
p->lnext=temp;
}
Status showlist()//打印非空位元素
{
printf("姓名\t\t电话号码\t\t地址\n");
for(int i=0;i<length;i++)
{
struct node *q=lis[i].lnext;
while(q)
{
printf("%s\t\t%s\t\t%s\n",q->name,q->num,q->address);
q=q->next;
}
}
}
Status find(char nu[])//查找
{
int key=0;
int flag=1;
for(int i=0;i<11;i++)
{
key=key+(int)(nu[i]-'0');
}
key=key%7;
struct node *q=lis[key].lnext;
while(q!=NULL)
{
for(int i=0;i<11;i++)
{
if(nu[i]==q->num[i])
{
flag=0;
continue;
}
else
{
flag=1;
break;
}
}
if(flag==0)
{
printf("姓名:%s\t电话:%s\t地址:%s\n",q->name,q->num,q->address);
break;
}
else
q=q->next;
}
if(flag==1)
printf("未找到\n");
}
Status deletenode(char nu[])
{
int key=0;
int flag=1;
for(int i=0;i<11;i++)
{
key=key+(int)(nu[i]-'0');
}
key=key%7;
struct node *q=lis[key].lnext;
struct node *p=new node;
if(q==NULL)
printf("无此记录\n");
else
{
for(int i=1;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(nu[j]==q->num[j])
{
flag=0;
continue;
}
else
{
flag=1;
break;
}
}
if(flag==0)
{
if(i==1)
lis[key].lnext=q->next;
q=NULL;
delete q;
printf("已删除\n");
break;
}
else
{
p=q;
q=q->next;
}
if(q==NULL)break;
}
if(flag==1)
printf("信息不存在\n");
}
}
Status OperateMenu(int num)//菜单函数
{
printf("------****操作菜单****------\n");
printf("------ 0 退出系统\n");
printf("------ 1 添加\n");
printf("------ 2 查找\n");
printf("------ 3 显示\n");
printf("------ 4 删除\n");
printf("------ 请选择你所需要的操作\n");
scanf("%d",&num);
return num;
}
main()
{
struct list lis[length];
for(int i=0;i<length;i++)
{
lis[i].lnext=NULL;
}
int num=-1;
while(num!=0)
{
{
num=OperateMenu(num);
}
switch(num)
{
case 1:createnode();break;
case 2:
char numb[11];
printf("请输入要查找的电话号码:\n");
scanf("%s",numb);
find(numb);
break;
case 3:showlist();break;
case 4:
char numc[11];
printf("请输入要删除的电话号码:\n");
scanf("%s",numc);
deletenode(numc);
}
}
}