我正在用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'函数有什么意义? – Jarvis
相关,'uncirc'的含义是有问题的,因为从它的外观来看,唯一的目的是打破枚举循环的列表的循环性质,枚举循环可以像枚举逻辑一样完成这首先打破了这个圈子。 – WhozCraig
@WhozCraig你是对的,但后来我偶然发现了这个对我来说很重要的问题。 – Yos