質問編集履歴

5

誤字

2019/11/04 08:06

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -832,4 +832,4 @@
832
832
 
833
833
  ・ポップ:5を入力すると,ノード番号1の値が-572662307となり他のノードがすべて消えて,プログラムが終了してしまいます.先頭のノードだけが削除され,再度,命令番号のメニューが表示されるには,現在のコードをどのように修正したらよいのでしょうか?
834
834
 
835
- の2点を教えてください.よろしくお願いします.
835
+ の2点を教えてください.よろしくお願いします.

4

コードの修正

2019/11/04 08:06

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 整数を要素とする1次元1方向連結リスト構造の基本的操作を行うプログラム作っています.STLは使用しないこととします.
1
+ 整数を要素とする1次元1方向連結リスト構造の基本的操作を行うプログラム作っています.ポインタと動的メモリの基本操作を学習するためにプログラムを作っているので,STLは使用しないこととします.
2
2
 
3
3
  以下の操作命令を受け付け、対応する処理を行うことを繰り返します.
4
4
 
@@ -566,7 +566,7 @@
566
566
 
567
567
  // 次ノードを参照するポインタpNextを作る。
568
568
 
569
- Node* pNext;
569
+ Node* pNext= new Node();
570
570
 
571
571
 
572
572
 
@@ -698,7 +698,9 @@
698
698
 
699
699
  // 既存の先頭ノードを新ノードの後につなぎ、先頭ポインタheadに新ノードをつなぐ
700
700
 
701
-
701
+ pNew->next = head;
702
+
703
+ head = pNew;
702
704
 
703
705
 
704
706
 
@@ -732,25 +734,41 @@
732
734
 
733
735
  // リストが空ならば(headとtailが同じノードを指していれば)、エラーを表示して戻る。
734
736
 
737
+ if(head==tail){
738
+
739
+ cout << "★番号が不正です";
740
+
741
+ return;
742
+
743
+ }
744
+
735
745
 
736
746
 
737
747
  // それ以外は以下を実行する。
738
748
 
749
+ else {
750
+
739
751
 
740
752
 
741
753
  // 先頭ノードの値を表示する
742
754
 
755
+ cout << head->value;
756
+
743
757
 
744
758
 
745
759
  // 先頭ポインタheadを退避用のポインタ変数pSaveにコピーして、先頭ポインタheadを次ノードに移動する。
746
760
 
761
+ Node* pSave = head;
762
+
763
+ head->next = head;
764
+
747
765
 
748
766
 
749
767
  // 待避したポインタpSaveが参照するノードを削除する。
750
768
 
751
-
769
+ delete pSave;
770
+
752
-
771
+ }
753
-
754
772
 
755
773
  }
756
774
 
@@ -784,24 +802,34 @@
784
802
 
785
803
  // 既存のダミーノードに引数で渡された値valueを設定する。
786
804
 
805
+ tail->value = value;
806
+
787
807
 
788
808
 
789
809
  // 既存のダミーノードの次に新ノードをつなぐ。
790
810
 
811
+ tail->next = pNew;
812
+
791
813
 
792
814
 
793
815
  // ポインタpNewが参照する新ノードを末尾ポインタtailにつなぐ。
794
816
 
817
+ tail = pNew;
818
+
795
819
 
796
820
 
797
821
  // 新ノードの次ノード参照ポインタはNULLとする。
798
822
 
799
-
823
+ pNew->next = NULL;
800
-
801
-
802
824
 
803
825
  }
804
826
 
