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

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

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

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

Q&A

解決済

1回答

635閲覧

単方向リストを用いた差集合を求めるプログラムにおいて結果が正しく表示されない

katkey

総合スコア15

C

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

0グッド

0クリップ

投稿2021/02/07 13:03

前提・実現したいこと

単方向リストを用いた、集合の要素を表示するプログラムを作成しています。
テキストからファイルを読み取り、一番左が要素数、:以降がその要素の数字となっています。(Aが1行目、Bが2行目です)
AとBの差集合を求めるgetDifferenceにおいて、プログラムが終了してしまいます。
差集合の作り方としては、和集合からBの集合の要素(このプログラムでは配列bに格納)を引くことで得られると考えました。
差集合までは作れているのですが、その後の表示に失敗してしまいます。
どのようにすればよいでしょうか?分かる方いましたら、回答をお願いします。

発生している問題・エラーメッセージ

A = <1, 4, 5, 7, 9, 10> B = <3, 5, 8, 10, 12> Union of A and B = <1, 3, 4, 5, 7, 8, 9, 10, 12> Intersection of A and B = <5 ,10> b[1]:3 現在のノード:1 現在のノード:4 現在のノード:5 現在のノード:7 現在のノード:8 現在のノード:9 現在のノード:10 現在のノード:12 b[2]:5 現在のノード:1 現在のノード:4 現在のノード:7 現在のノード:8 現在のノード:9 現在のノード:10 現在のノード:12 b[3]:8 現在のノード:1 現在のノード:4 現在のノード:7 現在のノード:9 現在のノード:10 現在のノード:12 b[4]:10 現在のノード:1 現在のノード:4 現在のノード:7 現在のノード:9 現在のノード:12 b[5]:12 現在のノード:1 現在のノード:4 現在のノード:7 現在のノード:9

###test2.txt

8: 7 1 9 7 7 5 4 10 10: 5 5 10 8 3 8 3 12 10 8

該当のソースコード

c

