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

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

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

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

Q&A

解決済

3回答

759閲覧

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

aoba-purines

総合スコア13

C

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

0グッド

0クリップ

投稿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

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

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

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

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

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

guest

回答3

0

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

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

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

0

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

投稿2022/11/10 08:23

can110

総合スコア38332

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

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

0

ベストアンサー

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

投稿2022/11/10 08:15

ozwk

総合スコア13551

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

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

jimbe

2022/11/10 08:28 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.41%

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

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

質問する

関連した質問