一、 問題描述及分析
寫清楚你要實現的是個什么系統,完成的都是什么功能?
實現一個電話號碼查詢系統,能夠完成通訊鏈表的建立、通訊者的插入、通訊者的查詢、顯示所有通訊者的信息以及保存通訊錄、退出程序等功能。
二、 功能模塊及數據結構描述
系統划分成幾個模塊,幾個模塊之間是什么調用關系?畫出系統結構圖
共六個模塊:1.增加信息2.顯示信息3.查找號碼4.清除信息5.保存信息6.退出系統
模塊均被主程序調用,除主函數外其他是並列關系。
一、 主要算法流程描述及部分核心算法
主要模塊的算法介紹,畫出其流程圖
void getin(Record* a)
{
//鍵盤輸入各人的信息
printf("輸入要添加的個數:\n");
scanf("%d",&NUM_BER);
int i;
for(i=0; i<NUM_BER; i++)
{
printf("請輸入第%d個記錄的用戶名:\n",i+1);
scanf("%s",a[i].name);
printf("請輸入%d個記錄的電話號碼:\n",i+1);
scanf("%s",a[i].tel);
printf("請輸入第%d個記錄的地址:\n",i+1);
scanf("%s",a[i].add);
}
}
void CreateHash1(HashTable* H,Record* a)
{//建表,以人的姓名為關鍵字,建立相應的散列表,並解決相應的沖突
int i,p=-1,c,pp;
for(i=0; i<NUM_BER; i++)
{
c=0;
p=Hash1(a[i].name);
pp=p;
while(H->elem[pp]!=NULL)
{
pp=collision(p,c);
if(pp<0)
{
printf("第%d記錄無法解決沖突",i+1); //需要顯示沖突次數時輸出
continue;
} //無法解決沖突,跳入下一循環(即+1)
}
H->elem[pp]=&(a[i]); //求得散列地址,將信息存入
H->count++;
printf("第%d個記錄沖突次數為%d。\n",i+1,c); //需要顯示沖突次數時輸出
}
printf("\n建表完成!\n此散列表容量為%d,當前表內存儲的記錄個數為%d.\n",HASHSIZE,H->count);
}
void SearchHash1(HashTable* H,int &c)
{//在通訊錄里查找姓名關鍵字,若查找成功,顯示信息//c用來顯示沖突次數
NA str;
printf("\n請輸入要查找記錄的姓名:\n");
scanf("%s",str);
int p,pp;
p=Hash1(str);
pp=p;
while((H->elem[pp]!=NULL)&&(eq(str,H->elem[pp]->name)==-1))
pp=collision(p,c);
if(H->elem[pp]!=NULL&&eq(str,H->elem[pp]->name)==1)
{
printf("\n查找成功!\n查找過程沖突次數為%d.以下是您需要要查找的信息:\n\n",c);
printf("姓 名:%s\n電話號碼:%s\n聯系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);
}
else printf("\n此人不存在,查找不成功!\n");
}
void CreateHash2(HashTable* H,Record* a)
{//建表,以電話號碼為關鍵字,建立相應的散列表,並解決相應的沖突
int i,p=-1,c,pp;
for(i=0; i<NUM_BER; i++)
{
c=0;
p=Hash2(a[i].tel);
pp=p;
while(H->elem[pp]!=NULL)
{
pp=collision(p,c);
if(pp<0)
{
printf("第%d記錄無法解決沖突",i+1); //需要顯示沖突次數時輸出
continue;
} //無法解決沖突,跳入下一循環(即+1)
}
H->elem[pp]=&(a[i]); //求得散列地址,將信息存入
H->count++;
printf("第%d個記錄沖突次數為%d。\n",i+1,c);//需要顯示沖突次數時輸出
}
printf("\n建表完成!\n此散列表容量為%d,當前表內存儲的記錄個數為%d.\n",HASHSIZE,H->count);
}
void SearchHash2(HashTable* H,int &c)
{//在通訊錄里查找電話號碼關鍵字,若查找成功,顯示信息//c用來記錄沖突次數,查找成功時顯示沖突次數
NA tele;
printf("\n請輸入要查找記錄的電話號碼:\n");
scanf("%s",tele);
int p,pp;
p=Hash2(tele);
pp=p;
while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))
pp=collision(p,c);
if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1)
{
printf("\n查找成功!\n查找過程沖突次數為%d.以下是您需要要查找的信息:\n",c);
printf("姓 名:%s\n電話號碼:%s\n聯系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);
}
else printf("\n此人不存在,查找不成功!\n");
}
void Save()
{//保存數據函數
FILE *fp;
if((fp=fopen("c:\test.txt", "w"))==NULL)
{
printf("\nERROR opening customet file");
}
fclose(fp);
}
int main(int argc, char* argv[])
{
int c,flag=1;
HashTable *H;
H=(HashTable*)malloc(LEN);
for(int i=0; i<HASHSIZE; i++)
H->elem[i]=NULL;
H->size=HASHSIZE;
H->count=0;
Record a[MAXSIZE];
printf(" 歡迎使用電話號碼查找系統 ");
printf("\n 1. 添加用戶信息 ");
printf("\n 2. 讀取所有用戶信息 ");
printf("\n 3. 以姓名建表 ");
printf("\n 4. 以電話號碼建表 ");
printf("\n 5. 查找並顯示給定用戶名的記錄 ");
printf("\n 6. 查找並顯示給定電話號碼的記錄 ");
printf("\n 7. 清空 ");
printf("\n 8. 保存 ");
printf("\n 9. 退出程序 ");
printf("\n 注意: ");
printf("\n Ⅰ.進行5操作前 請先輸出3 ");
printf("\n Ⅱ.進行6操作前 請先輸出4 ");
printf("\n");
printf("請輸入你想要的操作:");
printf("\n");
while(1)
{
int num;
scanf("%d",&num);
switch(num)
{
case 1:
getin(a);
break;
case 2:
ShowInformation(a);
break;
case 3:
CreateHash1(H,a); // 以姓名建立散列表
break;
case 4:
CreateHash2(H,a); // 以電話號碼建立散列表
break;
case 5:
c=0;
SearchHash1(H,c); //以姓名查找數據
break;
case 6:
c=0;
SearchHash2(H,c); //以電話號碼查找數據
break;
case 7:
Cls(a);
break;
case 8:
Save();
break;
case 9:
return 0;
break;
default:
printf("輸入錯誤,請重新輸入!");
printf("\n");
}
}
system("pause");
return 0;
}

