我正在C中使用插入和打印功能的链表。然而,我从插入中得到一个分段错误,当我试图修复这个问题时,我最终从打印函数中得到一个。如有任何帮助,我将不胜感激。
typedef struct node
{
struct node *next;
double value;
} NodeT, *NodeTP;
int listSize = 0;
int insert(NodeT *firstEle, int value)
{
NodeTP temp;
if((temp = (NodeTP)malloc(sizeof(NodeT))) == NULL)
{
return 0;
}
// first node in the list.
if(listSize == 0)
{
firstEle->value = value;
firstEle->next = NULL;
}
// finds the end node and adds the new node to the list.
else
{
while(temp != NULL)
{
temp = temp->next;
}
temp->value = value;
temp->next = firstEle;
firstEle = temp;
}
listSize++;
return 1;
}
int print(NodeT List)
{
printf("Element: %.2fn", List.value);
return 1;
}
int main(int argc, char* argv[])
{
// creates the list.
NodeTP list;
if((list = (NodeTP)malloc(sizeof(NodeT))) == NULL)
{
return 0;
}
list = NULL;
insert(list, 5);
print(list[0]);
insert(list, 15);
print(list[1]);
return EXIT_SUCCESS;
}
打印问题
当涉及到print语句时,您正在使用无效的语法。您创建了一个指针,并为该指针及其指向的对象分配了足够的内存。您没有创建NodeT元素数组。因此,list[x]
将无法工作。
您将需要生成一个函数,该函数将在您正在制作的列表中定位'x'元素。你可以把它包含在你写的print
函数中。只要把它改成你想要的元素的整型:
int print(NodeT head, int element) {}
不要忘记检查边界,以防被请求的元素超出当前范围。
你真正需要做的就是逐级逐级找到你想要的元素。
<<p> 插入问题/strong>在你的if/else语句中,为什么你要尝试遍历'temp'?'temp'是在这个函数中创建的,它不应该附加任何其他元素。你应该遍历'firstEle'。你也不想设置firstEle = temp;
,因为它会覆盖之前的内容,而你现在指向其他内容。
简化这段代码的一种方法是使用头部和尾部。头部永远不会改变,但尾巴会随着元素的增加而移动。你可以让'insert'返回尾部,当你插入一个新元素时,只需提供尾部,新元素就会被添加到那里,不需要迭代。
内存问题
虽然这对这个程序来说不是很重要,但我将调整malloc新节点的位置,直到我确保它不是第一个元素。否则,将分配一个从未使用过的块。或者,如果这是要添加的第一个元素,则释放该块。
Fred说得很好。
多个问题(列表远未完成):
- 您缺少
malloc()
和printf()
的包含文件。 - 在
main()
中分配内存,但不使用它。 - 如果你想修改
insert()
中的列表头,你必须传递一个指向它的指针。 - 你检查
insert()
的内存分配是否成功,但不处理它不成功的情况-所以你也可以直接摆脱它。 - 当您忽略
insert()
和print()
的返回值时,您也可以将其返回类型更改为void
。 - 在搜索列表的最后一个元素时,覆盖指针(
temp
)到刚刚分配的内存。 - 当你认为你已经找到了最后一个元素时,你实际上使新元素的下一个点指向它,并设置第一个元素指向新元素,这将使它有效地成为第一个元素而不是最后一个元素(如果所有其他的东西都能工作…)
- 您正在尝试使用数组样式访问列表[]。你必须使用指针。
这是一个版本,我修复了至少最基本的错误,以使其编译和至少工作。它还远远不够完美(甚至可以接受),但我尽量少做改变,让你更容易发现差异,了解你做错了什么,并从那里进一步改进。
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
struct node *next;
double value;
} NodeT, *NodeTP;
int listSize = 0;
int insert(NodeT **firstEle, int value)
{
NodeTP temp, lastEle;
temp = (NodeTP)malloc(sizeof(NodeT));
// first node in the list.
if(listSize == 0)
{
temp->value = value;
temp->next = NULL;
*firstEle = temp;
}
// finds the end node and adds the new node to the list.
else
{
for (lastEle = *firstEle;lastEle->next != NULL;lastEle = lastEle->next);
temp->value = value;
temp->next = NULL;
lastEle->next = temp;
}
listSize++;
return 1;
}
int print(NodeT List)
{
printf("Element: %.2fn", List.value);
return 1;
}
int main(int argc, char* argv[])
{
// creates the list.
NodeTP list;
list = NULL;
insert(&list, 5);
print(*list);
insert(&list, 15);
print(*list->next);
return EXIT_SUCCESS;
}