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

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

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

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

Q&A

解決済

連結リストに入力した「位置」に「アルファベット 1 文字」を挿入するプログラムで、入力した位置がリストの長さより大きい際、その後の入力動作がおかしい。

aoba-purines
aoba-purines

総合スコア12

C

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

3回答

0グッド

0クリップ

350閲覧

投稿2022/11/10 08:07

連結リストに入力した「位置」に「アルファベット 1 文字」を挿入するプログラムを作成したのですが、入力した「位置」がリストの長さより大きい際、その後の入力した文字がリストの最後尾についてしまいます。どうすれば解決するでしょうか?

実行例

ink 0 L 42 d 4 e /入力終わり/ ink Link Linkd Linked

自分のプログラムの場合

ink 0 L 42 d 4 e ink Link Linkd Linkde <-

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5typedef struct node* list; 6typedef char elementtype; 7struct node { 8 elementtype element; 9 struct node* next; 10}; 11 12struct node *initlist(elementtype e, struct node *x) { 13 struct node *n = (struct node *)malloc(sizeof(struct node)); 14 n->element = e; 15 n->next = x; 16 return n; 17} 18 19void insert(list *l, elementtype e) { 20 *l =initlist(e, *l); 21} 22 23void printlist(list l) { 24 for( ; l != NULL; l=l->next) printf("%c", l->element); 25 printf("\n"); 26} 27 28int main() { 29 char c,buf[128]; 30 int i, n; 31 struct node head; 32 list l = &head; 33 fgets(buf, sizeof(buf), stdin); 34 int len = strlen(buf); 35 if(len>0 && buf[len-1]=='\n') buf[len-1] = '\0'; 36 37 head.next = NULL; 38 for(i=strlen(buf)-1; i>=0; i--) { 39 insert(&head.next, buf[i]); 40 } 41 printlist(head.next); 42 43 while(fgets(buf,sizeof(buf),stdin) != NULL) { 44 sscanf(buf,"%d %c", &i, &c); 45 for(n=0; n<i && l->next!=NULL; n++, l=l->next); 46 insert(&l->next, c); 47 printlist(head.next); 48 } 49 50 return 0; 51} 52

補足情報(FW/ツールのバージョンなど)

unix gcc 4.8.5

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

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

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

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

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

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

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

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

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

回答3

1

Pseudocode

1SIZE = 128 2L ← EMPTYLIST(SIZE, NULL) 3 4input S 5L[0, S.length) ← S 6 7while TRUE 8 if input (P, S) = (NULL, NULL) break 9 L[P, P+S.length) ← S 10 11result ← "" 12for i ∈ [0, 1, ..., SIZE) 13 if L[i] ≠ NULL 14 result ← result + L[i] 15output result

投稿2022/11/10 19:50

atcoderyellow

総合スコア481

退会済みユーザー👍を押しています

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

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

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

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

2022/11/11 15:52

こちらの回答が複数のユーザーから「質問に対する回答となっていない投稿」という指摘を受けました。

0

とりあえず「アルファベット 1 文字」を挿入する処理ループにおいて何回か文字を挿入してみた場合、毎回の変数lがどうなっているか(毎回意図した位置を指しているか)を確認してみてください。

投稿2022/11/10 08:23

can110

総合スコア36360

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

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

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

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

0

ベストアンサー

l=l->nextでlは先頭から動いたまま次の挿入をしてしまっています

投稿2022/11/10 08:15

ozwk

総合スコア13092

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

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

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

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

回答へのコメント

jimbe

2022/11/10 08:28 編集

前の質問の回答のコードから(変数名を変えたついでに) >list l = &head; を移動させたせいですね。 「プログラムを作成した」と言いつつもどこで何をしているか読み切れていないのでしょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

C

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