数据结构课作业系列

 

 

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

  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

 

  数据结构课祖业------括号匹配检查

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

 

  数据结构课作业------运算表达式求值

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

 

  数据结构课作业-----链式表。

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

 

  数据结构课作业------迷宫求解。

测试数据:

9 6
....#.
.....#
......
......
......
......
......
#....#
.#..#.
9 11
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#...#.#.
.#.#####.#.
.#.......#.
.#########.
...........
6 11
..#.....#..
..#..#..#..
..#..#..###
..#..#..#..
..#..#..#..
.....#.....
7 7
..#.#..
..#.#..
#.#.###
.......
###.###
..#.#..
..#....
View Code
  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 }
View Code

 

posted @ 2014-10-28 22:27  无道圣君  阅读(300)  评论(0编辑  收藏  举报