連結リストを用いて、入力した位置にアルファベットを挿入するプログラムを作ろうとしましたが、Segmentation Faultが発生してしまいました。デバッガgdbもうまく作動しません。どのようにすれば直るのか分かりません。問題は以下の通りです。
頭のある連結リストに対し、先頭に節点を挿入する関数
void insert(list l, elementtype e);
を用いて標準入力の 1 行目に与えられる文字列から char 型のリストを作成し、以降の入力の各行に与えられる「位置」と「アルファベット 1 文字」に対し、その位置にアルファベットを挿入するプログラムを作成せよ。「位置」は整数値で与えられ、0 番目が先頭を表すものとする。また、標準出力には、標準入力から 1 行入力されるごとに、その時点でのリストの内容を先頭から順に文字列として並べたものと改行文字を出力する。「位置」がその時点でのリストの長さより大きい場合には、末尾に挿入するものとせよ。
実行例
Big 2 n 4 o /入力終わり/ Big Bing Bingo
ink 0 L 42 d 4 e /入力終わり/ ink Link Linkd Linked
該当のソースコード
#include<stdio.h> #include<stdlib.h> typedef struct node* list; typedef char elementtype; struct node { elementtype element; struct node* next; }; /* 要素e,次に繋がるノードxを示すノードを作る */ struct node *initlist (elementtype e, struct node *x) { struct node *n; n = (struct node *) malloc (sizeof (struct node) ); n->element= e; n -> next = x; return n; } /* リストに要素eのノードを挿入*/ void insert(list*l, elementtype e) { list new ; new = initlist(e,*l); *l = new; } /* 表示 */ void print_list(list l) { while ( l != NULL) { printf("%d", l->element); l = l->next; } } int main() { int i, s; char c, buf[128]; list l ; /* リストlの初期化 */ l = (struct node *) malloc (sizeof (struct node) ); l ->next =NULL; fgets(buf,sizeof(buf),stdin); /* ← 1 行目を buf に読み込み */ for(i=0; (c = buf[i])!='\n'; ++i) {/* ← 1 文字ずつ処理する for 文 */ insert(&l,c);/* ※ここで c をリスト l の末尾に挿入 */ l=l->next; } print_list(l); while(fgets(buf,sizeof(buf),stdin) != NULL) {/* ← 2 行目以降を順に buf に読み込み */ sscanf(buf,"%d %c", &i, &c); for(s = 0 ;s < i ;s++){ l=l->next; } insert(&l,c);/* ※ここでリスト l の i 番目に c を挿入 */ print_list(l); } return 0; }
補足情報(FW/ツールのバージョンなど)
unix gcc 4.8.5

回答3件
あなたの回答
tips
プレビュー