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