我现在已经知道为什么链接列表没有从先前的问题更新。事实证明,我必须迭代x的坐标,但这在我的这个问题中并不重要。
当我在链表中插入一个元素时,我想要插入一个值的元素消失了。例如,我有打印出“helo”的元素,我想在e之后插入另一个'l',输出将是“(space)ello。这是我的插入代码和结构:
struct node {
struct node *previous;
int c;
int x;
int y;
struct node *next;
}*head;
void checker(int ch, int xpos, int ypos)
{
int flag=0;
struct node *temp,*temp1,*var,*insert_node;
var=(struct node *)malloc(sizeof(struct node));
temp=(struct node *)malloc(sizeof(struct node));
insert_node=(struct node*)malloc(sizeof(struct node));
temp=head;
while(temp!=NULL)
{
if(temp->x==xpos && temp->y==ypos)
{
insert_node->c=ch;
insert_node->x=xpos;
insert_node->y=ypos;
insert_node->next=NULL;
temp1=temp;
while(temp1!=NULL)
{
if(temp1->y==ypos)
temp1->x++;
temp1=temp1->next;
}
var->next=insert_node;
insert_node->next=temp;
head=var;
flag=1;
break;
}
var=temp;
temp=temp->next;
}
if(flag==0)
characters(ch,xpos,ypos);
}
看起来var里面只有一个元素而不是两个元素,它从helo中取出了“h”forgranted。
答案 0 :(得分:1)
当您指定head = var
时,您会从原始标题中删除列表,直至列表中找到匹配的x和y。坐下来画几张照片,说服自己说错了。
在列表中的匹配节点之前插入新节点:跟踪列表中的当前节点和访问的上一个节点。然后,当您准备在current_node前插入新节点时,请执行以下操作:
insert_node->next = current_node;
if (previous_node == NULL)
head = insert_node;
else
previous_node->next = insert_node;
在您的代码中,temp
扮演current_node
(您正在审核的角色)。您没有指向前一个节点的指针,因此请声明一个。将current_node设置为head,将previous_node设置为NULL,然后开始运行列表,当您在列表中找到要将insert_node
放在前面的节点时,请使用上面的代码。如果要插入列表的前面,请注意特殊情况。如果你想在current_node
之后插入新节点,我会把它作为练习来弄清楚该做什么。
答案 1 :(得分:0)
var->next=insert_node;
insert_node->next=temp;
应该是:
insert_node->next=temp->next;
temp->next=insert_node;