解题思路: 首先遍历链表找到数据域值最大的节点以及它的前一个节点。然后修改指针,将最大节点从原来的位置移除,并将其插入到链表的末尾。 以下是算法代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct node { int data; struct node *link; }; // 找到最大节点及其前一个节点的函数 void findMaxAndPrev(struct node *list, struct node maxNode, struct node prevMax) { struct node *cur = list; *maxNode = list; *prevMax = NULL; while (cur!= NULL) { if (cur->data > (*maxNode)->data) { *maxNode = cur; *prevMax = cur == list? NULL : list; while (*prevMax!= NULL && (*prevMax)->link!= cur) { *prevMax = (*prevMax)->link; } } cur = cur->link; } } // 移动最大节点到链表末尾的函数 void moveMaxToEnd(struct node list) { struct node *maxNode, *prevMax; findMaxAndPrev(*list, &maxNode, &prevMax); if (prevMax!= NULL) { prevMax->link = maxNode->link; } else { *list = maxNode->link; } struct node *cur = *list; while (cur->link!= NULL) { cur = cur->link; } cur->link = maxNode; maxNode->link = NULL; } // 打印链表的函数 void printList(struct node *list) { struct node *cur = list; while (cur!= NULL) { printf("%d ", cur->data); cur = cur->link; } printf("\n"); } // 创建链表的函数 struct node *createList(int arr[], int n) { struct node *head = NULL, *tail = NULL; for (int i = 0; i < n; i++) { struct node *newNode = (struct node *)malloc(sizeof(struct node)); newNode->data = arr[i]; newNode->link = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->link = newNode; tail = newNode; } } return head; } // 释放链表内存的函数 void freeList(struct node *list) { struct node *cur = list; struct node *temp; while (cur!= NULL) { temp = cur; cur = cur->link; free(temp); } } int main() { int arr[] = {3, 12, 4, 9, 5, 1}; int n = sizeof(arr) / sizeof(arr[0]); struct node *list = createList(arr, n); printf("原始链表: "); printList(list); moveMaxToEnd(&list); printf("移动后链表: "); printList(list); freeList(list); return 0; } ``` 额外需要注意的逻辑点: 1. 注意内存的分配和释放,避免内存泄漏。 2. 处理链表操作时要小心空指针的情况。 3. 对于复杂的链表操作,建议多进行单元测试以确保代码的正确性。 [2025-01-12 21:51:29 | AI写代码神器 | 834点数解答]