实验项目名称:电话号码查询系统的实现
实验目的与要求:
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); 


    }
}
}