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

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

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

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

Q&A

解決済

1回答

698閲覧

単方向リストを用いたプログラムを作成したい

katkey

総合スコア15

C

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

0グッド

0クリップ

投稿2021/02/06 10:50

前提・実現したいこと

単方向リストを作成しています。
やることとしては、テキストから要素数を読み取り、
:以降に書かれている要素を単方向のリストを用いて追加していき、昇順に出力するというものです。
途中、要素の数字が重複した場合は、リストから除外するようにプログラムを作成しているのですが、
重複を発見したときにプログラムが終了してしまいます。
どこが間違っているでしょうか?分かる方いましたら、回答をお願いします。

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

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}

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

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

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

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

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

guest

回答1

0

ベストアンサー

addNode でノードを確保した時、pPrev には何も設定せず、
deleteNode で pPrev を参照しています。

投稿2021/02/06 13:54

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問