前提
大学の課題で躓きました。連結リストから入力した数字の位置のノードを削除するプログラムで、2回目からの入力がおかしくなってしまいます。どのようにすれば2回目からも普通に動作するようになるでしょうか。
お願いします。
頭のある連結リストに対し、先頭の節点を削除する関数
void delete(list l);
を定義せよ。この関数は先頭を削除する関数であるが、リスト l の先頭の次を削除したい場合は delete(l->next)、さらにその次を削除したい場合はdelete(l->next->next) のようにすれば、先頭以外の位置のものも削除することができる。なお、メモリリーク)が起こらないように、不要になった節点のメモリは free 関数によって必ず解放する必要がある。作成すべきプログラムは、標準入力の 1 行目に与えられる文字列から char 型のリストを作成し、以降の入力の各行に与えられる「位置」に対し、その位置のアルファベットを削除するプログラムを作成せよ。「位置」は整数値で与えられ、0 番目が先頭を表すものとする。
実行例
>Bingo Bingo >2 Bigo >3 Big >Linked Linked >4 Linkd >4 Linkd >4 Linkd >4 Linkd >0 ink
発生している問題・エラーメッセージ
>Bingo Bingo >2 Bigo >3 Bi >0 iiiiiiiiiiiiiiiiiiiiiii.... >Linked Linked >4 Linkd >4 Linked >4 Linked >0 inkinkinkinkinkinkinkinkinkink........
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5 6typedef char elementtype; 7struct node { 8 elementtype element; 9 struct node* next; 10}; 11 12typedef struct node* list; 13 14struct node *initlist(elementtype e, struct node *x) { 15 struct node *n = (struct node *)malloc(sizeof(struct node)); 16 n->element = e; 17 n->next = x; 18 return n; 19} 20 21void insert(list *l, elementtype e) { 22 *l = initlist(e, *l); 23} 24 25void delete (list *l) { 26 if((*l)->next!=NULL){ 27 struct node *n=initlist(NULL,(*l)->next); 28 free(*l); 29 l=&n; 30 } 31} 32 33void printlist(list l) { 34 for( ; l != NULL; l=l->next) printf("%c", l->element); 35 printf("\n"); 36} 37 38int main() { 39 char buf[128]; 40 struct node head; 41 int i; 42 list l ; 43 fgets(buf, sizeof(buf), stdin); 44 int len = strlen(buf); 45 if(len>0 && buf[len-1]=='\n') buf[len-1] = '\0'; 46 47 head.next = NULL; 48 for(i=strlen(buf)-1; i>=0; i--) insert(&head.next, buf[i]); 49 50 printlist(head.next); 51 52 while(fgets(buf,sizeof(buf),stdin) != NULL) { 53 sscanf(buf,"%d",&i); 54 l = &head; 55 for(i; i>0 && l->next!=NULL; i--, l=l->next); 56 delete(&l->next); 57 printlist(head.next); 58 } 59 60 return 0; 61}
補足情報(FW/ツールのバージョンなど)
unix gcc 4.8.5

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