在c中单独列出插入函数
Singly list insert function in c
我正在尝试为简单链表编写一些函数。这个应该在列表之间的某处添加一个节点。用户在列表的头部放入应该在此时保存的数据 "c" 和一个作为保存索引的 int "x"。但它基本上什么都不做,我不确定为什么。也许有人能看出错误。
第一个 if 语句只是检查索引是否是列表的一部分。
DoubleNode *insert(DoubleNode *head, double c, int x)
{
int i;
DoubleNode *cursor, *tmp, *newl;
cursor = head->next;
newl = head;
if (x > Index(newl) || x < 1)
{
printf("FAIL\n");
return NULL;
}
else {
while (cursor != NULL)
{
newl->next = cursor;
cursor = cursor->next;
if (i == x)
{
tmp = malloc(sizeof(DoubleNode));
if (tmp == NULL)
{
printf("Fail");
return NULL;
}
tmp->data = c;
tmp->next = cursor;
cursor = tmp;
}
i++;
}
}
return newl;
}
声明
tmp->data=c;
tmp->next=cursor;
cursor=tmp;
实际上并没有将节点 tmp
添加到列表中。你需要做例如
tmp->data = c;
tmp->next = cursor->next
cursor->next = tmp;
break; // No need to loop more, we've inserted the node
首先你必须找到索引为x的节点的前驱。分配一个新节点并将其插入到找到的前导节点的下一个节点。
DoubleNode* insert(DoubleNode*head, double c, int x)
{
if ( x<1 )
{
printf("FAIL\n");
return NULL;
}
// Find predecessor, start with head
DoubleNode *pred= head;
int i = 1;
while ( i < x && pred->next != NULL )
{
pred = pred->next;
i ++;
}
if ( i < x )
{
// list is to short
printf("Fail");
return NULL;
}
// allocate new node and insert it after predecessor
DoubleNode *newl = malloc(sizeof(DoubleNode));
newl->data = c;
newl->next = pred->next; // successor of new node is successor of predecessor
pred->next = newl; // successor of predecessor is now the new node
return newl;
}
感谢大家的提示。它现在正在工作。我想 return 一个包含新节点的完整列表的新头。我没有提到这个抱歉。
DoubleNode*insert(DoubleNode*head, double c, int x)
{
DoubleNode *pred, *tmp;
pred=head;
tmp=head;
int i = 1;
while ( i < x && pred->next != NULL )
{
pred = pred->next;
tmp->next=pred;
i ++;
}
if ( i < x )
{
printf("Fail");
return NULL;
}
DoubleNode *newl = malloc(sizeof(DoubleNode));
newl->data = c;
newl->next = pred->next;
pred->next = newl;
return tmp;
}
我正在尝试为简单链表编写一些函数。这个应该在列表之间的某处添加一个节点。用户在列表的头部放入应该在此时保存的数据 "c" 和一个作为保存索引的 int "x"。但它基本上什么都不做,我不确定为什么。也许有人能看出错误。
第一个 if 语句只是检查索引是否是列表的一部分。
DoubleNode *insert(DoubleNode *head, double c, int x)
{
int i;
DoubleNode *cursor, *tmp, *newl;
cursor = head->next;
newl = head;
if (x > Index(newl) || x < 1)
{
printf("FAIL\n");
return NULL;
}
else {
while (cursor != NULL)
{
newl->next = cursor;
cursor = cursor->next;
if (i == x)
{
tmp = malloc(sizeof(DoubleNode));
if (tmp == NULL)
{
printf("Fail");
return NULL;
}
tmp->data = c;
tmp->next = cursor;
cursor = tmp;
}
i++;
}
}
return newl;
}
声明
tmp->data=c;
tmp->next=cursor;
cursor=tmp;
实际上并没有将节点 tmp
添加到列表中。你需要做例如
tmp->data = c;
tmp->next = cursor->next
cursor->next = tmp;
break; // No need to loop more, we've inserted the node
首先你必须找到索引为x的节点的前驱。分配一个新节点并将其插入到找到的前导节点的下一个节点。
DoubleNode* insert(DoubleNode*head, double c, int x)
{
if ( x<1 )
{
printf("FAIL\n");
return NULL;
}
// Find predecessor, start with head
DoubleNode *pred= head;
int i = 1;
while ( i < x && pred->next != NULL )
{
pred = pred->next;
i ++;
}
if ( i < x )
{
// list is to short
printf("Fail");
return NULL;
}
// allocate new node and insert it after predecessor
DoubleNode *newl = malloc(sizeof(DoubleNode));
newl->data = c;
newl->next = pred->next; // successor of new node is successor of predecessor
pred->next = newl; // successor of predecessor is now the new node
return newl;
}
感谢大家的提示。它现在正在工作。我想 return 一个包含新节点的完整列表的新头。我没有提到这个抱歉。
DoubleNode*insert(DoubleNode*head, double c, int x)
{
DoubleNode *pred, *tmp;
pred=head;
tmp=head;
int i = 1;
while ( i < x && pred->next != NULL )
{
pred = pred->next;
tmp->next=pred;
i ++;
}
if ( i < x )
{
printf("Fail");
return NULL;
}
DoubleNode *newl = malloc(sizeof(DoubleNode));
newl->data = c;
newl->next = pred->next;
pred->next = newl;
return tmp;
}