数据结构课作业系列
数据结构课作业-----顺序表
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 }
数据结构课祖业------括号匹配检查
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 using namespace std; 6 7 #define Max 1005 8 9 typedef char StackItem; 10 11 class Stack 12 { 13 public: 14 Stack ():myTop(-1) {} 15 bool empty () const { return myTop == -1; } 16 void push (StackItem item); 17 void pop (); 18 StackItem top () const; 19 private: 20 StackItem myArray[Max]; 21 int myTop; 22 }; 23 24 StackItem Stack::top () const 25 { 26 if (myTop == -1) return -1; 27 return myArray[myTop]; 28 } 29 30 void Stack::push (StackItem item) 31 { 32 if (myTop == Max) 33 { 34 cout << "栈已满,请删除后再入栈!\n"; 35 return; 36 } 37 myArray[++myTop] = item; 38 } 39 40 void Stack::pop () 41 { 42 if (myTop==-1) 43 return; 44 myTop--; 45 } 46 47 int main () 48 { 49 Stack opt; 50 while (1) 51 { 52 cout << " ***请输入要检查的括号: "; 53 StackItem braket[Max]; 54 bool error = false; 55 gets (braket); 56 for (int i=0; braket[i]; i++) 57 { 58 if (error) continue; 59 60 if (braket[i]=='(' || braket[i]=='[' || braket[i]=='{') 61 opt.push (braket[i]); 62 else 63 { 64 StackItem tmp = opt.top (); 65 if (tmp==-1) {error = true; continue;} 66 if (tmp=='(' && braket[i]==')') 67 { 68 opt.pop (); 69 continue; 70 } 71 if (tmp=='[' && braket[i]==']') 72 { 73 opt.pop (); 74 continue; 75 } 76 if (tmp=='{' && braket[i]=='}') 77 { 78 opt.pop (); 79 continue; 80 } 81 error = true; 82 } 83 } 84 if (error) 85 cout << " --括号不匹配--\n"; 86 else 87 cout << " --括号匹配正确--\n"; 88 } 89 return 0; 90 }
数据结构课作业------运算表达式求值
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <string> 5 using namespace std; 6 7 #define Max 1005 8 9 template <typename T> 10 class Stack 11 { 12 public: 13 Stack ():myTop(-1) { memset (myArray, 0, sizeof myArray); } 14 bool empty () const { return myTop == -1; } 15 void push (T item); 16 void pop (); 17 T top () const; 18 private: 19 T myArray[Max]; 20 int myTop; 21 }; 22 char tmp[25]; 23 24 template <typename T> void Stack <T>::push (T item) 25 { 26 if (myTop==Max) return; 27 myArray[++myTop] = item; 28 } 29 30 template <typename T> void Stack <T>::pop () 31 { 32 if (myTop == -1) return; 33 myTop--; 34 } 35 36 template <typename T> T Stack <T>::top () const 37 { 38 if (myTop == -1) return -1; 39 return myArray[myTop]; 40 } 41 42 char OptrRelation[7][7] = 43 { 44 {'>', '>', '<', '<', '<', '>', '>'}, 45 {'>', '>', '<', '<', '<', '>', '>'}, 46 {'>', '>', '>', '>', '<', '>', '>'}, 47 {'>', '>', '>', '>', '<', '>', '>'}, 48 {'<', '<', '<', '<', '<', '=', ' '}, 49 {'>', '>', '>', '>', ' ', '>', '>'}, 50 {'<', '<', '<', '<', '<', ' ', '='} 51 }; 52 53 int Postion_Optr (char optr) 54 { 55 switch (optr) 56 { 57 case '+':return 0; 58 case '-':return 1; 59 case '*':return 2; 60 case '/':return 3; 61 case '(':return 4; 62 case ')':return 5; 63 case '#':return 6; 64 } 65 } 66 67 char Precede (char s1, char s2) 68 { 69 int coord_1 = Postion_Optr(s1); 70 int coord_2 = Postion_Optr(s2); 71 72 return OptrRelation[coord_1][coord_2]; 73 } 74 75 int Opera (int a, char op, int b) 76 { 77 if (op=='-') return a-b; 78 if (op=='+') return a+b; 79 if (op=='*') return a*b; 80 if (op=='/') return a/b; 81 } 82 83 int Expression (string exp) 84 { 85 Stack <char> Operator; 86 Stack <int> Number; 87 88 int i=0; 89 exp += "#"; 90 Operator.push ('#'); 91 92 char ch = exp[i++]; 93 while (ch!='#' || Operator.top()!='#') 94 { 95 if (ch>='0' && ch<='9') 96 { 97 int k=0, a=0; 98 while (ch<='9' && ch>='0') 99 { 100 tmp[k++] = ch; 101 ch = exp[i++]; 102 } 103 tmp[k] = '\0'; 104 sscanf (tmp, "%d", &a); 105 Number.push (a); 106 } 107 else 108 { 109 switch (Precede (Operator.top(), ch)) 110 { 111 case '<': 112 Operator.push (ch); 113 ch = exp[i++]; 114 break; 115 case '=': 116 Operator.pop (); 117 ch = exp[i++]; 118 break; 119 case '>': 120 char opt = Operator.top (); 121 Operator.pop(); 122 int A = Number.top (); 123 Number.pop(); 124 int B = Number.top (); 125 Number.pop(); 126 Number.push (Opera (B, opt, A)); 127 break; 128 } 129 } 130 131 } 132 return Number.top(); 133 } 134 135 int main() 136 { 137 string exp; 138 while (1) 139 { 140 cout << "*** 请输入一个表达式 ***\n" 141 "注意:以'#'结尾且中间不得有多余的空格 :\n";cin >> exp; 142 143 int ans = Expression (exp); 144 145 printf ("%d\n",ans); 146 } 147 return 0; 148 }
数据结构课作业-----链式表。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 6 struct Node 7 { 8 char name[30]; 9 char telp[30]; 10 Node * next; 11 }; 12 13 class Stulist 14 { 15 public : 16 Stulist (); 17 ~Stulist (); 18 19 void Creat (int n); //建立n个元素的链式表 20 21 void Insert (Node item, int pos);//按位置插入元素item 22 23 void Find (int pos) const; //按位置查找 24 25 void Delete (int pos); //按位置删除 26 27 void Print () const; //打印所有数据 28 29 void Clear (); //清空链式表 30 private : 31 Node * first; 32 }; 33 34 void Stulist :: Clear () 35 { 36 Node * Pre = first; 37 while (Pre) 38 { 39 memset (Pre->name, 0, sizeof Pre->name); 40 memset (Pre->telp, 0, sizeof Pre->telp); 41 Pre = Pre->next; 42 } 43 } 44 45 void Stulist :: Print () const 46 { 47 Node * Pre = first->next; 48 int cnt=1; 49 cout << "******************************\n"; 50 while (Pre) 51 { 52 cout <<" "<< cnt <<". "<< Pre->name << " " << Pre->telp << endl; 53 Pre = Pre->next; 54 cnt++; 55 } 56 cout << "******************************\n"; 57 } 58 59 void Stulist :: Delete (int pos) 60 { 61 Node * Pre = first; 62 int cnt=0; 63 cout << "请输入要删除的位置: "; cin >> pos; 64 while (Pre && cnt<pos-1) 65 { 66 Pre = Pre->next; 67 cnt++; 68 } 69 if (Pre==NULL) 70 { 71 cout << "试图删除非法位置!\n"; 72 return; 73 } 74 Pre->next = Pre->next->next; 75 cout << "以成功删除第" << pos << " 个数据.\n"; 76 } 77 78 void Stulist :: Find (int pos) const 79 { 80 Node * Pre = first; 81 int cnt=0; 82 cout << "请输入要查找的位置: "; cin >> pos; 83 while (Pre && cnt<pos) 84 { 85 Pre = Pre->next; 86 cnt++; 87 } 88 if (Pre==NULL) 89 { 90 cout << "你要查找的数据不存在,请核对后再查找!\n"; 91 return; 92 } 93 cout << "你要查找的信息详细如下:\n"; 94 cout << "************************\n"; 95 cout << " 姓名:"<< Pre->name <<endl; 96 cout << " 号码:"<< Pre->telp <<endl; 97 cout << "************************\n"; 98 } 99 100 void Stulist::Insert (Node item, int pos) 101 { 102 Node * Pre=first, * Cur; 103 cout << "请输入要插入的位置: "; cin >> pos; 104 int cnt=0; 105 while (Pre && cnt < pos-1) 106 { 107 Pre = Pre->next; 108 cnt++; 109 } 110 if (Pre==NULL) 111 { 112 cout << "试图插入非法位置!\n"; 113 return; 114 } 115 cout << "请出入要插入的姓名:"; cin >> item.name; 116 cout << "请出入要插入的号码:"; cin >> item.telp; 117 Cur = new Node; 118 strcpy (Cur->name, item.name); 119 strcpy (Cur->telp, item.telp); 120 Cur->next = Pre->next; 121 Pre->next = Cur; 122 cout << "插入成功!\n"; 123 } 124 125 Stulist::Stulist () 126 { 127 first = new Node; 128 first->next = NULL; 129 } 130 131 Stulist :: ~Stulist () 132 { 133 Node * pre = first; 134 while (first) 135 { 136 pre = first; 137 first = pre->next; 138 delete pre; 139 } 140 } 141 void Stulist::Creat (int n) 142 { 143 Node *Pre, *Cur; 144 first = new Node; 145 Pre = first; 146 cout << "请输入要建立表的大小: "; cin >> n; 147 for (int i=0; i<n; i++) 148 { 149 Cur = new Node; 150 cout << "请输入第 " << i+1 << " 个数据:"; cin >> Cur->name >> Cur->telp; 151 Pre->next = Cur; 152 Pre = Cur; 153 } 154 Pre->next = NULL; 155 } 156 157 void Meue () 158 { 159 cout<<" \n ~~~~~~~~~~~~~~请选择您要执行的操作:~~~~~~~~~~~~~~\n"; 160 cout<<endl<<endl; 161 cout<<" `````````````````````````````````````````````\n"; 162 cout<<" ` 1、清空顺序表 `\n"; 163 cout<<" ` 2、创建顺序表 `\n"; 164 cout<<" ` 3、插入信息 `\n"; 165 cout<<" ` 4、删除信息 `\n"; 166 cout<<" ` 5、查找信息 `\n"; 167 cout<<" ` 6、显示当前信息 `\n"; 168 cout<<" ` 0、退出系统 `\n"; 169 cout<<" `````````````````````````````````````````````\n"; 170 cout<<"\n请从序号0--6中选择:"; 171 } 172 173 void Operater (Stulist &Link) 174 { 175 Meue (); 176 int op, pos, n; 177 Node item; 178 while (1) 179 { 180 while (cin >> op, (op<0||op>6)) cout << "操作不合法: \n"; 181 switch (op) 182 { 183 case 1: 184 Link.Clear (); break; 185 case 2: 186 Link.Creat (n); break; 187 case 3: 188 Link.Insert (item, pos); break; 189 case 4: 190 Link.Delete (pos); break; 191 case 5: 192 Link.Find (pos); break; 193 case 6: 194 Link.Print (); break; 195 default:break; 196 } 197 } 198 cout << "~~~~~~~~~欢迎下次使用~~~~~~~~~\n"; 199 } 200 201 202 //*************** 主程序 ************** 203 int main () 204 { 205 Stulist Link; 206 207 Operater (Link); 208 209 return 0; 210 }
数据结构课作业------迷宫求解。
测试数据:
9 6 ....#. .....# ...... ...... ...... ...... ...... #....# .#..#. 9 11 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#...#.#. .#.#####.#. .#.......#. .#########. ........... 6 11 ..#.....#.. ..#..#..#.. ..#..#..### ..#..#..#.. ..#..#..#.. .....#..... 7 7 ..#.#.. ..#.#.. #.#.### ....... ###.### ..#.#.. ..#....
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 #define N 105 6 struct Pos 7 { 8 int x, y; 9 int step; 10 }path[N][N]; 11 char map[N][N]; 12 bool used[N][N]; 13 int dir[][2]={1,0, -1,0, 0,1, 0,-1}; 14 int n, m, ans; 15 16 bool judge (Pos a) 17 { 18 if (a.x<0||a.x>n-1 || a.y<0||a.y>m-1 || used[a.x][a.y] || map[a.x][a.y]=='#') 19 return false; 20 return true; 21 } 22 23 int bfs () 24 { 25 Pos Pre, Cur; 26 queue <Pos> Q; 27 while (!Q.empty ()) Q.pop(); 28 memset (used, 0, sizeof used); 29 30 used[n-1][m-1] = true; 31 Pre.x = n-1; 32 Pre.y = m-1; 33 Pre.step = 0; 34 35 Q.push (Pre); 36 while (!Q.empty ()) 37 { 38 Pre = Q.front (); 39 40 Q.pop(); 41 for (int i=0;i<4; i++) 42 { 43 Cur = Pre; 44 Cur.x += dir[i][0]; 45 Cur.y += dir[i][1]; 46 Cur.step += 1; 47 if (judge (Cur)) 48 { 49 used[Cur.x][Cur.y] = true; 50 path[Cur.x][Cur.y].x = Pre.x; 51 path[Cur.x][Cur.y].y = Pre.y; 52 Q.push (Cur); 53 if (Cur.x==0 && Cur.y==0) 54 return Cur.step; 55 } 56 } 57 } 58 return -1; 59 } 60 61 void PrintRoad () 62 { 63 queue <Pos> Q; 64 while (!Q.empty ()) Q.pop(); 65 int x1=0, y1=0, t=1; 66 int x2, y2; 67 Pos Pre; 68 Pre.x = x1; Pre.y=y1; 69 Q.push (Pre); 70 while (1) 71 { 72 x2 = x1; 73 y2 = y1; 74 Q.push (path[x2][y2]); 75 x1 = path[x2][y2].x; 76 y1 = path[x2][y2].y; 77 if (x1==n-1 && y1==m-1) break; 78 } 79 80 while (!Q.empty ()) 81 { 82 Pre = Q.front (); 83 Q.pop(); 84 printf ("第 %d 歩:(%d, %d) -> (%d, %d)\n",t++, Pre.x,Pre.y,path[Pre.x][Pre.y].x,path[Pre.x][Pre.y].y); 85 if (t-1==ans) break; 86 } 87 } 88 int main () 89 { 90 printf ("``请输入迷宫的大小,其中 '#' 表示墙不可以通过,'.' 表示道路可以通过:\n"); 91 // freopen("test","r",stdin); 92 while (~scanf ("%d%d",&n,&m)) 93 { 94 for (int i=0; i<n; i++) 95 for (int j=0; j<m; j++) 96 scanf (" %c",map[i]+j); 97 ans = bfs (); 98 if (ans!=-1) 99 { 100 printf ("``走出迷宫最少需要花费 %d 分钟,路程如下:\n",ans); 101 PrintRoad (); 102 } 103 else 104 puts ("```````你无法走出迷宫了.````````"); 105 } 106 return 0; 107 }