首页 文章

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

提问于
浏览
2

我编写了以下代码,但在执行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 回答

  • 1

    您从未将“head”分配给列表中的第一个创建元素 . 因此它始终为null . 试试这个:

    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

  • 0

    你在创建和删除功能中做了一些小错误......

    这是更新的代码试试吧......

    #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;
    }
    
  • 0

    在您的程序中,您只为头部分配了一次值:

    node *head = NULL;
    

    那么它的 Value 不会改变 .

相关问题