生活随笔
收集整理的這篇文章主要介紹了
顺序表的应用__电话本
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
順序表的建立及使用
順序表: 就所謂的數(shù)組式操作
編程實(shí)現(xiàn)順序存儲(chǔ)結(jié)構(gòu)中的基本操作的實(shí)現(xiàn)(電話本的建立、插入、刪除、修改、逆置、查找、輸出)
整個(gè)操作過(guò)于簡(jiǎn)陋, 只對(duì)上述功能做敘述, 采用結(jié)構(gòu)體數(shù)組實(shí)現(xiàn), 本打算用class操作, 可因?yàn)槟撤N原因就擱置了………..
代碼中的注釋部分是用于測(cè)試數(shù)據(jù), 電話本只存有number, name
#include<cstdio>
#include<cstring>
#define MAXSIZE 100
#define null 0int size=
0;
typedef struct{
char name[
10];
char number[
12];
}telephone;telephone t[MAXSIZE];
void create();
int find(
int lo,
int hi,telephone t[],
char* target_value);
void insert(telephone t[],
int size);
void display(telephone t[],
int size);
void convert(telephone t[],
int size);
void create(){
int t_size;
printf(
"輸入需要?jiǎng)?chuàng)建的電話本大小");
scanf(
"%d",&t_size);insert(t,t_size+
1);
}
int find(
int lo,
int hi,telephone t[],
char target_value[]){
if(lo>=hi)
return null;
if(
strcmp(target_value,t[(lo+hi)/
2].name)==
0)
return (lo+hi)/
2;
if(
strcmp(target_value,t[(lo+hi)/
2].name)>
0)
return find((lo+hi)/
2+
1,hi,t,target_value);
else if(
strcmp(target_value,t[(lo+hi)/
2].name)<
0)
return find(lo,(lo+hi)/
2,t,target_value);}
void insert(telephone t[],
int t_size){
int i,j;
for(i=size+
1;i<t_size;i++){
printf(
"輸入姓名,電話\n");
scanf(
"%s%s",t[i].name,t[i].number);
strcpy(t[
0].name,t[i].name);
strcpy(t[
0].number,t[i].number);j=i-
1;
while((
strcmp(t[j].name,t[
0].name)>
0)){
strcpy(t[j+
1].name,t[j].name);
strcpy(t[j+
1].number,t[j].number);j--;}
strcpy(t[j+
1].name,t[
0].name);
strcpy(t[j+
1].number,t[
0].number); ++size;
}
return;
}
int remove(telephone t[],
char* target_value,
int t_size){
int i;
int location=find(
0,size,t,target_value);
if(location==
0)
return null;
for(i=location;i<=size;i++){
strcpy(t[i].name,t[i+
1].name);
strcpy(t[i].number,t[i+
1].number);}
size--;
return location;
}
void display(telephone t[],
int size){
char c;
for(
int i=
1;i<=size;i++)
printf(
"%d=姓名:%s, 號(hào)碼:%s\n",i,t[i].name,t[i].number);
return;
}
void convert(telephone t[],
int size){
for(
int i=
1;i<=size/
2;i++){
strcpy(t[
0].name,t[i].name);
strcpy(t[i].name,t[size-i+
1].name);
strcpy(t[size-i+
1].name,t[
0].name);
strcpy(t[
0].number,t[i].number);
strcpy(t[i].number,t[size-i+
1].number);
strcpy(t[size-i+
1].number,t[
0].number);}
}
int main(){
int i,key=
1;
char *c;
while(key){
printf(
"1-創(chuàng)建電話本\n 2-插入賬戶信息\n 3-查找號(hào)碼\n 4-刪除號(hào)碼\n 5-查看所有信息\n 6-將電話本倒置\n 7-關(guān)閉\n");
scanf(
"%d",&i);
switch(i){
case 1:create();fflush(stdin);
break;
if(create_flag==
1){
case 2:insert(t,size+
2);fflush(stdin);
break;
case 3:
printf(
"輸入查找的元素,0表示查找失敗\n 查找的姓名:");
scanf(
"%s",c);
printf(
"所在的位置是%d\n",find(
1,size,t,c));fflush(stdin);
break;
case 4:
printf(
"輸入要?jiǎng)h除的元素,0表示刪除失敗\n 刪除的姓名:");
scanf(
"%s",c);
printf(
"刪除元素的位置是%d\n",remove(t,c,size));fflush(stdin);
break;
case 5:display(t,size);fflush(stdin);
break;
case 6:convert(t,size);fflush(stdin);
break;}
else printf(
"未創(chuàng)建電話本,不可刪除,查找,展示,倒置操作");
case 7: key=
0;
break; }}
return 0;
}
在寫(xiě)代碼的過(guò)程中出現(xiàn)的問(wèn)題是:
- 二分查找的時(shí)候沒(méi)有做尾遞歸處理,導(dǎo)致返回值出現(xiàn)問(wèn)題, 不能正確的返回出是否查找到當(dāng)前元素的位置, 處理find((lo+hi)/2+1,hi,t,target_value); 寫(xiě)成做 (lo+hi)/2; 導(dǎo)致在遞歸查找的過(guò)程中出現(xiàn)死遞歸, 不能返回出來(lái)
- 在remove中將局部變量的名稱(chēng)與全局變量的名稱(chēng)寫(xiě)成一樣的(size), 導(dǎo)致size–出錯(cuò); 真是愚蠢
- 進(jìn)行代碼調(diào)試的時(shí)候只是從邏輯的角度分析問(wèn)題, 而沒(méi)有寫(xiě)printf語(yǔ)句觀察程序的運(yùn)行過(guò)程, 細(xì)心考慮每個(gè)變量的變化情況, 造成無(wú)法準(zhǔn)確地定位錯(cuò)誤的位置
總結(jié)
以上是生活随笔為你收集整理的顺序表的应用__电话本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。