课程设计

  1 // 51、用循环队列实现,InitQueue(), DestroyQueue(), ClearQueue(), QueueEmpty()
  2 #include <iostream>
  3 #include <cstring>
  4 using namespace std;
  5 #define ok 1
  6 #define test(j) cout<<j<<"*********"<<endl
  7 typedef int status;
  8 typedef int Datatype;
  9 struct Node{
 10     Datatype value;
 11     struct Node *next;
 12 };//定义节点
 13 
 14 typedef struct{
 15     struct Node *head;
 16     struct Node *end;
 17     int length;
 18 }Queue;//定义队列
 19 
 20 status InitQueue(Queue &q){
 21     q.head = q.end = (Node*)malloc(sizeof(Node));
 22     if(q.end == NULL){
 23         cout<<"初始化失败"<<endl;
 24     }
 25     q.head->next = NULL;
 26     q.end->next = q.head;
 27     q.length = 0;
 28     return ok;
 29 }
 30 
 31 status InsertQueue(Queue &q,Datatype e){
 32     Node *p = (Node*)malloc(sizeof(Node));
 33     if(!p){
 34         cout<<"内存分配失败"<<endl;
 35     }
 36     p->value = e;
 37     p->next = NULL;
 38     q.end->next = p;
 39     q.end = p;
 40     if(q.head->next==NULL)
 41         q.head->next = p;
 42     q.end->next = q.head;
 43     q.length++;
 44     return 0;
 45 }
 46 
 47 status Gettop(Queue q,Datatype &a){
 48     a = q.head->next->value;
 49     return ok;
 50 }
 51 
 52 status OutQueue(Queue &q){
 53     if(q.head == q.end){
 54         cout<<"当前队列为空,没有元素可以删除"<<endl;
 55         return ok;
 56     }
 57     q.head->next = q.head->next->next;
 58     q.length--;
 59     return ok;
 60 }
 61 
 62 status PrintQueue(Queue q){
 63     Node *p;
 64     p = q.head->next;
 65     if(q.head == q.end){
 66             cout<<"队列为空"<<endl;
 67         return 0;
 68     }
 69     cout<<"当前共有"<<q.length<<"个元素"<<endl;
 70     cout<<"-------------队列元素为--------------"<<endl;
 71     while(p!=q.head){
 72         cout<<p->value<<" ";
 73         p=p->next;
 74     }
 75     cout<<endl;
 76     return 0;
 77 }
 78 
 79 status QueueEmpty(Queue q){
 80     if(q.head == q.end)
 81         return 1;
 82     else
 83         return 0;
 84 }
 85 
 86 status ClearQueue(Queue &q){
 87     struct Node *p,*t;
 88     q.end = q.head;
 89     p = q.head->next;
 90     q.head->next = NULL;
 91     while(p!=q.head){
 92         t = p;
 93         p = p->next;
 94         free(t);
 95     }
 96     q.length = 0;
 97         return ok;
 98 }
 99 
