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

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

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

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

C++

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

Q&A

解決済

1回答

4215閲覧

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

YK121

総合スコア5

連結リスト

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

C++

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

0グッド

0クリップ

投稿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を指す最後のポインターを探る } ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/10/31 09:25

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

2021/11/01 07:37

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

回答1

0

ベストアンサー

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

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YK121

2021/11/01 05:04

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

2021/11/01 12:27

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問