teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

誤字

2019/11/04 08:06

投稿

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

4

コードの修正

2019/11/04 08:06

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- 整数を要素とする1次元1方向連結リスト構造の基本的操作を行うプログラム作っています.STLは使用しないこととします.
1
+ 整数を要素とする1次元1方向連結リスト構造の基本的操作を行うプログラム作っています.ポインタと動的メモリの基本操作を学習するためにプログラムを作っているので,STLは使用しないこととします.
2
2
  以下の操作命令を受け付け、対応する処理を行うことを繰り返します.
3
3
  終了:プログラムを終了する。
4
4
  挿入:連結リストの指定位置に整数値を挿入する。
@@ -282,7 +282,7 @@
282
282
  ***********************************************/
283
283
 
284
284
  // 次ノードを参照するポインタpNextを作る。
285
- Node* pNext;
285
+ Node* pNext= new Node();
286
286
 
287
287
  // 次ノードの内容(valueとnext)を現ノードへコピーする。
288
288
  p->value = pNext->value;
@@ -348,8 +348,9 @@
348
348
  pNew->value = value;
349
349
 
350
350
  // 既存の先頭ノードを新ノードの後につなぎ、先頭ポインタheadに新ノードをつなぐ
351
+ pNew->next = head;
352
+ head = pNew;
351
353
 
352
-
353
354
  }
354
355
 
355
356
 
@@ -365,16 +366,24 @@
365
366
  ***********************************************/
366
367
 
367
368
  // リストが空ならば(headとtailが同じノードを指していれば)、エラーを表示して戻る。
369
+ if(head==tail){
370
+ cout << "★番号が不正です";
371
+ return;
372
+ }
368
373
 
369
374
  // それ以外は以下を実行する。
375
+ else {
370
376
 
371
377
  // 先頭ノードの値を表示する
378
+ cout << head->value;
372
379
 
373
380
  // 先頭ポインタheadを退避用のポインタ変数pSaveにコピーして、先頭ポインタheadを次ノードに移動する。
381
+ Node* pSave = head;
382
+ head->next = head;
374
383
 
375
384
  // 待避したポインタpSaveが参照するノードを削除する。
376
-
385
+ delete pSave;
377
-
386
+ }
378
387
  }
379
388
 
380
389
  /*****************************************************
@@ -391,14 +400,19 @@
391
400
  Node* pNew = new Node();
392
401
 
393
402
  // 既存のダミーノードに引数で渡された値valueを設定する。
403
+ tail->value = value;
394
404
 
395
405
  // 既存のダミーノードの次に新ノードをつなぐ。
406
+ tail->next = pNew;
396
407
 
397
408
  // ポインタpNewが参照する新ノードを末尾ポインタtailにつなぐ。
409
+ tail = pNew;
398
410
 
399
411
  // 新ノードの次ノード参照ポインタはNULLとする。
400
-
412
+ pNew->next = NULL;
401
-
402
413
  }
403
414
  ```
415
+ このコードで実行すると,正しく出力されない点が2つあります
416
+ ・削除:2 を入力すると,指定したノード番号の値が0になって,プログラムが終了してしまいます.指定したノードが削除され,再度,命令番号のメニューが表示されるには,現在のコードをどのように修正したらよいでしょうか?
417
+ ・ポップ:5を入力すると,ノード番号1の値が-572662307となり他のノードがすべて消えて,プログラムが終了してしまいます.先頭のノードだけが削除され,再度,命令番号のメニューが表示されるには,現在のコードをどのように修正したらよいのでしょうか?
404
- ここまで,できたですが,コメント書いていて空白のところのコードがわからないので教えてさい.よろしくお願いします.
418
+ 以下2点を教えてください.よろしくお願いします.

3

コードの修正

2019/11/04 07:57

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -310,19 +310,25 @@
310
310
  *****************************************/
311
311
 
312
312
  // ノード番号nodeNoを1に設定する。
313
-
313
+ int nodeNo = 1;
314
314
 
315
315
  // ポインタpが先頭ノードを参照するように設定する。
316
+ Node* p = head;
316
317
 
317
318
  // ポインタpの参照先(現ノード)が末尾ノードでない間、以下を繰り返す。
319
+ while (p != tail) {
318
320
 
319
321
  // 現ノードの値と引数の値が等しいならノード番号を表示する。
322
+ if (p->value == value) {
323
+ cout << nodeNo;
324
+ }
320
325
 
321
326
  // 次ノードを現ノードとする。
327
+ p = p->next;
322
328
 
323
329
  // ノード番号をインクリメントする。
324
-
330
+ nodeNo++;
325
-
331
+ }
326
332
  }
327
333
 
328
334
  /****************************************************
@@ -395,4 +401,4 @@
395
401
 
396
402
  }
397
403
  ```
398
- ここまで,できたのですが,コメントを書いていて空白のところのコードがわからないので教えて下さい.おねがいします.
404
+ ここまで,できたのですが,コメントを書いていて空白のところのコードがわからないので教えて下さい.よろしくいします.

2

コードの修正

2019/11/04 06:40

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -285,12 +285,16 @@
285
285
  Node* pNext;
286
286
 
287
287
  // 次ノードの内容(valueとnext)を現ノードへコピーする。
288
+ p->value = pNext->value;
289
+ p->next = pNext->next;
288
290
 
289
291
  // 次ノードが末尾のダミーノードならば、末尾ポインタが現ノードを参照するように設定する。
292
+ if (p->next == tail) {
293
+ tail = p;
294
+ }
290
295
 
291
296
  // 次ノードを削除する。
292
-
297
+ delete pNext;
293
-
294
298
  }
295
299
 
296
300
  /****************************************************
@@ -306,6 +310,7 @@
306
310
  *****************************************/
307
311
 
308
312
  // ノード番号nodeNoを1に設定する。
313
+
309
314
 
310
315
  // ポインタpが先頭ノードを参照するように設定する。
311
316
 

1

コードの修正

2019/11/04 06:26

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -8,7 +8,6 @@
8
8
  ポップ:リストの先頭から整数値をポップする(先頭から取り出し削除する)。
9
9
  追加:リストの末尾に整数値を追加する。
10
10
 
11
- ・操作関数は相互利用が可能な場合(例: pushNode(value) <-> insertNode(0, value))があるが、ここでは互いに依存しない関数として実現します.
12
11
  ・末尾ノードは有効な値を持たないダミーノードです.
13
12
  ・先頭と末尾のノードは、それぞれポインタ変数head、tailが参照しています.
14
13
 
@@ -332,8 +331,10 @@
332
331
  ***********************************************/
333
332
 
334
333
  // 新ノードの領域を確保し、ポインタpNewにつなぐ
334
+ Node* pNew = new Node();
335
335
 
336
336
  // 新ノードに引数で渡された値valueを入れる。
337
+ pNew->value = value;
337
338
 
338
339
  // 既存の先頭ノードを新ノードの後につなぎ、先頭ポインタheadに新ノードをつなぐ
339
340
 
@@ -376,6 +377,7 @@
376
377
  *************************************************/
377
378
 
378
379
  // 新ノードの領域を確保し、ポインタpNewにつなぐ(これが新規のダミーノードとなる)。
380
+ Node* pNew = new Node();
379
381
 
380
382
  // 既存のダミーノードに引数で渡された値valueを設定する。
381
383