我现在已经知道为什么之前的问题没有更新链表了。事实证明,我必须迭代x的坐标,但这在我的这个问题中并不重要。
当我在链表中插入元素时,要插入值的位置之前的元素将消失。例如,我有一些元素会打印出"helo",我想在e后面插入另一个"l",输出将是"(空格)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 forgranted中取"h"。
当您分配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
之后插入新节点,我将把它作为一个练习来处理。
var->next=insert_node;
insert_node->next=temp;
应该是:
insert_node->next=temp->next;
temp->next=insert_node;