前提・実現したいこと
単方向リストを作成しています。
やることとしては、テキストから要素数を読み取り、
:以降に書かれている要素を単方向のリストを用いて追加していき、昇順に出力するというものです。
途中、要素の数字が重複した場合は、リストから除外するようにプログラムを作成しているのですが、
重複を発見したときにプログラムが終了してしまいます。
どこが間違っているでしょうか?分かる方いましたら、回答をお願いします。
発生している問題・エラーメッセージ
k = 8 a[1] = 2 0 c=1 a[2] = 5 0 c=2 a[3] = 5 1
###test.txt
8: 2 5 5 3 3 7 5 7
該当のソースコード
c
1#include<stdio.h> 2#include<stdlib.h> 3 4typedef struct LISTNODE 5{ 6 int data; 7 struct LISTNODE *pNext; 8 struct LISTNODE *pPrev; 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 39int deleteNode(int num){ 40 ListNode *targetNode=getNode(num); 41 42 if(targetNode==NULL){ 43 return 0; 44 } 45 46 targetNode -> pPrev-> pNext =targetNode->pNext; 47 free(targetNode); 48 return 1; 49} 50 51int swapNode(int num1, int num2){ 52 ListNode *node1=getNode(num1), *node2=getNode(num2); 53 ListNode *tmpNext, *tmpPrev; 54 55 if(node1->pNext!=node2){ 56 tmpNext=node1->pNext; 57 58 node1->pNext=node2->pNext; 59 node1->pPrev->pNext=node2; 60 node2->pPrev->pNext=node1; 61 node2->pNext=tmpNext; 62 }else{ 63 node1->pPrev->pNext=node2; 64 node1->pNext=node2->pNext; 65 node2->pNext=node1; 66 } 67 return 1; 68} 69 70int addNode(){ 71 ListNode *newNode, *pCheckNode, *pNextNode; 72 73 FILE *fp=fopen("test1.txt","r"); 74 if(!fp) return 0; 75 int k,c=0; 76 if (fscanf(fp, "%d:", &k) != 1) return 0; 77 printf("k = %d\n", k); 78 int a[100]; 79 for (int i = 1; i <= k; i++) { 80 if (fscanf(fp, " %d", &a[i]) != 1) return 0; 81 printf("a[%d] = %d\n", i, a[i]); 82 ListNode *pPrevNode=getNode(c); 83 newNode=(ListNode*)malloc(sizeof(ListNode)); 84 newNode->data=a[i]; 85 newNode->pNext=pPrevNode->pNext; 86 pPrevNode->pNext=newNode; 87 printf("%d\n",checkNode(c+1)); 88 if(checkNode(c+1)==1){ 89 deleteNode(c+1); 90 continue; 91 } 92 c++; 93 printf("c=%d\n",c); 94 } 95 96 fclose(fp); 97 98 int nodeNum; 99 ListNode *pEndNode=getNode(c); 100 while(head.pNext!=pEndNode){ 101 pCheckNode=head.pNext; 102 nodeNum=0; 103 while(pCheckNode->pNext!=NULL){ 104 pNextNode=pCheckNode->pNext; 105 nodeNum++; 106 if(pCheckNode->data>pNextNode->data) 107 swapNode(nodeNum, nodeNum+1); 108 else 109 pCheckNode=pCheckNode->pNext; 110 } 111 pEndNode=pEndNode->pPrev; 112 } 113 114 ListNode *currentNode=head.pNext; 115 printf("<"); 116 for(;currentNode!=NULL;){ 117 if(currentNode->pNext==NULL) 118 printf("%d>",currentNode->data); 119 else 120 printf("%d, ",currentNode->data); 121 currentNode=currentNode->pNext; 122 } 123 printf("\nNumber of elements: %d",c); 124 125 return 1; 126} 127 128int main(void){ 129 addNode(); 130 return 0; 131}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。