c-在链表之前插入
好吧,我一直在做我的第一个单链表项目,我遇到了麻烦。我尝试实现的算法之一是在用户指定的节点之前插入一个节点。我遇到的问题是,当插入节点时,它被放置在正确的位置,但随后它也会删除它之前的所有节点。 如果我的列表最初包含:1 2 3 4 5 我想在4之前插入0 结果是:0 4 5c-在链表之前插入,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
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;}
返回的代码是什么?我希望返回一些值代码>节省时间-启用编译器警告。谢谢!是的,我犯了一个愚蠢的错误。我还需要重命名我的变量。临时节点是我用来放入列表的节点。我现在有它作为临时->信息=数据;临时->链接=上一个->链接;上一个->链接=温度;我仍然不确定为什么当我插入新的节点时,它正在推动它后面的节点(朝向头部)。@奥斯丁,我已经更新了这个例子,并添加了一些注释供您考虑。