>我正在尝试创建一个空节点,而不会影响指向连接列表/节点头部的指针。那么,我的代码有任何问题吗?
CellPtr Create_Node(CellPtr created, int size)
{
CellPtr head;
int i;
if((created=(CellPtr)malloc(sizeof(Cell)))==NULL)
{
printf("Allocation Error");
exit(1);
}
head=created;
for(i=0; i<size-1; i++)
{
if((created->next=(CellPtr)malloc(sizeof(Cell)))==NULL)
{
printf("Allocation Error");
exit(1);
}
created=created->next;
}
created->next=NULL;
return head;
}
问题是您传入created
但立即覆盖它。我不知道为什么created
被传递进来。
您似乎正在尝试创建一个包含size
+ 1 个空单元格的新链表。我建议将其分成两部分,一部分用于创建一个空单元格,另一部分用于添加空单元格。
从风格上讲,指针类型令人困惑。它打破了*
表示指针的简单视觉惯例。让我们摆脱它。
typedef struct _Cell {
struct _Cell *next;
} Cell;
然后我们有一个函数来制作和初始化一个空单元格。这耗尽了代码。并且不要施放马洛克。
Cell *CreateCell() {
Cell *cell = malloc(sizeof(Cell));
if( cell == NULL ) {
fprintf(stderr, "Allocation of Cell failed");
exit(1);
}
cell->next = NULL;
return cell;
}
然后是一个单独的函数,用于将空单元格添加到现有单元格。我决定退回新的尾巴,因为这似乎很有用。
Cell *AddCells(Cell *tail, size_t num_cells) {
for(size_t i = 0; i < num_cells; i++) {
tail->next = CreateCell();
tail = tail->next;
}
return tail;
}
现在我们可以创建一个单元格,添加到它,并在需要时有效地拥有新的尾巴。
Cell *head = CreateCell();
Cell *tail = AddCells(head, 5);
我们可以将单元格添加到任何现有链表的尾部。