李樱yyy 2021-10-29 12:33 采纳率: 100%
浏览 38
已结题

用c语言编写程序数据结构

创建一个长度为5的双链表,要求删除4个结点,并输入其结果

  • 写回答

2条回答 默认 最新

  • CSDN专家-黄老师 2021-10-29 12:36
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct node{
        int data;
        struct node *next;
        struct node* pre;
    }*DList, Node;
     
    // 保存双向链表的最后一个节点
    typedef struct Dlist{
        DList back;
    }*DLL, D;
     
    // 创建一个双向链表,number 代表创建节点的个数
    DList creatDLL(int number, DLL tail){
        
        printf("你需要输入 %d 个数值  \n", number);
        int i = 1;
        // 头部节点的创建
        Node *head = (Node*)malloc(sizeof(Node));
        printf("请输入第 %d 个节点的指: \n", i);
        int input_data;
        scanf("%d", &input_data);
        head->data = input_data;
        head->pre = NULL;
        DList p = head; // 保存head 节点,方便最后直接return p
     
        while (i < number){
            Node *node = (Node*)malloc(sizeof(Node));
     
            printf("请输入第 %d 个节点的指: \n", ++i);
            int in_data;
            scanf("%d", &in_data);
            node->data = in_data;
     
            p->next = node;
            node->pre = p;
            node->next = NULL;
            p = p->next;  // 更新 p 节点
     
        }
        tail->back = p;
     
        return head;
    }
     
    // 从头到尾打印节点
    void printLinkList(DList head){
        int i = 1;
        while (head != NULL){
            printf("第 %d 个节点为: %d \n", i++, head->data);
            head = head->next;
        }
    }
     
    // 从尾部到头部打印节点
    void printLinkListFromTail(DLL tail){
        int i = 1;
        DList p = tail->back;
     
        if (p == NULL) printf("TAIL 为空值 \n");
     
        while (p != NULL){
            printf("第 %d 个节点为: %d \n", i++, p->data);
            p = p->pre;
        }
    }
     
    // 插入一个节点,考虑头部插入和尾部插入情况
    DList insertDNode(DList head, int index, int value, DLL tail){
     
        if (head == NULL) return NULL; // 如果是空节点
     
        DList p = head;
        Node *node = (Node*)malloc(sizeof(Node));
        node->data = value;
     
        if (index == 1){ // 头部插入节点
     
            node->next = head;
            head->pre = node;
            head = node;
        }
        else{
            // 找到需要插入的前一个节点
            int i = 1;
            while (i < index-1){
                p = p->next;
                i++;
                if (p == NULL){
                    printf("插入位置出错 \n");
                    return NULL;
                }
            }
            if (p->next == NULL){ // 从尾部插入节点
                p->next = node;
                node->pre = p;
                node->next = NULL;
                tail->back = node;  // 更新最后一个节点的位置
            }
            else{  // 从首尾之间插入节点
                p->next->pre = node;
                node->next = p->next;
                p->next = node;
                node->pre = p;
            }
        }
        return head;
     
    }
     
    // 删除指定数值的 节点
    DList deleteDNode(DList head, int value, DLL tail){
        // 考虑删除头部节点,尾节点,找不到情况
        DList p = head;
     
        // 如果是头部节点
        if (head->data == value){
            head->next->pre = NULL;
            head = head->next;
            return head;
        }
     
        // 找到当前节点
        while (p->data != value){
            p = p->next;
            if (p == NULL){
                printf("找不到指定的节点 \n");
            }
        } 
        if (p->next == NULL){ // 最后一个节点
            p->pre->next = NULL;
            tail->back = p->pre; // 记录最后一个节点的位置
            free(p);
        }
        else{
            p->pre->next = p->next;
            p->next->pre = p->pre;
            free(p);
        }
     
     
        return head;
     
    }
     
    int main(){
        DLL tail = (DLL)malloc(sizeof(D)); // 初始化
        DList head = creatDLL(4, tail);
     
        //head = insertDNode(head, 2, 100, tail);
        //printLinkList(head);
        head = deleteDNode(head, 1, tail);
        printLinkList(head);
     
        printf("从尾部到头部打印节点 --- \n");
        printLinkListFromTail(tail);
        printf("程序结束--- \n");
        return 0;
    }
    

    参考一下,如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月6日
  • 已采纳回答 10月29日
  • 创建了问题 10月29日