805
827
  ```
806
828
 
829
+ このコードで実行すると,正しく出力されない点が2つあります
830
+
831
+ ・削除:2 を入力すると,指定したノード番号の値が0になって,プログラムが終了してしまいます.指定したノードが削除され,再度,命令番号のメニューが表示されるには,現在のコードをどのように修正したらよいでしょうか?
832
+
833
+ ・ポップ:5を入力すると,ノード番号1の値が-572662307となり他のノードがすべて消えて,プログラムが終了してしまいます.先頭のノードだけが削除され,再度,命令番号のメニューが表示されるには,現在のコードをどのように修正したらよいのでしょうか?
834
+
807
- ここまで,できたですが,コメント書いていて空白のところのコードがわからないので教えてさい.よろしくお願いします.
835
+ 以下2点を教えてください.よろしくお願いします.

3

コードの修正

2019/11/04 07:57

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -622,31 +622,43 @@
622
622
 
623
623
  // ノード番号nodeNoを1に設定する。
624
624
 
625
-
625
+ int nodeNo = 1;
626
626
 
627
627
 
628
628
 
629
629
  // ポインタpが先頭ノードを参照するように設定する。
630
630
 
631
+ Node* p = head;
632
+
631
633
 
632
634
 
633
635
  // ポインタpの参照先(現ノード)が末尾ノードでない間、以下を繰り返す。
634
636
 
637
+ while (p != tail) {
638
+
635
639
 
636
640
 
637
641
  // 現ノードの値と引数の値が等しいならノード番号を表示する。
638
642
 
643
+ if (p->value == value) {
644
+
645
+ cout << nodeNo;
646
+
647
+ }
648
+
639
649
 
640
650
 
641
651
  // 次ノードを現ノードとする。
642
652
 
653
+ p = p->next;
654
+
643
655
 
644
656
 
645
657
  // ノード番号をインクリメントする。
646
658
 
647
-
659
+ nodeNo++;
660
+
648
-
661
+ }
649
-
650
662
 
651
663
  }
652
664
 
@@ -792,4 +804,4 @@
792
804
 
793
805
  ```
794
806
 
795
- ここまで,できたのですが,コメントを書いていて空白のところのコードがわからないので教えて下さい.おねがいします.
807
+ ここまで,できたのですが,コメントを書いていて空白のところのコードがわからないので教えて下さい.よろしくいします.

2

コードの修正

2019/11/04 06:40

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -572,17 +572,25 @@
572
572
 
573
573
  // 次ノードの内容(valueとnext)を現ノードへコピーする。
574
574
 
575
+ p->value = pNext->value;
576
+
577
+ p->next = pNext->next;
578
+
575
579
 
576
580
 
577
581
  // 次ノードが末尾のダミーノードならば、末尾ポインタが現ノードを参照するように設定する。
578
582
 
583
+ if (p->next == tail) {
584
+
585
+ tail = p;
586
+
587
+ }
588
+
579
589
 
580
590
 
581
591
  // 次ノードを削除する。
582
592
 
583
-
593
+ delete pNext;
584
-
585
-
586
594
 
587
595
  }
588
596
 
@@ -614,6 +622,8 @@
614
622
 
615
623
  // ノード番号nodeNoを1に設定する。
616
624
 
625
+
626
+
617
627
 
618
628
 
619
629
  // ポインタpが先頭ノードを参照するように設定する。

1

コードの修正

2019/11/04 06:26

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -18,8 +18,6 @@
18
18
 
19
19
 
20
20
 
21
- ・操作関数は相互利用が可能な場合(例: pushNode(value) <-> insertNode(0, value))があるが、ここでは互いに依存しない関数として実現します.
22
-
23
21
  ・末尾ノードは有効な値を持たないダミーノードです.
24
22
 
25
23
  ・先頭と末尾のノードは、それぞれポインタ変数head、tailが参照しています.
@@ -666,10 +664,14 @@
666
664
 
667
665
  // 新ノードの領域を確保し、ポインタpNewにつなぐ
668
666
 
667
+ Node* pNew = new Node();
668
+
669
669
 
670
670
 
671
671
  // 新ノードに引数で渡された値valueを入れる。
672
672
 
673
+ pNew->value = value;
674
+
673
675
 
674
676
 
675
677
  // 既存の先頭ノードを新ノードの後につなぎ、先頭ポインタheadに新ノードをつなぐ
@@ -754,6 +756,8 @@
754
756
 
755
757
  // 新ノードの領域を確保し、ポインタpNewにつなぐ(これが新規のダミーノードとなる)。
756
758
 
759
+ Node* pNew = new Node();
760
+
757
761
 
758
762
 
759
763
  // 既存のダミーノードに引数で渡された値valueを設定する。