我是c ++的新手,我正在尝试将我在python中创建的程序移植到c ++。我有一个结构,它是一个包含部件列表的链表。这些部件中的每一个都包含一个或多个部件。所以我试图创建两个结构,其中一个结构链接到另一个结构。
但我似乎没有将list_part链接到component_list。
struct list_part {
char partname[100];
int parttype;
component_list * comp;
list_part * next;
};
struct component_list {
char compname[100];
component_list * next;
};
我使用以下函数将部件添加到列表的底部。
void addpart(char partname[], int parttype, component_list *newcomp) {
struct list_part *temppart;
struct list_part *currentpart;
temppart = (struct list_part *)malloc(sizeof(struct list_part));
strcpy_s(temppart->partname,partname);
temppart->parttype = parttype;
temppart->comp = newcomp;
currentpart = head;
if (head == NULL) {
head = temppart;
head->next = NULL;
} else {
while (currentpart->next != NULL) {
currentpart = currentpart->next;
}
temppart->next = NULL;
currentpart->next = temppart;
}
}
将组件添加到列表中的类似功能。
void addcomp(char compname[]) {
struct component_list *tempcomp;
struct component_list *currentcomp;
tempcomp = (struct component_list *)malloc(sizeof(struct list_part));
strcpy_s(tempcomp->compname,compname);
currentcomp = newcomp;
if (currentcomp == NULL) {
currentcomp = tempcomp;
currentcomp->next = NULL;
} else {
while (currentcomp->next != NULL) {
currentcomp = currentcomp->next;
}
tempcomp->next = NULL;
currentcomp->next = tempcomp;
}
}
当零件中的第一个零件存在时,我尝试添加它。
struct component_list *newcomp = NULL;
strcpy_s(compname,temp.c_str());
addcomp(compname);
以及我计划用这些命令添加的其他组件
strcpy_s(compname,temp.c_str());
addcomp(compname);
最后,这是作为
的一部分添加的addpart(partname,fluidname, parttype, newcomp);
当我这样做时,newcomp只返回00000000,但我需要它返回一个指向列表的指针,该指针包含该部分的组件。我不知道如何真正做到这一点,我已经习惯了动态语言,这不是一个问题。我认为这是解决这个问题的最好方法,但我对其他解决方案的建议非常开放。因为数据结构是我非常新鲜的东西。
答案 0 :(得分:6)
由于您愿意接受建议,我认为最好的建议是您应该使用 std::list。而不是您自己的链接列表实现。
std :: list 是C ++标准库提供的随时可用的STL容器,它总是比您编写的任何列表实现更高效。
答案 1 :(得分:0)
你在addcomp函数中有2个大错误,这应该有效:(也移动了一些东西)
void addcomp(char compname[]) {
struct component_list *tempcomp;
struct component_list *currentcomp;
tempcomp = (struct component_list *)malloc(sizeof(struct component_list/*FIX 1*/));
strcpy_s(tempcomp->compname,compname);
tempcomp->next = NULL; /*Better do it here*/
if (newcomp == NULL) {
newcomp = tempcomp;/*FIX 2*/
} else {
currentcomp = newcomp; /*Better do it here*/
while (currentcomp->next != NULL) {
currentcomp = currentcomp->next;
}
currentcomp->next = tempcomp;
}
}