C 链表删除正在删除错误的节点

C 链表删除正在删除错误的节点,c,linked-list,C,Linked List,求你了,我需要人帮忙。我的家庭作业有问题 这个作业很简单。创建一个列表(1,2,3),并通过创建函数delnode删除中间数字。但它必须使用函数free() 现在,我已经使用链表方法创建了列表(1,2,3)。我想删除数字2,但它不起作用。它应该以(1,3)的形式出现,但它以(2,3)的形式出现 #包括 #包括 结构节点{ 整数; 结构节点*下一步; }; typedef结构节点; //原型函数 节点*分配内存(无效); 节点*插入节点(节点*); void delnode(node*); int

求你了,我需要人帮忙。我的家庭作业有问题

这个作业很简单。创建一个列表(1,2,3),并通过创建函数
delnode
删除中间数字。但它必须使用函数
free()

现在,我已经使用链表方法创建了列表
(1,2,3)
。我想删除数字2,但它不起作用。它应该以
(1,3)
的形式出现,但它以
(2,3)
的形式出现

#包括
#包括
结构节点{
整数;
结构节点*下一步;
};
typedef结构节点;
//原型函数
节点*分配内存(无效);
节点*插入节点(节点*);
void delnode(node*);
int main(){
int i,num;
node*entr=allocateMemory();
node*p=NULL;
entr->number=1;
entr->next=NULL;
num=3;
对于(i=1;inumber=i+1;
}
while(entr){
如果(入口->编号==2){
entr->number==NULL;
打破
}
entr=entr->next;
}
while(entr){
printf(“%d\n”,entr->number);
entr=entr->next;
}
返回0;
}
节点*插入节点(节点*当前){
node*newNode=allocateMemory();
当前->下一步=新节点;
newNode->next=NULL;
返回newNode;
}
void delnode(节点*当前){
node*temp=allocateMemory();
温度=当前->下一步->下一步;
自由(当前->下一步);
电流=温度;
免费(临时);
返回;
}
节点*分配内存(无效){
返回(节点*)malloc(sizeof(节点));
}
一些问题:

(1) 您正在创建的原始列表是[2,3],而不是[1,2,3]-您的循环迭代i=1,i=2-并在每个循环中插入i+1-从而得到[2,3]
(2)您的删除没有任何作用:

while(entr){
   if(entr->number == 2){
       entr->number == NULL;
       break;
   }
   entr=entr->next;
}
请注意,
entr->number==NULL
只是一个布尔运算,而不是赋值-因为您使用的是
operator==

(注意,
operator=
也会失败,因为您不想将
NULL
分配给该值-您真正想做的是分配上一个节点
next
字段。)

附言。
此数据结构的术语是一个,而不是一个“线性列表”

一些问题:

(1) 您正在创建的原始列表是[2,3],而不是[1,2,3]-您的循环迭代i=1,i=2-并在每个循环中插入i+1-从而得到[2,3]
(2)您的删除没有任何作用:

while(entr){
   if(entr->number == 2){
       entr->number == NULL;
       break;
   }
   entr=entr->next;
}
请注意,
entr->number==NULL
只是一个布尔运算,而不是赋值-因为您使用的是
operator==

(注意,
operator=
也会失败,因为您不想将
NULL
分配给该值-您真正想做的是分配上一个节点
next
字段。)

附言。

这个数据结构的术语是a,而不是“线性列表”

好的,这个函数
delnode
是各种各样的混乱。当你试图删除一个节点时,你不需要分配更多的内存。你需要将上一个链接到下一个,并删除当前的

| prev |      | current |      | next |
|------|      |---------|      |------|
   /\              X               /\
   ||              X               ||
   |================================|
看起来应该更像这样

void delnode(node* current)
{
  node* next = current->next;
  // Now we need to find the node previous to this.
  node* prev = entr; // From the start.
  while(prev->next != current) { prev = prev->next; };
  free(current); // delete the current node.
  prev->next = next; // Link the previous node to the next in the list.
}
如果要添加三个节点,则需要更改循环

node* current = entr;
for(i=0;i<3;i++)
{
  int newCount = current->number++; // Increment count.
  current = insertNode(current); // Returns the new node.
  current->number = newCount; // Assign new count.
}

好的,这个函数
delnode
乱七八糟。当你试图删除一个节点时,你不需要分配更多的内存。你需要将上一个链接到下一个,并删除当前的

| prev |      | current |      | next |
|------|      |---------|      |------|
   /\              X               /\
   ||              X               ||
   |================================|
看起来应该更像这样

void delnode(node* current)
{
  node* next = current->next;
  // Now we need to find the node previous to this.
  node* prev = entr; // From the start.
  while(prev->next != current) { prev = prev->next; };
  free(current); // delete the current node.
  prev->next = next; // Link the previous node to the next in the list.
}
如果要添加三个节点,则需要更改循环

node* current = entr;
for(i=0;i<3;i++)
{
  int newCount = current->number++; // Increment count.
  current = insertNode(current); // Returns the new node.
  current->number = newCount; // Assign new count.
}

您正在尝试实现一个链接列表。请告诉我们您实际试图实现的目标,然后我们可以尝试找到正确的实现方法。感谢您的评论,我已对其进行了编辑。^^请不要编辑您的问题来解决它,否则出现相同问题的人将得不到任何帮助,因为您的代码将不再被破坏。您正在尝试吗来实现一个链接列表。告诉我们你到底想完成什么,然后我们可以尝试找到正确的方法。谢谢你的评论,我已经编辑了它。^^不要编辑你的问题来解决它,否则带着同样问题来到这里的人将得不到任何帮助,因为你的代码将不再被破坏。@amit-啊,我甚至没有谢谢!它们仍然是很好的观点,所以我将把它留下。非常感谢!!!是的,它很有效,谢谢你的解释。它让我很容易理解。^^^@amit-啊,我甚至没有注意到!它们仍然是很好的观点,所以我将把它留下。非常感谢!!!是的,它很有效,谢谢你的解释。它让我很容易理解它^^