質問編集履歴
5
誤字
test
CHANGED
File without changes
|
test
CHANGED
@@ -832,4 +832,4 @@
|
|
832
832
|
|
833
833
|
・ポップ:5を入力すると,ノード番号1の値が-572662307となり他のノードがすべて消えて,プログラムが終了してしまいます.先頭のノードだけが削除され,再度,命令番号のメニューが表示されるには,現在のコードをどのように修正したらよいのでしょうか?
|
834
834
|
|
835
|
-
以
|
835
|
+
以上の2点を教えてください.よろしくお願いします.
|
4
コードの修正
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
コードの修正
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
コードの修正
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
コードの修正
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を設定する。
|