murongmeili 2020-11-18 10:43 采纳率: 0%
浏览 99

数据结构链表储存删除按逆输出问题

先将键盘输入的一组整数依次存入单链表,然后删除其中的最大最小元素,最后将其余元素逆序输出。
样例输入
1 2 3 4 5 6

样例输出
5 4 3 2

  • 写回答

3条回答 默认 最新

  • 云镛 2020-11-18 12:56
    关注
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Node{
        int data;
        struct Node *next;
    }Node;
    
    void reverse_print(Node *head){
        if(head == NULL) return;
        reverse_print(head->next);
        printf("%d ",head->data);
    }
    
    //遍历链表,找到最大值和最小值的前一个节点
    
    Node *delete_max_min(Node *head){
        if(head == NULL)    return head;
    
        //注意:min和max记录的是最值的前一个节点,第一个值除外.
        //注意: min和max不要同时寻找,因为有可能最小值和最大值相邻,这样删除操作麻烦
        Node *min = head;
        Node *current = head;
    
        while(current->next != NULL){
    
            if(current->next->data < min->data){
                min = current;
            }
            current = current->next;
        }
        
        if(min == head){
            Node *delete_node = head;
            head = head->next;
            free(delete_node);
        }else{
            Node *delete_node = min->next;
            min->next = delete_node->next;
            free(delete_node);
        }
    
        //再判断一遍head是否为空
        if(head == NULL)    return head;
        Node *max = head;
        current = head;
        while(current->next != NULL){
    
            if(current->next->data > max->data){
                max = current;
            }
            current = current->next;
        }
       
    
    
        if(max == head){
            Node *delete_node = head;
            head = head->next;
            free(delete_node);
        }else{
            Node *delete_node = max->next;
            max->next = delete_node->next;
            free(delete_node);
        }
    
        return head;
    }
    
    Node *insert(Node *head, Node *node, int index){
        if(head == NULL){
            if(index != 0){
                return head;
            }
    
            head = node;
            return head;
        }
    
        if(index == 0){
            node->next = head;
            head = node;
            return head;
        }
        
        Node *current_node = head;
        int count = 0;
        while(current_node->next != NULL && count < index - 1){
            current_node = current_node->next;
            count++;
        }
    
        if(count == index - 1){
            node->next = current_node->next;
            current_node->next = node;
        }
    
        return head;
    }
    
    
    int main(){
        int n;
        Node *linkedlist = NULL;
        int i = 0;
        do{
            scanf("%d",&n);
            Node *node = (Node *)malloc(sizeof(Node));
            node->data = n;
            node->next = NULL;
            linkedlist = insert(linkedlist,node,i++);
        }while(getchar() != '\n');
        reverse_print(linkedlist);
        printf("\n");
        linkedlist = delete_max_min(linkedlist);
        reverse_print(linkedlist);
        printf("\n");
        return 0;
    }
    
    
    

     

    评论

报告相同问题?

悬赏问题

  • ¥20 python爬虫遇到空文本取不出来
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入