質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

連結リストの末尾挿入で困っています

YK121
EE121

総合スコア5

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0グッド

0クリップ

1913閲覧

投稿2021/10/31 09:12

編集2021/11/01 09:24
#include<stdio.h> #include<stdlib.h> typedef struct CELL {/*構造体の定義*/ int value;/*変数の定義*/ struct CELL* next;/*ポインターに関する変数の定義*/ }CELL;/*呼称*/ //関数 CELL* generateCELL() {/*generateCELLの定義*/ CELL* p;/*CELLポインター*/ if ((p = (CELL*)malloc(sizeof(CELL))) == NULL)/*条件分岐*/ { printf("メモリ不足です\n");/*画面表示*/ exit(1);/*exit関数の使用*/ } return p;/*戻り値*/ } //関数 void insertCELL_head(CELL* header, int n) {/*insertCELL_head関数の定義*/ CELL* head = generateCELL();/*ポインター*/ head->value = n;/*代入 アロー演算子連発*/ head->next = header->next;/*代入*/ header->next = head;/*代入*/ } //関数 void deleteCELL(CELL* header) {/*deleteCELL関数の定義*/ CELL* dele = header->next;/*ポインター*/ header->next = dele->next;/*代入*/ free(dele);/*free関数の使用*/ } void insertCELL_tail(CELL* header, int n) { CELL* tail = generateCELL();/*ポインター*/ tail->value = n; tail->next=NULL; while (header->next == NULL) { header->next = tail; tail->next = NULL; return; } } int main(void) {/*プログラム開始*/ CELL* header = generateCELL(); header->next = NULL; insertCELL_head(header, 30); insertCELL_head(header, 40); deleteCELL(header); insertCELL_head(header, 50); deleteCELL(header); insertCELL_head(header, 60); insertCELL_head(header, 70); insertCELL_tail(header, 20); CELL* q = header->next; while (q != NULL) { printf("value%d \n", q->value); q = q->next; } return 0; } コード ```### 前提・実現したいこと ここに質問の内容を詳しく書いてください。 連結リストで末尾に挿入するパターンで困っています。 ### 発生している問題・エラーメッセージ 連結リストで実行すると末尾にvalue20が加わり、表示させられるようにしたいのですが、デバッグすると表示されない value20を表示させたい(但し,メイン文やそのほかは変更しないようにinsertCELL_tail内のみの変更でお願いします) ``` エラーメッセージ なし ### 該当のソースコード ここに言語名を入力 C++ ソースコード void insertCELL_tail(CELL* header, int n) { CELL* tail = generateCELL();/*ポインター*/ tail->value = n; tail->next=NULL; while (header->next == NULL) { header->next = tail; tail->next = NULL; return; } } ### 試したこと #include<stdio.h> #include<stdlib.h> typedef struct CELL {/*構造体の定義*/ int value;/*変数の定義*/ struct CELL* next;/*ポインターに関する変数の定義*/ }CELL;/*呼称*/ //関数 CELL* generateCELL() {/*generateCELLの定義*/ CELL* p;/*CELLポインター*/ if ((p = (CELL*)malloc(sizeof(CELL))) == NULL)/*条件分岐*/ { printf("メモリ不足です\n");/*画面表示*/ exit(1);/*exit関数の使用*/ } return p;/*戻り値*/ } //関数 void insertCELL_head(CELL* header, int n) {/*insertCELL_head関数の定義*/ CELL* head = generateCELL();/*ポインター*/ head->value = n;/*代入 アロー演算子連発*/ head->next = header->next;/*代入*/ header->next = head;/*代入*/ } //関数 void deleteCELL(CELL* header) {/*deleteCELL関数の定義*/ CELL* dele = header->next;/*ポインター*/ header->next = dele->next;/*代入*/ free(dele);/*free関数の使用*/ } void insertCELL_tail(CELL* header, int n) { CELL* tail = generateCELL();/*ポインター*/ tail->value = n; tail->next=NULL; while (header->next == NULL) { header->next = tail; tail->next = NULL; return; } } int main(void) {/*プログラム開始*/ CELL* header = generateCELL(); header->next = NULL; insertCELL_head(header, 30); insertCELL_head(header, 40); deleteCELL(header); insertCELL_head(header, 50); deleteCELL(header); insertCELL_head(header, 60); insertCELL_head(header, 70); insertCELL_tail(header, 20); CELL* q = header->next; while (q != NULL) { printf("value%d \n", q->value); q = q->next; } return 0; } insertCELL_tail関数について試したこと take1 void insertCELL_tail(CELL* header, int n) { CELL* tail = generateCELL();/*ポインター*/ tail->value = n; tail->next=NULL; while (header->next == NULL) { header->next = tail; tail->next = NULL; return; } } take2 void insertCELL_tail(CELL* header, int n) { CELL* tail = generateCELL();/*ポインター*/ tail->value = n; while (header->next == NULL) { header->next = tail; } tail->next=NULL; } take3 void insertCELL_tail(CELL* header, int n) { CELL* tail = generateCELL();/*ポインター*/ tail->value = n; while (header->next == NULL) { header->next = tail; return; } tail->next=NULL; } take4 void insertCELL_tail(CELL* header, int n) { CELL* tail = generateCELL();/*ポインター*/ tail->value = n; tail->next=NULL; while (header->next != NULL) header = header->next; header->next = tail; } ### 補足情報(FW/ツールのバージョンなど) 以下のような骨組みがヒントとして与えられています void insertCELL_tail(CELL* header, int n) { //NULLを指す最後のポインターを探る } ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2021/11/01 07:51依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

y_waiwai

2021/10/31 09:25

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
YK121

2021/11/01 07:37

訂正してみましたが、このような形であってますか?

回答1

1

ベストアンサー

void insertCELL_tail(CELL* header, int n) ここで何をしたいか、考えると、
末尾に、tailを 付けたいので、

最後の while()を以下のようにするだけでは? (末尾を探し、付ける)
(質問文が更新されてるので違う?)

C

1#if 0 2 while (header->next == NULL) { 3 header->next = tail; 4 tail->next = NULL; 5 return; 6 } 7#else 8 while (header->next != NULL) header = header->next; 9 header->next = tail; 10#endif

これで、value20 は表示されましたが、、。

P.S. 質問文の編集では、以前の文章をそのまま残さないで。問題が何か分かりにくくなってます。

投稿2021/10/31 10:19

編集2021/11/01 11:40
pepperleaf

総合スコア6379

EE121👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

YK121

2021/11/01 05:04

やってみましたがだめでした. 何も表示されなくなりました
YK121

2021/11/01 12:27

解決しました pepperleafさんのおかげです 最後まで対応してくださり、ありがとうございました

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。