100 status DestroyQueue(Queue &q){
101     if(q.head!=NULL){
102         q.end = q.head->next;
103         free(q.head);
104         q.head = q.end;
105     }
106     q.length = 0;
107     return ok;
108 }
109 
110 int main(){
111     Queue q;
112     InitQueue(q);
113     Datatype a;
114     int n;
115     cout<<"输入队列中数的个数:";
116     cin>>n;
117     while(n--){//n个数进队
118         a = rand()%100;//保证每次输入的数是随机数
119         InsertQueue(q,a);
120     }
121     PrintQueue(q);
122     Gettop(q,a);
123     cout<<"----------当前头结点-----------"<<endl<<a<<endl;
124     cout<<"输入需要删除几个节点: ";
125     cin>>n;
126     while(n--){
127         OutQueue(q);
128     }
129     Gettop(q,a);
130     cout<<"----------当前头结点-----------"<<endl<<a<<endl;
131     PrintQueue(q);
132     //判断队列是否为空
133     if(QueueEmpty(q)){
134         cout<<"队列为空"<<endl;
135     }else{
136         cout<<"队列不为空"<<endl;
137     }
138     cout<<"----------清空队列-----------"<<endl;
139     ClearQueue(q);
140     PrintQueue(q);
141     if(QueueEmpty(q)){
142         cout<<"队列为空"<<endl;
143     }else{
144         cout<<"队列不为空"<<endl;
145     }
146     cout<<"再次输入队列中数的个数:";
147     cin>>n;
148     while(n--){//n个数进队
149         a = rand()%100;//保证每次输入的数是随机数
150         InsertQueue(q,a);
151     }
152     PrintQueue(q);
153     Gettop(q,a);
154     cout<<"----------当前头结点-----------"<<endl<<a<<endl;;
155     cout<<"-----------销毁队列-----------"<<endl;
156     DestroyQueue(q);
157     PrintQueue(q);
158     return 0;
159 }
160 
161 
162 
163 
164 
165 //79、利用链表的插入运算建立线性链表,然后利用链表的查找、删除、计数、输出,排序,转置等运算实现链表的查找、计数操作,并单独写成函数的形式,能在屏幕上输出操作前后的结果。
166 
167 #include <iostream>
168 #include <cstdio>
169 #include <cstdlib>
170 #include <cstring>
171 typedef int DataType;
172 typedef int Status;
173 typedef struct LinkList{
174     DataType val;
175     struct LinkList *next;
176 }LinkList;
177 using namespace std;
178 
179 Status Getlist(LinkList *head,int n){//插入
180     LinkList *p=(LinkList*)malloc(sizeof(LinkList));
181     p=head;
182     srand((int)time(0));
183     for(int i=0;i<n;i++){
184         LinkList *q=(LinkList*)malloc(sizeof(LinkList));
185         q->val = rand()%100;// cin>>q->val;
186         p->next=q;
187         q->next=NULL;
188         p=q;
189     }
190     return 0;
191 }
192 
193 Status Count(LinkList *head) {//计数
194     int sum=0;
195     int x;
196     cout<<"请输入要统计个数x的值:";
197     cin>>x;
198     LinkList *p;
199     if(!head)
200         return 0;
201     p=head->next;
202     while(p) {
203         if(p->val==x) {
204             sum++;
205         }
206         p=p->next;
207     }
208     cout<<"链表中X的元素的个数为:"<<sum<<endl;
209     return 0;
210 }
211 
212 Status Find(LinkList *head){//查找
213     LinkList *p=(LinkList*)malloc(sizeof(LinkList));
214     int cnt=0,x;
215     bool prime = false;
216     cout<<"输入要查找的数:";
217     cin>>x;
218     p=head->next;
219     while(p!=NULL){
220         cnt++;
221         if(p->val == x){
222             cout<<x<<"为第"<<cnt<<"个数"<<endl;
223             prime = true;
224         }
225         p=p->next;
226     }
227     if(!prime)
228         cout<<"不存在所输入的数"<<endl;
229     return 0;
230 }
231 
232 Status Delete(LinkList *head){//删除指定的数
233     LinkList *p=(LinkList*)malloc(sizeof(LinkList));
234     p=head;
235     int x;
236     cout<<"输入要删除的数:";
237     cin>>x;
238     while(p->next!=NULL){
239         if(p->next->val==x){
240             p->next=p->next->next;
241             continue;
242         }
243         if(p->next!=NULL)
244             p=p->next;
245     }
246     return 0;
247 }
248 
249 Status Output(LinkList *head){//输出
250     LinkList *p=(LinkList*)malloc(sizeof(LinkList));
251     p=head;
252     while(p->next!=NULL){
253         p=p->next;
254         cout<<p->val<<" ";
255     }
256     cout<<endl;
257     return 0;
258 }
259 
260 LinkList *Transpose(LinkList *head){//转置
261     LinkList *q=(LinkList*)malloc(sizeof(LinkList));
262     LinkList *p=(LinkList*)malloc(sizeof(LinkList));
263     if(head->next->next == NULL)
264         return head;
265     p=head->next;
266     while(p!=NULL){
267         LinkList *end=(LinkList*)malloc(sizeof(LinkList));
268         end->val = p->val;
269         end->next = q->next;
270         q->next = end;
271         p=p->next;
272     }
273     return q;
274 }
275 
276 LinkList *BubbleSort( LinkList *head ){//排序
277     LinkList *q=(LinkList*)malloc(sizeof(LinkList));
278     LinkList *p=(LinkList*)malloc(sizeof(LinkList));
279     LinkList *end=(LinkList*)malloc(sizeof(LinkList));
280     int temp;
281     if(head->next->next == NULL)
282         return head;
283     q=p=head->next;
284     while(p->next!=NULL)
285         p=p->next;
286     end = p;
287     while(end != head->next){
288         for(p=head->next;p->next!=end;p=p->next){
289             q = p->next;
290             if(p->val>q->val){
291                 temp = p->val;
292                 p->val=q->val;
293                 q->val = temp;
294             }
295         }
296         end = p;
297         q = p->next;
298         if(p->val>q->val){
299             temp = p->val;
300             p->val=q->val;
301             q->val = temp;
302         }
303     }
304     return head;
305 }
306 int main(){
307     int n;
308     LinkList *head=(LinkList*)malloc(sizeof(LinkList));
309     cout<<"输入线性链表长度:";
310     cin>>n;
311     Getlist(head,n);
312     Output(head);
313     Count(head);
314     Find(head);
315     cout<<"将线性链表排序如下:";
316     BubbleSort(head);
317     Output(head);
318     Delete(head);
319     cout<<"输出最终线性链队:";
320     Output(head);
321     cout<<"将线性链表转置:";
322     Output(Transpose(head));
323     return 0;
324 }

 

posted @ 2018-01-23 20:06  #忘乎所以#  阅读(177)  评论(0编辑  收藏  举报