将链表传递给 struct 函数我做错了什么?
Pass linked list to function with struct what I doing wrong?
我想将喜欢的列表传递给函数并创建新列表。我需要一些帮助来了解我做错了什么。
我创建新指针并将指针复制到列表中的“curr”和 运行 并内置。
我试着找出我在哪一步做错了。我已经尝试调试程序了。
结构是简单的结构如果i、j和矩阵A的值是算术级数它们被添加到列表中。
int createList(int A[][COLS], list** lst, int rows, int cols)
{
// your code:
*lst = (list*)calloc(1, sizeof(list));
list* curr = *lst;
int i, j;
int counter = 0;
int d;
int check = 0;
int j_i;
int A_j;
four new_four;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
j_i = j - i;
A_j = A[i][j] - j;
if (j_i == A_j) {
d = j-i;
new_four = createFour(i, j, d, A[i][j]);
if (counter == 0) {
curr = createElement(new_four);
}
counter++;
curr->next = createElement(new_four);
curr = curr->next;
}
}
}
curr->next = NULL;
return counter;
}
// 使用所有参数创建新对象
four createFour(int i, int j, int d, int value)
{
four new_f;;
new_f.d = d;
new_f.i = i;
new_f.j = j;
new_f.value = value;
return new_f;
}
// 使用列表中的数据创建新元素
list* createElement(four data)
{
// your code:
list* new_Element = (list*)calloc(1, sizeof(list));
new_Element->data = data;
new_Element->next = (list*)calloc(1, sizeof(list));
return new_Element;
}
问题是您实际上并没有通过 lst
参数传回列表。您正在分配一个值并正确存储它,但随后没有使用该值来添加您想要的所有数据,因为您从未真正使用过它,而是创建了一个完全不同的列表,这会导致内存泄漏。
问题归结到这部分
if (counter == 0) {
curr = createElement(new_four);
}
counter++;
curr->next = createElement(new_four);
curr = curr->next;
当 counter
为 0 时,您创建了一个新列表的开始 - 这是您要存储到 *lst
中以传递回调用代码的值。
当我想您只需要 1 个时,您还创建了 2 个节点。
只要稍作调整,您就会得到想要的结果。
if (counter == 0) {
*lst = curr = createElement(new_four);
} else {
curr->next = createElement(new_four);
curr = curr->next;
}
counter++;
您还需要删除函数开头的这一行,因为不需要它
*lst = (list*)calloc(1, sizeof(list));
并且您也不需要在这里将 *lst
分配给 curr
,因为它是稍后启动的
list* curr = *lst;
我想将喜欢的列表传递给函数并创建新列表。我需要一些帮助来了解我做错了什么。 我创建新指针并将指针复制到列表中的“curr”和 运行 并内置。 我试着找出我在哪一步做错了。我已经尝试调试程序了。
结构是简单的结构如果i、j和矩阵A的值是算术级数它们被添加到列表中。
int createList(int A[][COLS], list** lst, int rows, int cols)
{
// your code:
*lst = (list*)calloc(1, sizeof(list));
list* curr = *lst;
int i, j;
int counter = 0;
int d;
int check = 0;
int j_i;
int A_j;
four new_four;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
j_i = j - i;
A_j = A[i][j] - j;
if (j_i == A_j) {
d = j-i;
new_four = createFour(i, j, d, A[i][j]);
if (counter == 0) {
curr = createElement(new_four);
}
counter++;
curr->next = createElement(new_four);
curr = curr->next;
}
}
}
curr->next = NULL;
return counter;
}
// 使用所有参数创建新对象
four createFour(int i, int j, int d, int value)
{
four new_f;;
new_f.d = d;
new_f.i = i;
new_f.j = j;
new_f.value = value;
return new_f;
}
// 使用列表中的数据创建新元素
list* createElement(four data)
{
// your code:
list* new_Element = (list*)calloc(1, sizeof(list));
new_Element->data = data;
new_Element->next = (list*)calloc(1, sizeof(list));
return new_Element;
}
问题是您实际上并没有通过 lst
参数传回列表。您正在分配一个值并正确存储它,但随后没有使用该值来添加您想要的所有数据,因为您从未真正使用过它,而是创建了一个完全不同的列表,这会导致内存泄漏。
问题归结到这部分
if (counter == 0) {
curr = createElement(new_four);
}
counter++;
curr->next = createElement(new_four);
curr = curr->next;
当 counter
为 0 时,您创建了一个新列表的开始 - 这是您要存储到 *lst
中以传递回调用代码的值。
当我想您只需要 1 个时,您还创建了 2 个节点。
只要稍作调整,您就会得到想要的结果。
if (counter == 0) {
*lst = curr = createElement(new_four);
} else {
curr->next = createElement(new_four);
curr = curr->next;
}
counter++;
您还需要删除函数开头的这一行,因为不需要它
*lst = (list*)calloc(1, sizeof(list));
并且您也不需要在这里将 *lst
分配给 curr
,因为它是稍后启动的
list* curr = *lst;