以下の入力による命令が線形リストに反映されるプログラムを作りたいです。
0 :終了
1 :リスト表示
2 num val :リストのnum番目に値valを追加
3 num :リストのnum番目を削除
また、追加と削除に関しては、成功したとき1、失敗したとき0を返すようにする必要があります。
リストの終了(0)、表示(1)、削除(3)はできています。追加が上手くいきません。
追加の命令(2 1 1など)をしたあと、リスト表示を行っても何も表示されませんので、上手く追加ができていないのだと思います。
コードはこちらになります。テンプレートとして用意されたものを使用していますので、私が書いたのはaddNode、deleteNode、showList関数内のみです。今回は追加が上手くいきませんので、addNode関数内のみ見ていただければと思います。
どうぞよろしくお願いいたします。
html
1#include <stdio.h> 2#include <stdlib.h> 3 4#define FAIL_RETURN(flg,message) if(!(flg)){printf("%s",message);freeList();exit(1);} 5 6typedef struct LISTNODE { 7 int data; 8 struct LISTNODE *pNext; 9} ListNode; 10 11ListNode rootNode; 12 13int addNode(int num, int val){ 14 /*write your program.*/ 15 ListNode *pPrevNode = &rootNode; 16 ListNode *pNewNode = (ListNode*)malloc(sizeof(ListNode)); 17 pNewNode -> data = val; 18 pNewNode -> pNext = NULL; 19 20 int Pos=1; 21 pPrevNode = pPrevNode -> pNext; 22 while(pPrevNode != NULL){ 23 pPrevNode = pPrevNode -> pNext; 24 Pos++; 25 } 26 27 pPrevNode = &rootNode; 28 29 if(num <= Pos+1){ 30 31 int pos=1; 32 while(pos<num){ 33 pPrevNode = pPrevNode->pNext; 34 pos++; 35 } 36 37 pNewNode -> pNext = pPrevNode->pNext; 38 pPrevNode-> pNext = pNewNode; 39 40 return 1; 41 }else 42 { 43 return 0; 44 } 45} 46 47int deleteNode(int num){ 48 /*write your program.*/ 49 50 ListNode *nNode = &rootNode; 51 int Pos=1; 52 nNode = nNode -> pNext; 53 while(nNode != NULL){ 54 nNode = nNode -> pNext; 55 Pos++; 56 } 57 58 if(num<=Pos){ 59 60 Pos=1; 61 ListNode *Node = &rootNode; 62 /*削除するノードのひとつ前まで進める*/ 63 while(Pos<num){ 64 Node = Node->pNext; 65 Pos++; 66 } 67 68 69 ListNode *Node2 = &rootNode; 70 Pos = 1; 71 /*削除するノードまで進める*/ 72 while(Pos <= num){ 73 Node2 = Node2->pNext; 74 Pos++; 75 } 76 77 /*前の要素のpNextに削除される要素のpNextをコピー*/ 78 Node->pNext = Node2->pNext; 79 80 free(Node2); 81 return 1; 82 }else 83 { 84 return 0; 85 } 86 87 } 88 89void showList(void) { 90 /*write your program.*/ 91 ListNode *Node; 92 Node = &rootNode; 93 Node = rootNode.pNext; 94 if(Node != NULL){ 95 if(Node->pNext != NULL){ 96 printf("%d", Node->data);} 97 98 Node = Node->pNext; 99 while(Node != NULL){ 100 printf(" %d", Node->data); 101 Node = Node->pNext; 102 } 103 printf("\n"); 104 } 105 106} 107 108void freeList(void) { 109 ListNode *currentNode = rootNode.pNext; 110 ListNode *tmp; 111 112 for (;currentNode != NULL;) { 113 tmp = currentNode; 114 currentNode = currentNode -> pNext; 115 free(tmp); 116 } 117} 118 119 120int main(void) { 121 int op, num, val; 122 char message[256]; 123 124 rootNode.data = 0; 125 rootNode.pNext = NULL; 126 127 128 129 /*addNodeが使えないので確認用 130 ListNode node1, node2, node3; 131 rootNode.pNext = &node1; 132 node1.pNext = &node2; 133 node2.pNext = &node3; 134 node3.pNext = NULL; 135 node1.data = 10; 136 node2.data = 20; 137 node3.data = 30;*/ 138 139 while (scanf("%d", &op), op) { 140 switch (op) { 141 case 1: 142 showList(); 143 break; 144 case 2: 145 scanf("%d%d", &num, &val); 146 sprintf(message, "error in addNode(%d, %d)\n", num, val); 147 FAIL_RETURN(addNode(num, val), message) 148 break; 149 case 3: 150 scanf("%d", &num); 151 sprintf(message, "error in deleteNode(%d)\n", num); 152 FAIL_RETURN(deleteNode(num), message) 153 break; 154 } 155 } 156 157 freeList(); 158 159 return 0; 160}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/06 03:59
2020/01/06 04:18