質問編集履歴

1

解答を参考に書き直したため

2021/05/26 15:02

投稿

tamintya
tamintya

スコア34

test CHANGED
File without changes
test CHANGED
@@ -283,3 +283,247 @@
283
283
 
284
284
 
285
285
  ```
286
+
287
+
288
+
289
+ (追記ソースコード)
290
+
291
+ ```
292
+
293
+ #include <stdio.h>
294
+
295
+ #include <stdlib.h>
296
+
297
+ #include<string.h>
298
+
299
+
300
+
301
+ /* 構造体 cell の宣言 */
302
+
303
+ struct cell {
304
+
305
+ int num;
306
+
307
+ struct cell *next;
308
+
309
+ };
310
+
311
+ typedef struct cell cell;
312
+
313
+
314
+
315
+ /**********************/
316
+
317
+ /* enq 操作を行う関数 */
318
+
319
+ /**********************/
320
+
321
+ void enq(struct cell **head, struct cell **tail, int val)
322
+
323
+ {
324
+
325
+ cell *p;
326
+
327
+ p=(cell*)malloc(sizeof( cell ));
328
+
329
+ p->num = val;
330
+
331
+ p->next = NULL;
332
+
333
+ if(head == NULL){
334
+
335
+ head = &p;
336
+
337
+ tail = &p;
338
+
339
+ }
340
+
341
+ else{
342
+
343
+ (*tail)->next = &p;
344
+
345
+ tail = &p;
346
+
347
+ }
348
+
349
+ }
350
+
351
+
352
+
353
+ /**********************/
354
+
355
+ /* deq 操作を行う関数 */
356
+
357
+ /**********************/
358
+
359
+ int deq(struct cell **head){
360
+
361
+ cell *p;
362
+
363
+ int deqdata;
364
+
365
+ deqdata = (*head)->num;
366
+
367
+ p = head;
368
+
369
+ *head = (*head)->next;
370
+
371
+ free(p);
372
+
373
+ return deqdata;
374
+
375
+ }
376
+
377
+
378
+
379
+ /******************************/
380
+
381
+ /* キューの中身を表示する関数 */
382
+
383
+ /******************************/
384
+
385
+ void print_queue(struct cell *head)
386
+
387
+ {
388
+
389
+ cell *p = head;
390
+
391
+ while(p != NULL){
392
+
393
+ printf(" -> %d" , p->num);
394
+
395
+ p=p->next;
396
+
397
+ }
398
+
399
+ printf("\n");
400
+
401
+
402
+
403
+ }
404
+
405
+
406
+
407
+ /******************************/
408
+
409
+ /* キューの中身を空にする関数 */
410
+
411
+ /******************************/
412
+
413
+ void free_queue(struct cell **head)
414
+
415
+ {
416
+
417
+ cell **q;
418
+
419
+ cell **p;
420
+
421
+ &p = head;
422
+
423
+ while(p != NULL){
424
+
425
+ q=(*p)->next;
426
+
427
+ free(p);
428
+
429
+ p=q;
430
+
431
+ }
432
+
433
+ printf("プログラムを終了します\n");
434
+
435
+ }
436
+
437
+
438
+
439
+ int main(void)
440
+
441
+ {
442
+
443
+ int indata;
444
+
445
+ char in[100];
446
+
447
+ struct cell *listhead=NULL; /* リストの先頭を指すポインタ.データが無い場合はNULLとする. */
448
+
449
+ struct cell *listtail; /* リストの末端を指すポインタ */
450
+
451
+ while(1){
452
+
453
+ printf("操作を入力してください(enq/deq/end) ==>");
454
+
455
+ scanf("%s" , in);
456
+
457
+ //end入力時
458
+
459
+ if(strcmp(in , "end") == 0){
460
+
461
+ free(&listhead);
462
+
463
+ }
464
+
465
+
466
+
467
+ //enq入力時
468
+
469
+ if(strcmp(in , "enq") == 0){
470
+
471
+ printf("追加する値を入力して下さい ==>");
472
+
473
+ scanf("%d" , &indata);
474
+
475
+ enq(&listhead , &listtail , indata);
476
+
477
+ print_queue(listhead);
478
+
479
+ if(listhead == NULL){
480
+
481
+ listtail = NULL;
482
+
483
+ }
484
+
485
+ }
486
+
487
+
488
+
489
+ //deq入力時
490
+
491
+ if(strcmp(in , "deq") == 0){
492
+
493
+ if(listhead == NULL){
494
+
495
+ printf("キューにデータはありません\n");
496
+
497
+ free_queue(&listhead);
498
+
499
+ break;
500
+
501
+ }
502
+
503
+ else{
504
+
505
+ printf("%dはキューから消去されました\n" , deq(&listhead));
506
+
507
+ print_queue(listhead);
508
+
509
+ }
510
+
511
+
512
+
513
+ }
514
+
515
+
516
+
517
+ }
518
+
519
+
520
+
521
+
522
+
523
+ return(0);
524
+
525
+ }
526
+
527
+
528
+
529
+ ```