Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在链表中插入一个元素_C_Linked List - Fatal编程技术网

C 在链表中插入一个元素

C 在链表中插入一个元素,c,linked-list,C,Linked List,我现在已经知道为什么没有根据前面的问题更新链接列表。结果是,我必须迭代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

我现在已经知道为什么没有根据前面的问题更新链接列表。结果是,我必须迭代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”

        var->next=insert_node;
        insert_node->next=temp;
应该是:

        insert_node->next=temp->next;
        temp->next=insert_node;

当您分配
head=var
时,您会将列表从原始头部扔掉,直到在列表中找到匹配的x和y为止。坐下来,画几张图片,让自己相信这是错误的

要在列表中的匹配节点之前插入新节点,请跟踪列表中的当前节点和访问过的上一个节点。然后,当您准备在当前节点之前插入新节点时,请执行以下操作:

insert_node->next = current_node;
if (previous_node == NULL)
    head = insert_node;
else
    previous_node->next = insert_node;

在您的代码中,
temp
扮演当前节点的角色(您正在检查的节点)。您没有指向上一个节点的指针,因此请声明一个。将current_node设置为head,previous_node设置为NULL,然后开始运行列表,当您在列表中找到要放在前面的节点时,请使用上面的代码。请注意,如果要在列表前面插入,请注意特殊情况。我将其保留为exer如果你想在
当前节点之后插入新节点

你不应该在temp或var上执行malloc。当你给它分配头时,你会覆盖temp上的malloc。这很好,先生,但是我仍然不明白为什么它会起作用。我正在对此进行自学,所以我可能错过了几点。我想询问即使我只有一个指向上一个节点的指针,我是否仍然拥有所有上一个节点的值?正如我在这里所理解的,上一个节点指向我要插入节点之前的最后一个元素。因此,如果我打印上一个节点,我将在我要插入节点的点之前拥有所有值?(抱歉,如果我让您感到困惑)谢谢。指针可能会非常混乱,但请继续,您会有“啊哈!”的时刻。对于您的问题,列表本身包含指向列表中除头部以外的所有节点的指针。头部指针可以解决这一问题。在处理列表时,指向您正在处理的节点(当前_节点)会很有帮助当前节点指向一个节点,前一个节点指向上一次循环中的当前节点(第一次迭代时为空),因此,最多只有两个节点的值和这些指针。如果在列表中插入节点放在当前节点之前,则必须将“插入节点->下一步”设置为指向当前节点。插入节点仍不在列表中,因为列表中没有任何部分指向插入节点。若要使插入节点成为列表的一部分,则必须更改上一个节点->下一步从当前\u节点到插入\u节点(头指向当前\u节点时除外,则头必须更改为插入\u节点)。重写循环,将插入\u节点放在列表中当前\u节点之后,您将了解有关指针的内容。