在链表中插入一个元素

时间:2013-08-06 03:00:44

标签: c linked-list

我现在已经知道为什么链接列表没有从先前的问题更新。事实证明,我必须迭代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。

2 个答案:

答案 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;