私はCでプログラムを書いています。プログラムは標準入力からデータを含むファイルへのファイルパスを受け取ります。次に、リンクされたリストはデータから構築されます。リンクされたリストは簡潔にするために円形でなければなりません(ノードを追加してリストを印刷するために)私は循環リストを通常の非循環リンクリストに変換します。これはuncirc
機能で行われます。最後に、私はcirc
関数を使って循環構造にリストを戻します。main()から関数へのリンクリストポインタを渡すのがmainのリンクリストに影響するのはなぜですか?
リンクリストへのポインタを関数printList
に渡して、リストの内容を出力しています。しかし、printList
の中からuncirc
を使用した後、リストは実際にはメインでも「uncirc」のままです。私の知る限り、ポインタは値渡しであるので、リスト内の何かをprintList
の中に入れても元のリストには影響しないはずです。
コードは以下のとおりです(問題に関連する重要な機能のみが含まれています。そうでない場合はコードがかなり大きくなります)。私はあなたが環状構造であってもリストを簡単に印刷できると言ってもいいかもしれないが、元のリストがポインタから変更されているということは本当に気になるだろう。
#include <stdio.h>
#include <stdlib.h>
#define MAX_FILE_NAME_LEN 300
#define MAX_LINE_LEN 300
#define MATERIAL_LEN 100
#define FIELDS_IN_LIGHTING_NUM 8
enum l_type {
TABLE = 1, WALL, CEILING
};
typedef struct Lighting {
enum l_type type;
int length;
int width;
int height;
int bulbs;
char material[MATERIAL_LEN];
int strength;
struct Lighting * next;
} Lighting;
char * getFileName();
int getVolume(Lighting * light);
Lighting * uncirc(Lighting * light);
Lighting * circ(Lighting *light);
void addNode(Lighting **head, FILE *fd);
void printNode(Lighting * light);
void printList(Lighting * light);
int countLines(FILE *fd);
void printMaxLight(Lighting * light);
int main() {
FILE * fd;
char * path;
Lighting * n1 = NULL;
int linesInFile, lightNum, i;
path = getFileName();
if(!(fd = fopen(path, "r+"))) {
printf("Cannot open file %s\n", path);
fprintf(stderr, "Cannot open file %s\n", path);
exit(0);
}
linesInFile = countLines(fd);
lightNum = linesInFile/7;
for(i = 0; !(feof(fd)) && i < lightNum; i++) {
addNode(&n1, fd); //read file data and create node
//7 lines of data are required to create node
}
fclose(fd);
printList(n1); //print the linked list
return 0;
}
Lighting * uncirc(Lighting * light) {
Lighting * p = light;
if(p == NULL) {
return p;
}
while(p -> next != light) {
p = p -> next;
}
p -> next = NULL;
return light;
}
Lighting * circ(Lighting *light) {
Lighting * p = light;
if(p == NULL) {
return p;
}
while(p -> next != NULL) {
p = p -> next;
}
p -> next = light;
return light;
}
void printList(Lighting * light) {
Lighting * p;
p = uncirc(light);
if(p == NULL) {
printf("Empty list\n");
return;
}
while(p != NULL) {
printNode(p);
p = p -> next;
}
}
「リストは実際には「uncirc」のままであると主張しているとはどういう意味ですか?そして、 'uncirc'関数を使うのは、引数がすべて返ってきたときにどうしたらいいですか? – Jarvis
関連して、 'uncirc'の意味は疑問です。見た目では、列挙ループのためにリストの循環的な性質を破ることが唯一の目的であり、それはまさに列挙論理最初の場所でサークルを破った。 – WhozCraig
@WhozCraigあなたは正しいですが、私はこの問題に遭遇しましたが、それは私が理解するために重要です。 – Yos