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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

3回答

4846閲覧

C言語 リスト 新しいノードをリストの最後に追加

ib2

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/12/19 10:41

C言語 リストについて
↓のプログラムでは入力した数字を逆順に表示

C

1/* list.c */ 2#include <stdio.h> 3#include <stdlib.h> 4struct node { 5 int num; 6 struct node *next; 7}; 8 9main() 10{ 11 struct node *head, *p; 12 int x; 13 head = NULL; 14 15 while(scanf("%d",&x) != EOF) { 16 p = (struct node *)malloc(sizeof(struct node)); 17 p->num = x; 18 19 p->next = head; 20 head = p; 21 } 22 // リストの要素のnumの値を先頭から順に表示する 23 p=head; 24 while(p!=NULL) { 25 printf("%d\n" ,p->num); 26 p = p->next; 27 28} 29} 30

↑のプログラムを↓のプログラムを使い修正して新しいノードをリストの最後に追加するようにしたいのですがどう書いたら良いのでしょうか?

C

1struct node *q; 2q = head; 3while(q->next != NULL) q = q->next;

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

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

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

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

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

guest

回答3

0

ビギナはどうしてもやりたいことをすべてmainに詰め込まないと気が済まないみたいだ。
はじめはそれで構わないが、複雑になるになるにつれ見通しが悪くなる。
できるだけ関数に細分化するクセをつけるが吉。
※ 最初っからこんなの↓書けとは言わないし求めてもいない

C

1/* list.c */ 2#define _CRT_SECURE_NO_WARNINGS 3#include <stdio.h> 4#include <stdlib.h> 5#include <stdbool.h> 6#include <assert.h> 7 8struct node { 9 int num; 10 struct node* next; 11}; 12 13/* nodeを確保し、numとnextを初期化して返す */ 14struct node* node_create(int n) { 15 struct node* new_node = (struct node*)malloc(sizeof(struct node)); 16 assert( new_node != NULL ); 17 new_node->num = n; 18 new_node->next = NULL; 19 return new_node; 20} 21 22/* headを先頭に、pred(p,arg)がtrueである最初のpを返す 23 head == NULL または見つからなければ NULL を返す */ 24const struct node* node_find(const struct node* head, 25 bool (*pred)(const struct node*,void*), 26 void* arg) { 27 const struct node* curr_node = head; 28 while ( curr_node != NULL ) { 29 const struct node* next_node = curr_node->next; 30 if ( pred(curr_node, arg) ) break; 31 curr_node = next_node; 32 } 33 return curr_node; 34} 35 36/* pnodeが末尾nodeであればtrueを返す */ 37static bool node_is_last(const struct node* pnode, void* un_used) { 38 return pnode->next == NULL; 39} 40 41/* headで示されたリストの先頭にtargetを挿入する 42 挿入後のリストの先頭を返す */ 43struct node* node_prepend(struct node* head, struct node* target) { 44 if ( head != NULL ) { 45 target->next = head; 46 } 47 return target; 48} 49 50/* headで示されたリストの末尾にtargetを挿入する 51 挿入後のリストの先頭を返す */ 52struct node* node_append(struct node* head, struct node* target) { 53 struct node* last_node = (struct node*)node_find(head, node_is_last, NULL); 54 if ( last_node == NULL ) { 55 head = target; 56 } else { 57 last_node->next = target; 58 } 59 return head; 60} 61 62static bool node_print(const struct node* pnode, void* arg) { 63 const char* format = (const char*)arg; 64 printf(format, pnode->num); 65 return false; 66} 67 68/* headで示されたリストの各要素を formatで指定された書式で 69 標準出力(stdout)に出力する */ 70void node_print_all(const struct node* head, const char* format) { 71 node_find(head, node_print, (void*)format); 72} 73 74/* pnodeを解放する */ 75static bool node_destroy(const struct node* pnode, void* un_used) { 76 free((void*)pnode); 77 return false; 78} 79 80/* headで示されたリスト内の全要素を解放し、NULLを返す */ 81struct node* node_destroy_all(struct node* head) { 82 node_find(head, node_destroy, NULL); 83 return NULL; 84} 85 86/* さて、以上を踏まえてここからが本番 87 といっても仕込み万端整ってるから 88 必要な関数を適宜呼び出すだけで一丁上がり */ 89 90int main() { 91 struct node* head = NULL; 92 93 int x; 94 while( scanf("%d",&x) > 0 ) { 95 /* nodeを末尾に挿入する。 (先頭に挿入なら node_prependせよ) */ 96 head = node_append(head, node_create(x)); 97 } 98 99 // リストの要素のnumの値を先頭から順に表示する 100 node_print_all(head, "%d\n"); 101 102 // 全nodeを解放する 103 head = node_destroy_all(head); 104 105 return 0; 106} 107

投稿2017/12/20 01:29

編集2017/12/20 02:08
episteme

総合スコア16614

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

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

0

リストの最後に追加するサンプルコードはこんな感じでしょうか

c

1#include <stdio.h> 2#include <stdlib.h> 3struct node { 4 int num; 5 struct node *next; 6}; 7 8int main() 9{ 10 struct node *head, *p, *q; 11 int x; 12 head = NULL; 13 14 while(scanf("%d",&x) != EOF) { 15 p = (struct node *)malloc(sizeof(struct node)); 16 if( p == NULL ) { 17 printf( "momory error\n" ); 18 return -1; 19 } 20 if ( head == NULL ){ 21 head = p; 22 }else{ 23 q->next = p; 24 } 25 p->num = x; 26 p->next = NULL; 27 q = p; 28 } 29 // リストの要素のnumの値を先頭から順に表示する 30 31 q = head; 32 while(q->next != NULL){ 33 printf("%d\n" ,q->num); 34 q = q->next; 35 } 36 printf("%d\n" ,q->num); 37} 38

投稿2017/12/19 23:41

A.Ichi

総合スコア4070

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

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

0

struct node *q;
q = head;
while(q->next != NULL) q = q->next;

これによってqはリストの末尾要素を指す。
その直後に新しいノードを追加せよ。

投稿2017/12/19 11:08

episteme

総合スコア16614

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

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

ib2

2017/12/19 12:53

実際のプログラムをどう書けば良いのかわからないので教えていただきたいです
episteme

2017/12/19 13:14

新しくノードを作りそのポインタをpNewとする、 pNew->num = テキトーな値; pNew->next = NULL; q->next = pNew;
ib2

2017/12/19 14:08

そのプログラムを質問に乗せているプログラムの中に書き足したら良いのでしょうか?
episteme

2017/12/19 20:06

やってみよ。質問はそれから。
ib2

2017/12/20 02:16

わかりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問