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

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

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

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

Q&A

解決済

3回答

1009閲覧

c言語 リスト構造の要素の追加

gnu430

総合スコア1

C

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

0グッド

0クリップ

投稿2022/06/23 07:50

c言語にてリスト構造に要素を追加するinsert関数を作りました。

nodeの前にpを入れたいのですが、書き方が分かりません。

// nodeがpの次に来るように代入
の後に2行で書きたいのですがどなたかわかる方教えてください。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define LEN 10 6 7// 文字列1つとポインタの構造体 8typedef struct node{ 9 char str[LEN]; 10 struct node* next; 11} NODE; 12 13// インサート関数 14NODE* insert(char str[LEN], NODE* node){ 15 if(node != NULL){ // nodeが空でないなら 16 if(strcmp(str, node->str) > 0){ // 「str」が「node->str」より後に来る文字列の場合 17 insert(str, node->next); // 追加先をnode->nextにしてinsertを実行 18 }else 19 //挿入用ノードの生成 20 NODE* p = (NODE*)malloc(sizeof(NODE)); 21 strcpy(p->str, str); 22 23 // nodeがpの次に来るように代入 24 25 26 } 27 }else{ 28 node = (NODE*)malloc(sizeof(NODE)); 29 strcpy(node->str, str); 30 node->next = NULL; 31 } 32 33 return node; 34} 35

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

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

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

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

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

jimbe

2022/06/23 07:56

>// nodeがpの次に来るように代入 >の後に2行で書きたい なぜ2行なのでしょうか。
guest

回答3

0

すでに解決済みですが、こんなのでできるのではないかと。

C

1// インサート関数 2NODE* insert(char str[LEN], NODE* node) 3{ 4 if (node != NULL) { // nodeが空でないなら 5 if (strcmp(str, node->str) > 0) { // 「str」が「node->str」より後に来る文字列の場合 6 node->next = insert(str, node->next); // 追加先をnode->nextにしてinsertを実行 7 } else { 8 //挿入用ノードの生成 9 NODE* p = (NODE*)malloc(sizeof(NODE)); 10 strcpy(p->str, str); 11 p->next = node; // nodeがpの次に来るように代入 12 node = p; 13 } 14 } else { 15 node = (NODE*)malloc(sizeof(NODE)); 16 strcpy(node->str, str); 17 node->next = NULL; 18 } 19 20 return node; 21}

投稿2022/06/23 10:54

Bull

総合スコア986

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

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

0

ベストアンサー

node の前に入れるのであれば node の前の node が分からないといけないはずですが、該当箇所ではそれが分からないのではないでしょうか。
(そもそもバグがあるようにも見えますが。)


2行とか再帰とか元のコードに拘り(縛り?)が無ければ、以下で動作しました。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define LEN 10 6 7// 文字列1つとポインタの構造体 8typedef struct node { 9 char str[LEN]; 10 struct node* next; 11} NODE; 12 13// インサート関数 14NODE* insert(char str[LEN], NODE* root) { 15 //printf("insert(%s,%p)\n", str, root); 16 NODE *p = (NODE*)malloc(sizeof(NODE)); 17 strcpy(p->str, str); 18 p->next = NULL; 19 20 NODE dummy; 21 dummy.next = root; 22 NODE *prev = &dummy; 23 24 for( ; prev->next!=NULL; prev=prev->next) { 25 NODE *node = prev->next; 26 //printf("strcmp(%s,%s)=%d\n", str, node->str, strcmp(str, node->str)); 27 if(strcmp(str, node->str) <= 0) { 28 p->next = node; 29 break; 30 } 31 } 32 33 prev->next = p; 34 return dummy.next; 35} 36 37void print(NODE *node) { 38 for( ; node!=NULL; node=node->next) { 39 printf("%s -> ", node->str); 40 } 41 printf("NULL\n"); 42} 43 44int main(void) { 45 NODE *root = NULL; 46 print(root); 47 48 root = insert("123", root); 49 print(root); 50 51 root = insert("abc", root); 52 print(root); 53 54 root = insert("ABC", root); 55 print(root); 56 57 root = insert("0", root); 58 print(root); 59 60 root = insert("xyz", root); 61 print(root); 62}

実行結果(piaza.io)

plain

1NULL 2123 -> NULL 3123 -> abc -> NULL 4123 -> ABC -> abc -> NULL 50 -> 123 -> ABC -> abc -> NULL 60 -> 123 -> ABC -> abc -> xyz -> NULL

投稿2022/06/23 08:05

編集2022/06/23 08:52
jimbe

総合スコア12632

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

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

0

単方向リストなんだから とあるノードの前に挿入 は困難です。

とあるノードの ひとつ前のノード を特定できるのであれば、 そのノードの後ろに挿入(これは簡単)すればいい。
それができず、前に挿入したいなら 双方向リスト をオススメします。

投稿2022/06/23 07:59

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問