こちらのコードの//リスト領域のアドレス設定からvoid foutの前までが何をしているのかわかりません。
細かく知りたいです。
よろしくお願いします。
C言語
1//リスト 2 3#include<stdio.h> 4#include<string.h> 5#include<stdlib.h> 6 7//コマンドに対応する関数のプロトタイプ宣言 8void fappend(), fout(), fdelete(), finsert(); 9 10//構造体LISTの宣言 11struct LIST {char *pname; struct LIST *pnext; }; 12 13//グローバル変数 14struct LIST *listtop; 15 16struct LIST *pwlist, *plistnow; 17 18char *pwname; 19 20int main(void) 21{ 22 23//コマンド名を記憶する配列comary[5][7] 24char comary[5][7]={"append","out","end","delete","insert"}; 25 26//コマンドを読み込む配列com[7] 27char com[7]; 28 29 30int i; 31 32//listtopの初期値 33 listtop=NULL; 34 35 36 37COMINPUT: 38//コマンドの入力 39 printf("コマンドを入力せよ\n"); 40 scanf("%s",com); 41 42//正しいコマンドか調べる 43 for(i=0; i<=4; i++){ 44 if(strcmp(com,comary[i])==0){ 45 goto COMCASE; 46 } 47 } 48 printf("未定義コマンド\n"); 49 goto COMINPUT; 50 51//コマンドに対応する関数を呼び出す 52COMCASE: 53 switch(i){ 54 case 0: fappend(); break; 55 case 1: fout(); break; 56 case 2: printf("***プログラムの終了***\n"); return 0; 57 case 3: fdelete(); break; 58 case 4: finsert(); break; 59 default: printf("***switch文のエラー***\n"); return 0; 60 } 61 62 63 goto COMINPUT; 64} 65 66void fappend() 67{ 68//データ領域の確保 69 pwname=(char *)malloc(20); 70 if(pwname==NULL){ 71 printf("データ領域が確保できなかった\n"); 72 return; 73 } 74 75//リスト領域の確保 76 pwlist=(struct LIST *)malloc(sizeof(struct LIST)); 77 if(pwlist==NULL){ 78 printf("リスト領域が確保できなった\n"); 79//データ領域の解放 80 free(pwname); 81 return; 82 } 83 84//追加する名前をデータ領域に読み込む 85 printf("追加する名前を入力せよ\n"); 86 scanf("%s",pwname); 87 88//リスト領域のアドレス設定 89 pwlist->pname=pwname; 90 pwlist->pnext=NULL; 91 92//名前が1つも記憶されていないか調べる 93 if(listtop==NULL){ 94 listtop=pwlist; 95 return; 96 } 97 98//リストをlisttopから辿って、最後のリスト領域を見つけ、接続する 99 plistnow=listtop; 100LOOP: 101 if(plistnow->pnext==NULL){ 102 plistnow->pnext=pwlist; 103 return; 104 } 105 106 plistnow=plistnow->pnext; 107 goto LOOP; 108} 109 110void fout() 111{ 112int i=1; 113 114 if(listtop==NULL){ 115 printf("名前が1つも記憶されていない\n"); 116 return; 117 } 118 119 plistnow=listtop; 120 121LOOP: 122 printf("No.%d %s\n",i,plistnow->pname); 123 if(plistnow->pnext==NULL){ 124 return; 125 } 126 127 plistnow=plistnow->pnext; 128 i++; 129 goto LOOP; 130} 131 132void fdelete() 133{ 134 135} 136 137void finsert() 138{ 139 140}
このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
わかりました
今編集しました
これで大丈夫でしょうか
goto だらけですね。アセンブラからベタ移植でもしたのでしょうか。
> 細かく知りたい
細かくコメントが書かれていますのに、何を細かく知りたいのでしょう。
すみません、私はコメントを見てもこのfappend関数でどうやって名前を追加するのかわからなったので質問したのですが、コメントをみればわかることなのですね、変な質問をして本当にすみませんでした。
プログラムは「何をするか」を並べたものです。ですから
「何をしているか」というのは見れば分かることです。
例えば「A=B;」とあれば「A に B の値を代入する」であることは c 言語を知っていれば分かります。
「if(A==NULL) { ~ }」であれば「A が NULLだったら ~ を実行する」ですね。
そして、これらの組み合わせで結局何をしているのかをコメントで書いてあります。「//リストをlisttopから辿って、最後のリスト領域を見つけ、接続する」などです。
さて、それでも分からないとなると、「リストを辿って」とはどういうことなのか、「リスト領域」とは?「接続」ってどういうイミ?…という、専門っぽい表現が分からないというレベルが想定されます。
いえ、もしかすると、「リスト」ってナニ? なぜそのようなものがある? というテツガク的な方向を指しているかも知れない…しかし、「コードのココからココまでを細かく知りたい」と仰る。
つまり、どうしたら解決するのかが分からないのです。
回答1件
あなたの回答
tips
プレビュー