C语言数据结构 查找并删除单链表中最大值结点并返回值

发布时间 2023-11-22 11:51:05作者: XiaMuqingyuan

代码实现

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 typedef struct Node // 定义一个结构体
  5 {
  6     float data;
  7     struct Node *next;
  8 } Node;
  9 
 10 Node *Chuangzao_LinkedList() // 创建一个链表
 11 {
 12     Node *head = NULL; // 定义头指针
 13     Node *tail = NULL; // 定义尾指针
 14     /*并初始为null*/
 15     float Yuan_Su; // 定义元素
 16     printf("请输入多个整数(用空格分开,并以-1结束):\n");
 17     while (1)
 18     {
 19         scanf("%f", &Yuan_Su); // 循环输入元素
 20 
 21         if (Yuan_Su == -1)
 22         {
 23             break; // 输入-1,退出循环
 24         }
 25 
 26         Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新结点,用malloc分配内存
 27         newNode->data = Yuan_Su;
 28         newNode->next = NULL;
 29 
 30         if (head == NULL) // 如果为头为空
 31         {
 32             head = newNode; // 指向新结点
 33             tail = newNode;
 34         }
 35         else
 36         {
 37             tail->next = newNode; // 插入链表尾部
 38             tail = newNode;       // 更新指针
 39         }
 40     }
 41 
 42     return head;
 43 }
 44 
 45 float Shanchu_MaxNode(Node **head) // 定义删除链表最大值的函数
 46 {
 47     if (*head == NULL)
 48     {
 49         printf("链表为空!");
 50         return -1;
 51     }
 52 
 53     Node *Dang_qian = *head; // 当前结点为头
 54     Node *maxNode = NULL;    // 最大结点和当前结点前一个为空
 55     Node *Qian_yige = NULL;
 56     float maxValue = Dang_qian->data;
 57 
 58     while (Dang_qian != NULL && Dang_qian->next != NULL)
 59     {
 60         if (Dang_qian->next->data > maxValue)
 61         {
 62             maxValue = Dang_qian->next->data;
 63             maxNode = Dang_qian;
 64             Qian_yige = maxNode;
 65         }
 66         else
 67         {
 68             Dang_qian = Dang_qian->next;
 69         }
 70     }
 71 
 72     if (maxNode == NULL)
 73     {
 74         maxNode = *head;
 75         *head = (*head)->next;
 76     }
 77     else
 78     {
 79         maxNode = maxNode->next;
 80         Qian_yige->next = maxNode->next;
 81     }
 82 
 83     float maxData = maxNode->data;
 84     free(maxNode);
 85     return maxData;
 86 }
 87 
 88 void printLinkedList(Node *head)
 89 {
 90     if (head == NULL)
 91     {
 92         return;
 93     }
 94     printLinkedList(head->next);
 95     printf(" %.2f->", head->data);
 96 }
 97 
 98 int main()
 99 {
100     Node *head = Chuangzao_LinkedList();
101     float maxData = Shanchu_MaxNode(&head);
102     printf("删除的最大值为:%.2f\n", maxData);
103     printf("删除链表最大的值后,链表的值如下:\n");
104     printLinkedList(head);
105     printf("\n");
106     system("pause"); // vscode中加入可以使cmd可以保留在屏幕上,删除则会一闪而过
107     return 0;
108 }

测试结果