1#include<stdio.h> 2#include<stdlib.h> 3 4typedef struct LISTNODE 5{ 6 int data; 7 struct LISTNODE *pNext; 8}ListNode; 9 10ListNode head; 11 12int c, a[256], b[256]; 13 14ListNode* getNode(int num){ 15 int i; 16 ListNode *retNode=&head; 17 18 for(i=0;i<num;i++){ 19 retNode=retNode->pNext; 20 if(retNode==NULL){ 21 return 0; 22 } 23 } 24 return retNode; 25} 26 27int checkNode(ListNode *pCheckNode){ 28 ListNode *currentNode=head.pNext; 29 30 while(currentNode!=pCheckNode){ 31 if(currentNode->data==pCheckNode->data) 32 return 1; 33 currentNode=currentNode->pNext; 34 } 35 return 0; 36} 37 38void deleteNode(ListNode *pPrevNode){ 39 ListNode *targetNode=pPrevNode->pNext; 40 pPrevNode -> pNext =targetNode -> pNext; 41 free(targetNode); 42} 43 44int swapNode(int num1, int num2){ 45 ListNode *node1=getNode(num1), *node2=getNode(num2); 46 ListNode *Prenode1=getNode(num1-1), *Prenode2=getNode(num2-1); 47 ListNode *tmpNext; 48 49 if(node1->pNext!=node2){ 50 tmpNext=node1->pNext; 51 node1->pNext=node2->pNext; 52 node2->pNext=tmpNext; 53 Prenode1->pNext=node2; 54 Prenode2->pNext=node1; 55 }else{ 56 node1->pNext=node2->pNext; 57 node2->pNext=node1; 58 Prenode1->pNext=node2; 59 } 60 return 1; 61} 62 63int addNode(){ 64 FILE *fp=fopen("test2.txt","r"); 65 for(int i=0;i<2;i++){ 66 int k; 67 c=0; 68 ListNode *newNode, *pCheckNode, *pNextNode; 69 if(!fp) return 0; 70 if (fscanf(fp, "%d:", &k) != 1) return 0; 71 for (int j = 1; j <= k; j++) { 72 if (fscanf(fp, " %d", &a[j]) != 1) return 0; 73 ListNode *pPrevNode=getNode(c); 74 newNode=(ListNode*)malloc(sizeof(ListNode)); 75 newNode->data=a[j]; 76 newNode->pNext=pPrevNode->pNext; 77 pPrevNode->pNext=newNode; 78 if(checkNode(newNode)==1){ 79 deleteNode(pPrevNode); 80 continue; 81 } 82 c++; 83 b[c]=(pPrevNode->pNext)->data; 84 //printf("b[%d]:%d\n",c,b[c]); 85 } 86 87 int nodeNum, num=0; 88 ListNode *pEndNode=getNode(c); 89 while(num!=c){ 90 pCheckNode=head.pNext; 91 nodeNum=0; 92 while(pCheckNode->pNext!=NULL){ 93 pNextNode=pCheckNode->pNext; 94 nodeNum++; 95 if(pCheckNode->data>pNextNode->data) 96 swapNode(nodeNum, nodeNum+1); 97 else 98 pCheckNode=pCheckNode->pNext; 99 } 100 num++; 101 } 102 103 ListNode *currentNode=head.pNext; 104 if(i==0){ 105 printf("A = <"); 106 for(;currentNode!=NULL;){ 107 if(currentNode->pNext==NULL) 108 printf("%d>\n",currentNode->data); 109 else 110 printf("%d, ",currentNode->data); 111 currentNode=currentNode->pNext; 112 } 113 } 114 115 for (int m=0; m<c; ++m) { 116 for (int l=m+1; l<c; ++l) { 117 if (b[m] > b[l]) { 118 int tmp = b[m]; 119 b[m] = b[l]; 120 b[l] = tmp; 121 } 122 } 123 } 124 125 if(i==1){ 126 printf("B = <"); 127 for(int x=1;x<=c;x++){ 128 if(x==c) 129 printf("%d>\n",b[x]); 130 else 131 printf("%d, ",b[x]); 132 } 133 } 134 } 135 fclose(fp); 136 return 0; 137} 138 139int getUnion(ListNode *currentNode){ 140 printf("Union of A and B = <"); 141 for(;currentNode!=NULL;){ 142 if(checkNode(currentNode)==0){ 143 if(currentNode->pNext==NULL) 144 printf("%d>\n",currentNode->data); 145 else 146 printf("%d, ",currentNode->data); 147 } 148 currentNode=currentNode->pNext; 149 } 150 return 0; 151} 152 153int getIntersect(ListNode *currentNode){ 154 int count=0; 155 printf("Intersection of A and B = <"); 156 for(;currentNode!=NULL;){ 157 if(currentNode->pNext==NULL){ 158 printf(">\n"); 159 break; 160 } 161 if(checkNode(currentNode)==1){ 162 if(count!=0) 163 printf(" ,"); 164 printf("%d",currentNode->data); 165 count++; 166 } 167 currentNode=currentNode->pNext; 168 } 169 return 0; 170} 171 172int getDifference(){ 173 for(int i=1; i<=c; i++){ 174 printf("b[%d]:%d\n",i,b[i]); 175 ListNode *pPrevNode=&head; 176 while(pPrevNode->pNext!=NULL){ 177 if(checkNode(pPrevNode->pNext)==1 || b[i]==(pPrevNode->pNext)->data) 178 deleteNode(pPrevNode); 179 pPrevNode=pPrevNode->pNext; 180 printf("現在のノード:%d\n",pPrevNode->data); 181 //if(i==c && pPrevNode==NULL) break; 182 } 183 } 184 185 ListNode *currentNode=head.pNext; 186 printf("Difference of A and B = <"); 187 for(;currentNode!=NULL;){ 188 if(currentNode->pNext==NULL) 189 printf("%d>\n",currentNode->data); 190 else 191 printf("%d, ",currentNode->data); 192 currentNode=currentNode->pNext; 193 } 194 return 0; 195} 196 197int main(void){ 198 addNode(); 199 getUnion(head.pNext); 200 getIntersect(head.pNext); 201 getDifference(); 202 return 0; 203}

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

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

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

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

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

guest

回答1

0

自己解決

c

1 for(int i=1; i<=c; i++){ 2 //printf("b[%d]:%d\n",i,b[i]); 3 ListNode *pPrevNode=&head; 4 while(pPrevNode->pNext!=NULL){ 5 if(checkNode(pPrevNode->pNext)==1 || b[i]==(pPrevNode->pNext)->data) 6 deleteNode(pPrevNode); 7 if(pPrevNode->pNext!=NULL)pPrevNode=pPrevNode->pNext; //改善した部分 8 //printf("現在のノード:%d\n",pPrevNode->data); 9 } 10 }

取り除くノードが最後のノードだった場合、pPrevNodeの次のノードが存在しないことになってしまい、pNextを定義することができないことが原因だったようです。

投稿2021/02/07 21:44

katkey

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問