0

我现在知道为什么链接列表没有从之前的问题中更新。事实证明,我必须迭代 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 中获取“h”是理所当然的。

4

2 回答 2

1

您将列表从原始头部丢弃,直到您在分配时在列表中找到匹配的 x 和 y 为止head = var。坐下来画几张照片来说服自己这是错误的。

在列表中的匹配节点之前插入一个新节点:跟踪列表中的当前节点和之前访问的节点。然后,当您准备在 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.

于 2013-08-06T03:48:35.403 回答
0
        var->next=insert_node;
        insert_node->next=temp;

应该:

        insert_node->next=temp->next;
        temp->next=insert_node;
于 2013-08-06T03:43:14.687 回答