节点未插入位置。我是编码和链表的新手。这里的头指向我已经全局声明的开始。请帮助我修改代码
void insert_at_position(struct node **head, int x, int pos)
{
struct node *temp,*t,*tails = *head;
t = (struct node*)malloc(sizeof(struct node));
if (start == NULL)
{
start = t;
start->data = x;
start->next = NULL;
return;
}
count++;
while (temp->next!=NULL)
{
tails = temp;
temp = temp->next;
if (i == pos)
{
tails->next=t;
t->data=x;
t->next=temp->next;
return;
}
i++;
}
}
-
count变量有什么用?为什么
i
没有在任何地方声明?请更正。 -
在您的
while
条件下,您需要处理pos == 0
情况- -
以下代码将工作
int insertNode(int pos, int data)
{
struct node *temp = NULL, *tails = NULL, *p = NULL;
p = (struct node*)malloc(sizeof(struct node));
p->data = data;
p->next = NULL;
if(pos == 0)
{
p->next = start;
start = p;
return 0;
}
temp = tails = start;
while(temp != NULL)
{
temp = temp->next;
pos--;
if(pos == 0)
{
tails->next = p;
p->next = temp;
return 0;
}
tails = tails->next;
}
if(pos)
printf("nError!!! Invalid position, can't insertn");
return 0;
}
- 代码中的一个问题是
temp
没有初始化,因此temp->next
在声明期间不会指向下一个节点执行temp = *head
- 我没有被宣布
- 如果start为NULL,则无论函数的参数(
pos
(是什么位置,都要将新节点插入到pos=0的位置 - 在您的代码中,当链表中的节点数为1(仅头部节点(时,新节点将不会添加到
pos=0
- 在您的代码中,新节点将仅插入到
pos+1
位置,而不是pos
位置。在while循环迭代过程中,当满足i == pos
条件时,tails指向位置2处的节点,因此您本应将节点插入tails_pervious节点和tails节点之间,但您将其插入tails和tails_next之间,这是不正确的
可以使用以下代码。该代码对原始代码只有少量修改(这样您就可以很容易地理解错误(。
void insert_at_position(struct node **head, int x, int pos)
{
struct node *temp = *head,*t,*tails = *head; //temp was not initialized in original code so temp->next will not point to next node.
int i = 0; // i was not initialized in original code
t=(struct node*)malloc(sizeof(struct node));
if(t == NULL) // malloc fail case check
{
return;
}
if (pos == 0) // 0th position insertion handling section
{
t->data = x;
t->next = start;
start = t;
return;
}
if(start == NULL) // It is better to not inset any node if position != 0 and Start == NULL
{
free(t); // If the node is not inserted free the allocated memory.
return;
}
count++; // Assuming count is an global variable
while(temp != NULL)
{
tails = temp;
temp = temp->next;
if(i+1 == pos) // In this case tails points to the previous location
{
tails->next=t;
t->data=x;
t->next=temp; // temp now points to the node that was originally at 'pos' position
return;
}
i++;
}
free(t); // If the node is not inserted free the allocated memory.
}
但我想建议一些改进:-
- 最好为函数使用返回类型,以便调用方函数可以检查操作是否成功
- 减少函数中的出口点始终是一种很好的编程实践,即尝试减少函数内的返回语句。您可以很容易地通过使用少量if else检查来协商return语句的使用(这完全值得(
- 在需要之前不要分配
- 使用指针对指针的力量
- 处理在顶部插入的情况(pos=0(
- 处理pos>列表长度的情况
void insert_at_position(struct node **head, int x, int pos)
{
struct node *new;
if (!head) { // defensive
return;
}
// Walk the list, until we
// reach the end
// or we have passed 'pos' nodes
for ( ; *head; head = &(*head)->next) {
if (!pos) break;
pos --;
}
if (pos) { // list too short
return;
}
new = malloc (sizeof *new);
if (!new) { // malloc failed
return;
}
new->data = x;
new->next = *head;
*head = new;
}