Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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,好吧,我一直在做我的第一个单链表项目,我遇到了麻烦。我尝试实现的算法之一是在用户指定的节点之前插入一个节点。我遇到的问题是,当插入节点时,它被放置在正确的位置,但随后它也会删除它之前的所有节点。 如果我的列表最初包含:1 2 3 4 5 我想在4之前插入0 结果是:0 4 5 struct node *insertBefore(struct node *start, int data, int x) { struct node *marker = NULL; struct nod

好吧,我一直在做我的第一个单链表项目,我遇到了麻烦。我尝试实现的算法之一是在用户指定的节点之前插入一个节点。我遇到的问题是,当插入节点时,它被放置在正确的位置,但随后它也会删除它之前的所有节点。 如果我的列表最初包含:1 2 3 4 5 我想在4之前插入0 结果是:0 4 5

struct node *insertBefore(struct node *start, int data, int x)
{
    struct node *marker = NULL;
    struct node *prev = NULL;
    struct node *temp = NULL;

    temp = (struct node*)malloc(sizeof(struct node));

    marker = start;

    while(marker != NULL && marker->info != x)
    {
        prev = marker;
        marker = marker->link;
    }
    if(!marker)
    {
        printf("*Element containing %d not found*\n", x);
        return;
    }
    if(marker == start)
    {
        temp->info = data;
        temp->link = marker;
        return;
    }
    temp->info = data;
    temp->link = prev->link;
    prev->link = temp;
    temp->link = marker;

    return; 
}

仔细想想你在做什么

如果要插入一个节点,则不应创建三个

temp = (struct node*)malloc(sizeof(struct node));
marker = (struct node*)malloc(sizeof(struct node));
prev = (struct node*)malloc(sizeof(struct node));
您应该采取的方法是:

// Search for relevant node
while(marker != NULL && marker->info != x) {
    prev = marker;
    marker = marker->link;
}

// Verify you found somewhere to insert
if(marker == NULL) {
    // No x found
    return start;
}

// Allocate and initialize node
struct node* insert_node = (struct node*)malloc(sizeof(struct node));
insert_node->info = data;
insert_node->link = marker;

if(prev == NULL) {
    // Inserted node is the new start node
    start = insert_node;
}
else {
    // Relink chain
    prev->link = insert_node;
}

// Return the NEW start node.
// This is needed in case the new node is inserted before the original start node!
return start;
如果你能巧妙地编写代码(这意味着思考!),你就可以非常简单地编写代码,避免陷入困境。个案包括:

  • 空输入列表
  • 第一个元素是
    x
  • 列表中没有
    x

再次查看代码,您正在做一些不寻常的事情。一种是在确定要插入元素之前分配内存:

temp = (struct node*)malloc(sizeof(struct node));
此外,您可以连续更改
temp->link
两次

temp->link = prev->link;
prev->link = temp;
temp->link = marker;

如果列表中的第一个元素发生变化,您没有任何机制来更新
开始
节点。

如果这是家庭作业,您会发现人们不喜欢在这里回答此类问题。实现链接列表是一种典型的介绍性数据结构任务。如果你到处搜索,你会发现大量的例子。它一开始只是家庭作业。要求是建立一个能够添加和删除节点的单链表。我决定尝试做我的文本中的其他算法…insertEnd、insertSelection、insertBefore和reverseList。除了这一个,我都记下了。我知道它是怎么工作的,我想至少我知道。我只是不确定为什么新插入之前的节点会被删除。使用
struct node*insertBefore(struct node*start,int data,int x){…return;}
返回的代码是什么?我希望
返回一些值节省时间-启用编译器警告。谢谢!是的,我犯了一个愚蠢的错误。我还需要重命名我的变量。临时节点是我用来放入列表的节点。我现在有它作为临时->信息=数据;临时->链接=上一个->链接;上一个->链接=温度;我仍然不确定为什么当我插入新的节点时,它正在推动它后面的节点(朝向头部)。@奥斯丁,我已经更新了这个例子,并添加了一些注释供您考虑。