数据结构课作业-----顺序表

  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 }
View Code

相关文章: