前提・実現したいこと
構造体を用いてテキストから要素を並べる単方向リストを作りました。
次は、再帰関数を用いて以下のように部分集合を出力するようにしたいです。
試行錯誤したのですが、うまくプログラムを組むことができません。
どうすればよいでしょうか?分かる方いましたら、回答をお願いします。
テキストの左は要素数 :以降が要素の数字となっています。
###期待する出力
{10 , 20 , 30} {10 , 20} {10 , 30} {10} {20 , 30} {20} {30} {}
###test3.txt
3: 10 30 20
該当のソースコード
c
1#include<stdio.h> 2#include<stdlib.h> 3 4typedef struct LISTNODE 5{ 6 int data; 7 int hantei; 8 struct LISTNODE *pNext; 9}ListNode; 10 11ListNode head; 12 13ListNode* getNode(int num){ 14 int i; 15 ListNode *retNode=&head; 16 17 for(i=0;i<num;i++){ 18 retNode=retNode->pNext; 19 if(retNode==NULL){ 20 return 0; 21 } 22 } 23 return retNode; 24} 25 26int checkNode(int num){ 27 ListNode *currentNode, *pCheckNode=getNode(num); 28 29 currentNode=head.pNext; 30 31 while(currentNode!=pCheckNode){ 32 if(currentNode->data==pCheckNode->data) 33 return 1; 34 currentNode=currentNode->pNext; 35 } 36 return 0; 37} 38 39void deleteNode(int num){ 40 ListNode *targetNode=getNode(num); 41 ListNode *pPrevNode=getNode(num-1); 42 pPrevNode -> pNext =targetNode -> pNext; 43 free(targetNode); 44} 45 46int swapNode(int num1, int num2){ 47 ListNode *node1=getNode(num1), *node2=getNode(num2); 48 ListNode *Prenode1=getNode(num1-1), *Prenode2=getNode(num2-1); 49 ListNode *tmpNext; 50 51 if(node1->pNext!=node2){ 52 tmpNext=node1->pNext; 53 node1->pNext=node2->pNext; 54 node2->pNext=tmpNext; 55 Prenode1->pNext=node2; 56 Prenode2->pNext=node1; 57 }else{ 58 node1->pNext=node2->pNext; 59 node2->pNext=node1; 60 Prenode1->pNext=node2; 61 } 62 return 1; 63} 64 65void printNode(ListNode *currentNode){ 66 if(currentNode!=NULL){ 67 if(currentNode->hantei!=1){ 68 printf("%d, ",currentNode->data); 69 } 70 printNode(currentNode->pNext); 71 } 72} 73 74int addNode(){ 75 ListNode *newNode, *pCheckNode, *pNextNode; 76 77 FILE *fp=fopen("test3.txt","r"); 78 if(!fp) return 0; 79 int k,c=0; 80 if (fscanf(fp, "%d:", &k) != 1) return 0; 81 int a[100]; 82 for (int i = 1; i <= k; i++) { 83 if (fscanf(fp, " %d", &a[i]) != 1) return 0; 84 //printf("a[%d] = %d\n", i, a[i]); 85 ListNode *pPrevNode=getNode(c); 86 newNode=(ListNode*)malloc(sizeof(ListNode)); 87 newNode->data=a[i]; 88 newNode->pNext=pPrevNode->pNext; 89 pPrevNode->pNext=newNode; 90 //printf("%d\n",checkNode(c+1)); 91 if(checkNode(c+1)==1){ 92 deleteNode(c+1); 93 continue; 94 } 95 c++; 96 //printf("c=%d\n",c); 97 } 98 99 fclose(fp); 100 101 int nodeNum, num=0; 102 ListNode *pEndNode=getNode(c); 103 while(num!=c){ 104 pCheckNode=head.pNext; 105 nodeNum=0; 106 while(pCheckNode->pNext!=NULL){ 107 pNextNode=pCheckNode->pNext; 108 nodeNum++; 109 if(pCheckNode->data>pNextNode->data) 110 swapNode(nodeNum, nodeNum+1); 111 else 112 pCheckNode=pCheckNode->pNext; 113 } 114 num++; 115 } 116 117 ListNode *currentNode=&head; 118 for(int i=c;i>0;i--){ 119 currentNode->hantei=0; 120 currentNode=currentNode->pNext; 121 for(int j=1;j<=2;j++){ 122 if(j==2) 123 currentNode->hantei=1; 124 printf("<"); 125 printNode(head.pNext); 126 printf(">\n"); 127 } 128 } 129 return 1; 130} 131 132int main(void){ 133 addNode(); 134 return 0; 135}
回答2件
あなたの回答
tips
プレビュー