我有一份全球清单
typedef struct center {
char center_name[100];
char hostname[100];
int port;
struct center *next_center;
} center;
所以当我开始时:
int main(int argc, char** argv) {
center *head = null;
parse(argv, &head);
}
解析:
void parser (char** argv, center **head) {
//read a file amd add the elements to a newCenter
addToCenterList(newcenter, head);
}
其中addToCenterList:
void addToCenterList(center *newcenter, center **head) {
center *newNode = malloc(sizeof(center));
strcpy(newNode->center_name, newcenter->center_name);
strcpy(newNode->hostname, newcenter->hostname);
newNode->port = newcenter->port;
newcenter->next_center = NULL;
if (*head == NULL)
*head = newNode;
else {
//problem starts here, it never adds after the first element
center **iterator;
center ite;
iterator = head;
ite = **iterator;
while(1){
if(ite.next_center == NULL){
*ite.next_center = *newNode;
break;
}
}
}
我的问题始于其他: 我正在通过列表头部的地址。 所以我知道我需要一个允许在列表中移动的变量。 我尝试过很多东西但没有工作。 我想到了:遍历列表并将每个“节点”的地址存储在某个变量中,如果该地址的内容(节点!),则next_center是== NULL,那么我会停止查找,因为那是最后一个元素 然后我会给next_center地址分配一个新内容。
这就是我想要做的事情。我不知道如何让它发挥作用....
提前谢谢。答案 0 :(得分:1)
void addToCenterList(center *newcenter, center **head) {
center *newNode ;
while (*head ) { head = &(*head)->next_center; }
*head = newNode = malloc(sizeof *newNod);
strcpy(newNode->center_name, newcenter->center_name);
strcpy(newNode->hostname, newcenter->hostname);
newNode->port = newcenter->port;
/* Note the next line:
** the OP assigned not to newNode, but to newcenter,
** which appears to be
** "read-only" source data element
*/
newNode->next_center = NULL;
}
答案 1 :(得分:0)
删除addToCenterList最后几行中的星号,看看会发生什么。
item *k = &head;
while (*k != NULL)
k = &((*k)->next);
item e = calloc(1, sizeof(struct element));
if (!e) {// calloc didn't work
// error handling
}
e->value = value;
*k = e;
请注意item
的类型为指针:
struct element {
int value;
struct element * next;
};
typedef struct element * item;
你必须根据你的实现进行调整(在那里添加一些星号,然后在这里删除一些星号)。
而星号声明是因为它导致错误:你无法分配整个structs
,这就是为什么你应该用指针代替它。
答案 2 :(得分:0)
while(1){
if(ite.next_center == NULL){
*ite.next_center = *newNode;
break;
}
}
如果你的迭代器是最后一个元素,那么这个循环会考虑怎么做,但如果不是,那么该怎么做。您需要添加else { ite = ite->next;}
或类似的东西,以便您继续遍历列表,直到找到结束。
第二个问题,也许更重要的是,你正在修改列表的副本。
center ite;
...
ite = **iterator;
这将创建list元素的副本。然后分配给此副本,并在块的末尾销毁副本。
使用
修复此问题center *ite;
...
ite = *iterator;
这将插入第二个元素(在while(1)循环中修复语法),然后插入第三个元素将导致无限循环,因为第一个提到的问题。