双链表的删除算法 #包括 #包括 结构列表{ 字符名[30]; char subject1[30]; char subject2[30]; 结构列表*下一步; 结构列表*上一个; }; typedef结构列表节点; 节点输入(节点*n1) { 节点n2; n2.先前=n1; n1->next=&n2; n2.next=NULL; scanf(“%s”,n2.名称); scanf(“%s”,n2.主题1); scanf(“%s”,n2.主题2); 返回n2; } 无效删除(节点*n1) { 如果(n1->next!=NULL) n1->上一个->下一个=n1->下一个; 其他的 n1->previous->next=NULL; 如果(n1->previous!=NULL) n1->next->previous=n1->previous; printf(“\n删除…”); 自由(n1); } int main() { 节点*启动; start=(node*)malloc(sizeof(node)); 节点n1=输入(开始); 节点n2=输入(&n1); 开始->上一步=空; printf(“%s%s%s%s%s%s”,n1.名称,n1.主题1,n1.主题2,n2.名称,n2.主题1,n2.主题2); 删除(&n1); 删除(&n2); 删除(开始); 返回0; }

双链表的删除算法 #包括 #包括 结构列表{ 字符名[30]; char subject1[30]; char subject2[30]; 结构列表*下一步; 结构列表*上一个; }; typedef结构列表节点; 节点输入(节点*n1) { 节点n2; n2.先前=n1; n1->next=&n2; n2.next=NULL; scanf(“%s”,n2.名称); scanf(“%s”,n2.主题1); scanf(“%s”,n2.主题2); 返回n2; } 无效删除(节点*n1) { 如果(n1->next!=NULL) n1->上一个->下一个=n1->下一个; 其他的 n1->previous->next=NULL; 如果(n1->previous!=NULL) n1->next->previous=n1->previous; printf(“\n删除…”); 自由(n1); } int main() { 节点*启动; start=(node*)malloc(sizeof(node)); 节点n1=输入(开始); 节点n2=输入(&n1); 开始->上一步=空; printf(“%s%s%s%s%s%s”,n1.名称,n1.主题1,n1.主题2,n2.名称,n2.主题1,n2.主题2); 删除(&n1); 删除(&n2); 删除(开始); 返回0; },c,doubly-linked-list,C,Doubly Linked List,删除操作未正确执行。它给出了一个未处理的异常,返回255个错误。此外,在books中,只有n1节点被删除,而开始(标题)和最后一个节点保持原样。但是,我想删除所有节点和头。请解释并改正。另外,我在C和C++中编写了这个代码。请相应地更正。已被弃用(并且是特定于linux的),请改用是不必要的。阅读更多关于这一点在我做了。但是,这并不能解决我的问题。您的程序有未定义的行为,因为您将指向局部变量的指针分配给start节点,然后稍后尝试执行该操作。您需要在输入函数中分配节点。此外,您取消引用n1->p

删除操作未正确执行。它给出了一个未处理的异常,返回255个错误。此外,在books中,只有n1节点被删除,而开始(标题)和最后一个节点保持原样。但是,我想删除所有节点和头。请解释并改正。另外,我在C和C++中编写了这个代码。请相应地更正。

已被弃用(并且是特定于linux的),请改用
是不必要的。阅读更多关于这一点在我做了。但是,这并不能解决我的问题。您的程序有未定义的行为,因为您将指向局部变量的指针分配给
start
节点,然后稍后尝试执行该操作。您需要在输入函数中分配节点。此外,您取消引用n1->previous(即n1->previous->next),该值也可能为空,但随后检查它。所有节点对象都应该是指针,否则就在堆栈上的对象上调用free。
#include<stdio.h>
#include<malloc.h>

struct list {
    char name[30];
    char subject1[30];
    char subject2[30];
    struct list* next;
    struct list* previous;
};

typedef struct list node;

node input(node* n1)
{
    node n2;
    n2.previous=n1;
    n1->next=&n2;
    n2.next=NULL;
    scanf("%s",n2.name);
    scanf("%s",n2.subject1);
    scanf("%s",n2.subject2);
    return n2;
}

void delete(node *n1)
{
    if(n1->next!=NULL)  
        n1->previous->next=n1->next;
    else
        n1->previous->next=NULL;
    if(n1->previous!=NULL)  
        n1->next->previous=n1->previous;
    printf("\nDeleting....");
    free(n1);
}

int main()
{
    node* start;
    start=(node*)malloc(sizeof(node));
    node n1=input(start);
    node n2=input(&n1);
    start->previous=NULL;
    printf("%s %s %s %s %s %s",n1.name,n1.subject1,n1.subject2,n2.name,n2.subject1,n2.subject2);
    delete(&n1);
    delete(&n2);
    delete(start);
    return 0;
}