前提・実現したいこと
単方向リストを用いた、集合の要素を表示するプログラムを作成しています。
テキストからファイルを読み取り、一番左が要素数、:以降がその要素の数字となっています。(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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。