题目描述:
在一个带头结点的链表中找出最大值的元素,并且将其删去后把其最大值赋值给头结点
思路:
从文件中读取链表信息,采用尾插法建立带头结点的单链表
循环找到最大的max值,删除并赋值给头结点
删除操作是王道数据结构里面看到的,昨天走路和男票回忆起来了!!
代码实现:
// 在一个带头结点的链表中找出最大值的元素,并且将其 删去后把其最大值赋值给头结点
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int data;
struct LNode* next;
}LinkNode;
int MaxNum(LinkNode *L,int n)
{
int max = 0;
// 指向下一节点的指针p
LinkNode* p=L->next;
for (int i = 0; i < n;i++)
{
if(max<p->data)
max = p->data;
p = p->next;
}
return max;
}
int main()
{
int n=0;
FILE *fp = fopen("./linkdata.txt", "r");
fscanf(fp,"%d\n",&n);
// 头指针
LinkNode* L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
// 尾指针
LinkNode* rear = (LinkNode*)malloc(sizeof(LinkNode));
rear = L;
// 尾插法建立单链表
for (int i = 0; i < n;i++)
{
LinkNode* q = (LinkNode*)malloc(sizeof(LinkNode));
fscanf(fp, "%d ", &q->data);
rear->next = q;
rear = q;
}
printf("Created!!");
int max;
max = MaxNum(L, n);
// printf("%d", max);
//按值查找
LinkNode *p=L;
LinkNode *q;
for (int i = 0; i < n;i++)
{
q = p->next;
if(p->data==max)
{
int tmp=p->data;
p->data = q->data;
q->data = tmp;
L->data = tmp;
p->next = q->next;
break;
}
p = q;
}
printf("%d", L->data);
}