当前位置: 首页 > 知识库问答 >
问题:

如何删除双向链表中的备用节点?

羊舌光赫
2023-03-14

我写了下面的代码,但它在执行create()函数后停止工作。我想从头节点开始删除替代元素。我的delete_Alt()函数正确吗?请告诉我哪里错了。

#include <stdio.h>
#include <stdlib.h>

// using a structure
typedef struct mynode {
    int data;
    struct mynode *prev;    // to point to previous node
    struct mynode *link;    // to point to next node
} node;
node *head = NULL;

// creating the list
void create() {
    node *p, *q;
    int ch;
    do {
        p = (node *)malloc(sizeof(node));
        printf("enter data\n"); 
        scanf("%d", &p->data);
        if (head == NULL) 
        {
            p->prev = head;
            q = p;
        }
        else
        {
            p->prev = q;
            p->link = NULL;
            q->link = p;
            q = p;
        }
        printf("create another node?, press 1   ");
        scanf ("%d",&ch);
    } while(ch==1);
}

//to delete alternate elements
void delete_Alt() {
    if (head == NULL)
        printf("Empty list...ERROR");

    node *previous, *current, *next;    
    previous = head;
    current = head->link;
    while (previous !=NULL && current != NULL) {
        previous->prev = current->prev;
        previous->link = current->link; 

        next = current->link;
        previous->link = next;
        next->prev = previous;

        free(current);
    }
}

// print the list
void display() {
    node *temp;
    temp = head;
    while (temp != NULL) {
        printf("%d  ",temp->data);
        temp = temp->link;
    }
    printf("\n");
}

int main() {
    node *head = NULL;
    create();
    printf("List before deleting is:    ");
    display();
    delete_Alt();
    printf("List after deleting is:     ");
    display();
return 0;
}

共有3个答案

施梓
2023-03-14

您从未将“head”指定给列表中第一个创建的元素。因此它总是空的。试试这个:

if (head == NULL) 
{
  p->prev = head;
  head = p;      
  q = p;
}

在delete_alt中,需要执行以下操作:

while (previous !=NULL && current != NULL) {
    previous->link = current->link; 
    next = current->link;
    free(current);
    if(next) {
      next->prev = previous;
      current = next->link;
    }
    else current = NULL;
    previous = next;
}

试试这里:https://repl.it/HK2P/0

澹台博文
2023-03-14

在你的程序中,你只给head赋值一次:

node *head = NULL;

那么它的价值不会改变。

葛胜泫
2023-03-14

您在创建和删除函数中犯了一些小错误...

这是更新后的代码试试看。。。

#include <stdio.h>
#include <stdlib.h>

// using a structure
typedef struct mynode {
    int data;
    struct mynode *prev;    // to point to previous node
    struct mynode *link;    // to point to next node
} node;
node *head = NULL;

// creating the list
void create() {
    node *p, *q;
    int ch;
    do {
        p = (node *)malloc(sizeof(node));
        printf("enter data\n"); 
        scanf("%d", &p->data);
        p->link = NULL;
        if (head == NULL) 
        {
            p->prev = NULL;
            head = p;
        }
        else
        {
            q = head;
            while (q->link != NULL)
            q = q->link;
            p->prev = q;
            q->link = p;
        }
        printf("create another node?, press 1   ");
        scanf ("%d",&ch);
    } while(ch==1);
}

//to delete alternate elements
void delete_Alt() {
    if (head == NULL)
        printf("Empty list...ERROR");

    node *previous, *current, *next;    
    previous = head;
    current = head->link;
    while (previous !=NULL && current != NULL) 
    {
        previous->link = current->link; 
        next = current->link;
        free(current);
        if(next) 
        {
            next->prev = previous;
            current = next->link;
        }
        else 
        current = NULL;
        previous = next;
    }
}

// print the list
void display() {
    node *temp;
    temp = head;
    while (temp != NULL) {
        printf("%d  ",temp->data);
        temp = temp->link;
    }
    printf("\n");
}

int main() {
    node *head = NULL;
    create();
    printf("List before deleting is:    ");
    display();
    delete_Alt();
    printf("List after deleting is:     ");
    display();
return 0;
}
 类似资料:
  • 我有麻烦删除双向链表中的节点,程序崩溃,我不能解决这个问题。你能帮我吗?这是创建新节点,查看它们并删除它们的完整代码。 我认为这个问题与Node del的scanf()有关,但我不确定。当我只是通过或

  • 这是我的remove函数,用于删除具有元素的节点。我得到了一个seg错误,我很确定这是因为temp->prev是前面的哨兵,所以从技术上来说,它不在双链表中。如果这是正确的,我实际上如何防止这种情况?如有任何帮助,不胜感激。 编辑:刚刚更新了代码,但仍然出现了Seg错误

  • 我试图从基于阉羊的双链表中删除一个元素,该列表中的节点满足返回bool的函数。由于某种原因,替换节点的前一个指针(下一个被删除)不更新,而是引用回它自己。 我的代码 测试结果

  • 双链表节点是在main函数中创建的。Ender和header已定义。在删除节点函数处中断-ender为空。 释放最后一个和第一个输入的内存的最佳方法是什么,即:删除:233,A和888,F?

  • 我理解得对吗?(从虚拟节点开始) dummy->a->b->c->d->dummy(环绕到dummy节点) 因此,如果我想删除第一个实际的数据段(A),我需要将它分配给一个临时变量。所以Node first=head.next。然后我需要有一个虚拟的头部引用“B”,所以我需要做head.next=first.next。这就是所有需要做的吗? 在从列表中删除任何节点N的情况下(假设它在列表中),这是

  • 问题内容: 这段代码是一个表,可以选择“惰性名称”,“删除”,“显示”和“退出”。 该代码运行良好,但是我唯一的问题是如何删除节点中的所选名称 *我不知道如何删除节点。我应该在删除方法上加上什么? 问题答案: 要删除Node,您实际上需要更新它的上一个节点的位置以删除Node的位置,而剩下的Node最终将被垃圾回收。 如果要删除的节点是根节点,则只有一个问题,然后更新根节点。