C 在给定位置从链表中删除元素

C 在给定位置从链表中删除元素,c,linked-list,C,Linked List,我有一个关于从链表中删除元素的简单问题。我试图完成的任务与我在代码在线中看到的任务之间的唯一区别在于,我试图删除给定位置的元素,而不是给定需要删除的实际元素 node->data = node->next->data; Node* temp = node->next; node->next = node->next->next; free(temp); 感谢您的帮助 搜索列表,直到找到第n个元素(使用计数器),然后更新前一个节点的下一个指针,指向当前所

我有一个关于从链表中删除元素的简单问题。我试图完成的任务与我在代码在线中看到的任务之间的唯一区别在于,我试图删除给定位置的元素,而不是给定需要删除的实际元素

node->data = node->next->data;
Node* temp = node->next;
node->next = node->next->next;
free(temp);

感谢您的帮助

搜索列表,直到找到第n个元素(使用计数器),然后更新前一个节点的下一个指针,指向当前所在节点之后的一个(有效地删除它)。如果您也在使用上一个指针,请调整上一个指针。

查找列表,直到找到第n个元素(使用计数器),然后更新上一个节点的下一个指针,使其指向当前所在元素之后的元素(有效地将其删除)。如果您也在使用上一个指针,请调整它们。

这很简单:

1) 通过遍历列表找到第n项,另外使用计数器跟踪您是哪个节点

2) 删除该节点,就像删除任何其他链接列表一样。

这很简单:

1) 通过遍历列表找到第n项,另外使用计数器跟踪您是哪个节点


2) 删除该节点,就像删除任何其他链表一样。

如果要删除多个项目,可以先遍历该列表,然后将所有要删除的项目收集到另一个列表中。然后,只需调用“removeAll”传入收集的列表。

如果要删除多个项目,可以先遍历列表,然后将要删除的所有项目收集到另一个列表中。然后简单地调用“removeAll”传入收集的列表。

您可以这样做,下面是一个示例程序,它可以根据作为参数提供的索引删除任何节点

开始->指向第一个节点
遍历->指向必须删除的节点
traverseNext->指向必须删除的上一个节点

代码如下所示

     #include <iostream>

     struct myList
     {
       int data;
   struct myList *next;
      };

    struct myList *start=NULL;  

    //this method removes a node from the position index
    void remove(int index)
    {
           myList *traverse = start;    
           myList *traverseNext = NULL;

           int i = 1;   
          while(i<(index-1))
           {
                  traverse = traverse->next;
          i++;
           }
              traverseNext = traverse;
          traverse = traverse->next;
          if(traverse->next == NULL)
          {     
         delete traverse;
         traverseNext->next = NULL;
         traverse = NULL;
          return;
           }

             else
          {     
          traverseNext->next = traverse->next;
          delete traverse;
          traverse = NULL;
           return;
           }

    }




int main(void)
   {
      myList *node1;
      myList *node2;    
      myList *node3;    

         node1 = new myList;    
         node2 = new myList;    //Created 3 nodes of type myList
         node3 = new myList;    

         node1->data = 10;
         node1->next = node2;


         node2->data = 20;
         node2->next = node3;


         node3->data = 30;
         node3->next = NULL;

         start = node1;     //start is pointing to node1
         remove(2);      //removing the node 2, so the output will be 10 30
        while(start)  //iterating through all the nodes from start, since start
       {              //is pointing to the first node.
    std::cout<<start->data<<" ";
    start = start->next;

           }
    } 
