C言語にてリスト構造をつくり、1行の入力文字列をリスト化するというプログラムを作りました。
さらに入力されたリストの先頭の要素と、先頭と同じ要素をもつものを削除する関数remove_1st()とremove()を作りましたが、うまく機能しません。
わかる方、教えてください。
また、実現したい実行例は以下のとおりです。
bash
1./a.out 11414211356 2442356 3$ ./a.out aiueokakikukeko 4iueokkikukeko
実際に実行すると以下のようになります
削除する文字列が連続していない場合はうまく表示されるのですが、削除する文字列が連続している場合、うまく表示しません。
bash
1$ ./a.out 11414211356 214421356 3$ ./a.out aiueokakikukeko 4iueokkikukeko
C
1#include <stdio.h> 2#include <stdlib.h> 3 4struct node{ 5 char element; 6 struct node *next; 7}; 8 9 10struct node *initlist() { 11 struct node *n; 12 n=(struct node *)malloc(sizeof(struct node)); 13 n->next=NULL; 14 return n; 15} 16void insert(struct node *p, char x) { 17 struct node *n; 18 n=(struct node *)malloc(sizeof(struct node)); 19 while(p->next){ 20 p=p->next; 21 } 22 n->element=x; 23 n->next = NULL; 24 p->next=n; 25} 26 27 28void printlist(struct node *p) { 29 p = p->next; 30 while (p) { 31 putchar(p->element); 32 p = p->next; 33 } 34 putchar('\n'); 35} 36 37 38void delete(struct node *p){ 39 if(p->next!=NULL){ 40 p->next=p->next->next; 41 } 42} 43 44void remove_1st(struct node *p) { 45 char start=p->next->element; 46 struct node *tmp; 47 while(p->next!=NULL){ 48 //tmp=p; 49 50 if(p->next->element==start){ 51 52 delete(p); 53 } 54 p=p->next; 55 } 56} 57 58int main(int argc, char *argv[]) { 59 struct node *list, *head; 60 char *p; 61 62 if (argc<2) 63 exit(-1); 64 65 list = initlist(); 66 p = argv[1]; 67 for (; *p; p++) 68 insert(list, *p); 69 70 remove_1st(list); 71 printlist(list); 72 73 for (; list; ) { 74 head = list; 75 list = list->next; 76 free(head); 77 } 78 return 0; 79} 80
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。