帮别人改的DS课设3

时间:2022-01-01 15:30:21

#include "stdio.h"
#include "string.h"

#define NULL 0
#define m 20
unsigned int key;
unsigned int key2;
    int *p;
struct node //建节点
{
   char name[8],address[20];
   char num[11];
        node * next;
};

typedef node* pnode;
typedef node* mingzi;
        node **phone;
        node **nam;
        node *a;

void hash(char num[11]) //哈希函数
{
   int i = 0;
   key=num[i]-48;
   while(num[i]!=NULL)
   {
     key+=(num[i]-48);
     i++;
   }
   key=key%m;
}

void hash2(char name[8]) //哈希函数
{
   int i = 0;
   key2=name[i]-48;
   while(name[i]!=NULL)
   {
     key2+=(name[i]-48);
     i++;
   }
   key2=key2%m;
}

node* input() //输入节点
{
   node *temp;
   temp = new node;
   temp->next=NULL;
   printf("输入姓名:/n");
   scanf("%s",&temp->name);
   printf("输入地址:/n");
   scanf("%s",&temp->address);
   printf("输入电话:/n");
   scanf("%s",&temp->num);
   return temp;
}

int apend() //添加节点
{
   node *newphone;
   node *newname;
   newphone=input();
   newname=newphone;
   newphone->next=NULL;
   newname->next=NULL;
   hash(newphone->num);
   hash2(newname->name);
   newphone->next = phone[key]->next;
   phone[key]->next=newphone;
   newname->next = nam[key2]->next;
   nam[key2]->next=newname;
   return 0;
}

void create() //新建节点
{
   int i;
   phone=new pnode[20];
   for(i=0;i<20;i++)
   {
      phone[i]=new node;
      phone[i]->next=NULL;
   }
}
void create2() //新建节点
{
   int i;
   nam=new mingzi[20];
   for(i=0;i<20;i++)
   {
      nam[i]=new node;
      nam[i]->next=NULL;
   }
}
void list() //显示列表
{
   int i;
   node *p;
   for(i=0;i<20;i++)
   {
      p=phone[i]->next;
      while(p)
      {
         printf("%s_%s_%s/n",p->name,p->address,p->num);
         p=p->next;
   }
    }
}
void list2() //显示列表
{
   int i;
   node *p;
   for(i=0;i<20;i++)
   {
      p=nam[i]->next;
      while(p)
      {
          printf("%s_%s_%s/n",p->name,p->address,p->num);
          p=p->next;     
   }
   }
}

void find(char num[11]) //查找用户信息
{
 node *q;
    hash(num);
    q=phone[key]->next;
    while(q!= NULL)
    {
       if(strcmp(num,q->num)==0)
       break;
       q=q->next;
    }
    if(q)
    printf("%s_%s_%s/n",q->name,q->address,q->num);
    else printf("无此记录/n");
}
void find2(char name[8]) //查找用户信息
{
 node *q;
    hash2(name);
    q=nam[key2]->next;
    while(q!= NULL)
    {
        if(strcmp(name,q->name)==0)
        break;
        q=q->next;
    }
    if(q)
    printf("%s_%s_%s/n",q->name,q->address,q->num);
    else printf("无此记录/n");
}


void save() //保存用户信息
{
    int i;
    node *p;
    for(i=0;i<20;i++)
    {
      p=phone[i]->next;
      while(p)
      {
//         fstream cout("phone.txt", ios::out);
         printf("%s_%s_%s/n",p->name,p->address,p->num);
         p=p->next;
       }
    }
}

void menu() //菜单
{

   printf("0.添加记录/n");
   printf("3.查找记录/n");
   printf("2.姓名散列/n");
   printf("4.号码散列/n");
   printf("5.清空记录/n");
   printf("6.保存记录/n");
   printf("7.退出系统/n");
}

int main()
{
 char num[11];
 char name[8];

 create();
 create2() ;
 
 int sel;
 while(1)
 {
  menu();
  scanf("%d",&sel);
    if(sel==3)
       {  printf("9号码查询,8姓名查询/n");
         int b;
         scanf("%d",&b);
         if(b==9)
          {  printf("请输入电话号码:/n");
             scanf("%s",&num);
             printf("输出查找的信息:/n");
             find(num);
          }
          else
          {  printf("请输入姓名:/n");
             scanf("%s",&name);
             printf("输出查找的信息:/n");
             find2(name);}
     }
     if(sel==2)
     {  printf("姓名散列结果:/n");
        list2();
  }
     if(sel==0)
     {  printf("请输入要添加的内容:/n");
        apend();
  }
     if(sel==4)
     {  printf("号码散列结果:/n");
        list();
     }
     if(sel==5)
     {  printf("列表已清空:/n");
        create();
  create2();
  }
     if(sel==6)
     {  printf("通信录已保存:/n");
        save();
  }
     if(sel==7) return 0;
   }
   return 0;

}