#包括
结构myList
{
int数据;
结构myList*next;
};
struct myList*start=NULL;
//此方法从位置索引中删除节点
无效删除(整型索引)
{
myList*遍历=开始;
myList*traverseNext=NULL;
int i=1;
而(不精确;
i++;
}
traverseNext=导线测量;
遍历=遍历->下一步;
如果(遍历->下一步==NULL)
{     
删除导线;
traverseNext->next=NULL;
遍历=空;
返回;
}
其他的
{     
traverseNext->next=traverse->next;
删除导线;
遍历=空;
返回;
}
}
内部主(空)
{
myList*节点1;
myList*节点2;
myList*节点3;
node1=新的myList;
node2=new myList;//创建了3个myList类型的节点
node3=新的myList;
节点1->数据=10;
node1->next=node2;
节点2->数据=20;
node2->next=node3;
节点3->数据=30;
node3->next=NULL;
start=node1;//start指向node1
remove(2);//删除节点2,因此输出为10 30
while(start)//从开始到开始遍历所有节点
{//指向第一个节点。

std::cout您可以这样做,下面是一个示例程序,它可以根据您作为参数提供的索引删除任何节点

开始->指向第一个节点
遍历->指向必须删除的节点
traverseNext->指向必须删除的上一个节点

代码如下所示

     #include <iostream>

     struct myList
     {
       int data;
   struct myList *next;
      };

    struct myList *start=NULL;  

    //this method removes a node from the position index
    void remove(int index)
    {
           myList *traverse = start;    
           myList *traverseNext = NULL;

           int i = 1;   
          while(i<(index-1))
           {
                  traverse = traverse->next;
          i++;
           }
              traverseNext = traverse;
          traverse = traverse->next;
          if(traverse->next == NULL)
          {     
         delete traverse;
         traverseNext->next = NULL;
         traverse = NULL;
          return;
           }

             else
          {     
          traverseNext->next = traverse->next;
          delete traverse;
          traverse = NULL;
           return;
           }

    }




int main(void)
   {
      myList *node1;
      myList *node2;    
      myList *node3;    

         node1 = new myList;    
         node2 = new myList;    //Created 3 nodes of type myList
         node3 = new myList;    

         node1->data = 10;
         node1->next = node2;


         node2->data = 20;
         node2->next = node3;


         node3->data = 30;
         node3->next = NULL;

         start = node1;     //start is pointing to node1
         remove(2);      //removing the node 2, so the output will be 10 30
        while(start)  //iterating through all the nodes from start, since start
       {              //is pointing to the first node.
    std::cout<<start->data<<" ";
    start = start->next;

           }
    } 
#包括
结构myList
{
int数据;
结构myList*next;
};
struct myList*start=NULL;
//此方法从位置索引中删除节点
无效删除(整型索引)
{
myList*遍历=开始;
myList*traverseNext=NULL;
int i=1;
而(不精确;
i++;
}
traverseNext=导线测量;
遍历=遍历->下一步;
如果(遍历->下一步==NULL)
{     
删除导线;
traverseNext->next=NULL;
遍历=空;
返回;
}
其他的
{     
traverseNext->next=traverse->next;
删除导线;
遍历=空;
返回;
}
}
内部主(空)
{
myList*节点1;
myList*节点2;
myList*节点3;
node1=新的myList;
node2=new myList;//创建了3个myList类型的节点
node3=新的myList;
节点1->数据=10;
node1->next=node2;
节点2->数据=20;
node2->next=node3;
节点3->数据=30;
node3->next=NULL;
start=node1;//start指向node1
remove(2);//删除节点2,因此输出为10 30
while(start)//从开始到开始遍历所有节点
{//指向第一个节点。
std::cout
#包括
#包括
类型定义结构元素{
int-num;
结构元素*next;
}元素;
void delNth(元素**头,int pos){//pos:zero origin
元素*prev,*tmp;
int i;
if(header==NULL | |*header==NULL | | pos<0)返回;
如果(位置==0){
tmp=(*标题)->下一步;
自由(*标题);
*标题=tmp;
}否则{
上一页=*页眉;
tmp=(*标题)->下一步;
对于(i=1;不精确;
if(tmp==NULL)返回;//或上升错误
}
上一步->下一步=tmp->下一步;
免费(tmp);
}
}
空位下降(元素*标题){
如果(标题){
下降(hea)
Node* temp = previous->next;
previous->next = temp->next;
free(temp);