c-在给定位置插入节点



节点未插入位置。我是编码和链表的新手。这里的头指向我已经全局声明的开始。请帮助我修改代码

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++;
}
}
  1. count变量有什么用?为什么i没有在任何地方声明?请更正。

  2. 在您的while条件下,您需要处理pos == 0情况-

  3. 以下代码将工作


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;
}
  1. 代码中的一个问题是temp没有初始化,因此temp->next在声明期间不会指向下一个节点执行temp = *head
  2. 我没有被宣布
  3. 如果start为NULL,则无论函数的参数(pos(是什么位置,都要将新节点插入到pos=0的位置
  4. 在您的代码中,当链表中的节点数为1(仅头部节点(时,新节点将不会添加到pos=0
  5. 在您的代码中,新节点将仅插入到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;
}

相关内容

  • 没有找到相关文章

最新更新