已知带附加头结点的单链表,其结点数据结构如下: struct node ( int data ; struct node * next ;15.0分));假设该单链表中没有值重复的结点,试编写函数,实现如下功能:(1)(7分)找出单链表中具有最大值的结点,返回该结点地址,使用如下函数原型:* fnGetMaxNode ( struct node * Head );(2)(8分)把最大值移到单链表的最前面,使之成为首结点,移动成功返回1,失败返回0.使用如下函数原型: bool fnMove ( struct node * Head ); struct
时间: 2024-03-10 18:48:02 浏览: 81
(1) 找出单链表中具有最大值的结点,返回该结点地址:
```c
struct node *fnGetMaxNode(struct node *Head) {
struct node *p = Head->next;
struct node *maxNode = p;
int maxData = p->data;
while (p != NULL) {
if (p->data > maxData) {
maxData = p->data;
maxNode = p;
}
p = p->next;
}
return maxNode;
}
```
详细解释:
该函数实现了在带附加头结点的单链表中查找具有最大值的结点的功能。首先,定义一个指针 p 指向第一个结点(即头结点的下一个结点),并将其作为具有最大值的结点。然后,遍历单链表,如果遇到比当前最大值更大的结点,则更新最大值和最大值结点。最后返回最大值结点的地址。
(2) 把最大值移到单链表的最前面,使之成为首结点,移动成功返回1,失败返回0:
```c
bool fnMove(struct node *Head) {
struct node *prev = Head;
struct node *p = prev->next;
struct node *maxNode = fnGetMaxNode(Head);
if (maxNode == p) {
return true; // 最大值已经在第一个结点,无需移动
}
while (p != maxNode) {
prev = p;
p = p->next;
}
prev->next = maxNode->next;
maxNode->next = Head->next;
Head->next = maxNode;
return true;
}
```
详细解释:
该函数实现了将带附加头结点的单链表中具有最大值的结点移到最前面的功能。首先,调用 fnGetMaxNode 函数找到具有最大值的结点。如果该结点已经是第一个结点,则无需移动,直接返回 true。否则,需要遍历单链表找到最大值结点的前驱结点,将其从单链表中删除,并将最大值结点插入到头结点之后成为新的第一个结点。最后返回 true 表示移动成功。
阅读全文