数据结构课作业-----顺序表
1 /**************************** 2 3 程序名称:简单电话号码查询系统 V.0.1 4 主要功能:简单联系人录入,查找,排序..... 5 主要结构:静态数组类链表 6 7 **************************/ 8 9 #include <cstdio> 10 #include <cstring> 11 #include <iostream> 12 #include <algorithm> 13 using namespace std; 14 #define N 1005 15 16 //主要结构 17 struct Person 18 { 19 char name[25]; 20 char telp[15]; 21 }; 22 FILE * fp; 23 24 //主要类 25 class Phone 26 { 27 public: 28 //自定义构造函数 29 Phone ():mySize(10) 30 { 31 memset (people, 0, sizeof people); 32 } 33 //创建函数 34 void Creat (int n) 35 { 36 mySize = n; 37 memset (people, 0, sizeof people); 38 } 39 //按姓名查找 or 按电话号查找 or 按位置查找 40 void Find(int flag) const; 41 //按位置插入信息 42 void Insert (Person p, int pos); 43 //按位置修改信息 44 void Revamp (Person p, int pos); 45 //全部显示 46 void Display (bool flag) const; 47 //按位置删除 48 void Delete (int pos); 49 //按姓名排序 or 按电话号码排序 50 void Sort (int flag); 51 private: 52 int mySize; 53 Person people[N]; 54 }; 55 56 bool cmp (const Person &a, const Person &b) 57 { 58 return strcmp (a.telp, b.telp) < 0 ? 1 : 0; 59 } 60 bool cmp1 (const Person &a, const Person &b) 61 { 62 return strcmp (a.telp, b.telp) > 0 ? 1 : 0; 63 } 64 65 void Phone::Delete (int pos) 66 { 67 if (mySize==0 || pos>mySize || pos<1) 68 { 69 cout << "电话本为空 or 位置不存在,无法删除\n"; 70 return; 71 } 72 for (int i=pos; i<mySize; i++) 73 people[i] = people[i+1]; 74 } 75 76 void Phone::Sort (int flag) 77 { 78 if (flag == 1) 79 sort (people, people+mySize, cmp1); 80 else 81 sort (people, people+mySize, cmp); 82 } 83 84 void Phone::Revamp (Person p, int pos) 85 { 86 if (pos<1 || pos>mySize) 87 { 88 cout << "位置不存在\n"; 89 return; 90 } 91 if (mySize == 0) 92 { 93 cout << "电话本为空\n"; 94 return; 95 } 96 if (strlen(people[pos].name)==0 || strlen (people[pos].telp)==0) 97 { 98 cout << "该处没有信息科修改\n"; 99 return; 100 } 101 people[pos] = p; 102 } 103 104 void Phone::Find (int flag) const 105 { 106 char tmp[25]; 107 int pos; 108 cout << "输入要查找的信息: "; 109 if (flag < 3) 110 cin >> tmp; 111 else 112 cin >> pos; 113 114 bool tag = true; 115 int i; 116 for (i=0; i<mySize; i++) 117 { 118 if (flag == 1 && strcmp (tmp, this->people[i].name)==0) 119 { 120 tag = false;break; 121 } 122 else if (flag == 2 && strcmp (tmp, this->people[i].telp)==0) 123 { 124 tag = false;break; 125 } 126 else if (flag == 3 && (pos>1 && pos<mySize && mySize)) 127 { 128 tag = false; i = pos; break; 129 } 130 } 131 if (tag) 132 cout << "Sorry,你要查找的信息不存在\n"; 133 else 134 { 135 cout << " 你要查找的信息如下:\n"; 136 cout << " 姓名: " << this->people[i].name << endl; 137 cout << " 号码: " << this->people[i].telp << endl; 138 } 139 } 140 141 void Phone::Display (bool flag) const 142 { 143 if (mySize == 0) 144 { 145 cout << " 电话号码为空\n"; 146 return; 147 } 148 149 cout << " 电话本大小: " << mySize<<endl; 150 cout << " 电话本存有如下信息:\n"; 151 for (int i=1; i<=mySize; i++) 152 { 153 if (strlen(people[i].name) && !flag) 154 cout << "姓名: " << people[i].name << " 号码: " <<people[i].telp << endl; 155 else if (strlen(people[i].name) && flag) 156 { 157 fp = fopen ("phone.txt","w"); 158 fprintf (fp,"姓名: %s 号码: %s\n",people[i].name,people[i].telp); 159 } 160 } 161 cout << "\n"; 162 } 163 164 void Phone::Insert (Person p, int pos) 165 { 166 if (mySize == N) 167 { 168 cout << "内存已满,无法插入\n"; 169 return; 170 } 171 if (pos<1 || pos>mySize) 172 { 173 cout << "试图插入的位置非法\n"; 174 return; 175 } 176 177 for (int i=mySize; i>pos; i--) 178 people[i] = people[i-1]; 179 people[pos] = p; 180 mySize++; 181 } 182 183 //菜单函数 184 void Meue () 185 { 186 cout << "\n\n" 187 << " ************************************\n" 188 << " 欢迎使用简单电话查询系统 \n" 189 << " 1.创建一个 n 容量的电话本 \n" 190 << " 2.添加联系人 \n" 191 << " 3.修改联系人 \n" 192 << " 4.查找联系人 \n" 193 << " 5.显示联系人 \n" 194 << " 6.排序联系人 \n" 195 << " 7.写入到文件 \n" 196 << " 8.删除联系人 \n" 197 << " 0.退出 \n"; 198 cout << " ************************************\n"; 199 } 200 201 void FuncCreat (Phone &p) 202 { 203 int n; 204 cout << "输入电话本的大小( n 最大为1000): "; while (cin>>n, n>1000)cout << "** 重输 **\n"; 205 p.Creat (n); 206 } 207 208 void FuncAdd (Phone &p) 209 { 210 int n, pos; 211 Person tmp; 212 cout << "输入要添加的个数:"; cin >> n; 213 for (int i=1; i<=n; i++) 214 { 215 cout << "输入第 " <<i<<" 个联系人的插入位置,姓名和电话:"; cin>>pos>>tmp.name>>tmp.telp; 216 p.Insert(tmp, pos); 217 } 218 } 219 220 void FuncRevamp (Phone &p) 221 { 222 int pos, n; 223 Person tmp; 224 cout << "输入要修改的个数: ";cin>>n; 225 for (int i=1; i<=n; i++) 226 { 227 cout << "输入要修改的位置: ";cin>>pos; 228 cout << "输入要修改的信息(姓名+号码): ";cin>>tmp.name>>tmp.telp; 229 p.Revamp (tmp, pos); 230 } 231 } 232 233 void FuncFind (Phone &p) 234 { 235 int n; 236 cout << " ******************* \n" 237 << " 1.按姓名查找 \n" 238 << " 2.按号码查找 \n" 239 << " 3.按位置查找 \n"; 240 cout << " ******************* \n"; 241 242 cout << " 输入查找方式: "; while (cin>>n, n!=1&&n!=2&&n!=3)cout<<"**重输**\n"; 243 244 p.Find (n); 245 } 246 247 void FuncSort (Phone &p) 248 { 249 int n; 250 cout << " ***************** \n" 251 << " 1.按号码增序排 \n" 252 << " 2.按号码降序排 \n"; 253 cout << " ****************** \n"; 254 255 cout << "输入排序方式: "; while (cin>>n, n!=1&&n!=2)cout<<"**重输**\n"; 256 257 p.Sort (n); 258 } 259 260 void FuncDelete (Phone &p) 261 { 262 int pos; 263 cout << "输入要删除的位置:";cin>>pos; 264 p.Delete (pos); 265 } 266 //操作函数 267 void Operator (Phone &p) 268 { 269 int op; 270 while (1) 271 { 272 cout << "输入要进行的操作:\n"; 273 cin >> op; 274 if (op == 1) FuncCreat(p); 275 else if (op == 2) FuncAdd (p); 276 else if (op == 3) FuncRevamp (p); 277 else if (op == 4) FuncFind (p); 278 else if (op == 5) p.Display (0); 279 else if (op == 6) FuncSort (p); 280 else if (op == 7) p.Display (1); 281 else if (op == 8) FuncDelete (p); 282 if (op==0) break; 283 } 284 } 285 286 /************ 测试函数 *************/ 287 288 int main () 289 { 290 291 Phone p; 292 293 Meue (); 294 295 Operator (p); 296 297 return 0; 298 }