该程序的原理就是,将链表中的所有值赋值到一个指针中然后将该指针整理为有序表,最后的结点为最大值
1、将以下代码作为该链表的信息储存包,方便为另一个指针分配内存
struct LNode
{
int data;//*数据域
struct LNode *next;//*指针域
};
struct number
{//*信息储存包
struct LNode *a0;//*用于储存链表
int length;//*用于储存结点(头结点除外)数量
};
2、寻求最大值的算法的代码如下
int max(struct number a)//*寻求链表中最大值的算法
{
struct LNode *b;
b=a.a0->next;
int *c,d;
c=(int*)malloc(a.length*sizeof(int));//*为这个指针分配内存
for(d=0;d<a.length;d++)
{
c[d]=b->data;//*赋值
b=b->next;//*指向下一个结点
}
for(;;)//*整理这个指针的信息
{
for(d=0;d<a.length;d++)
{
if(c[d]>c[d+1])//*判断是否大于后缀,如果是,则进行元素交换
{
int e;
e=c[d];
c[d]=c[d+1];
c[d+1]=e;
break;//*方便判断该指针是否为有序表
}
}
if(d==a.length)//*如果该指针成为了有序表
{
break;
}
}
return c[a.length-1];//*将链表中的最大值作为返回值
}
3、重点强调
在创建该链表时必须将所有结点(头指针除外)数量确定,才能为那个指针分配内存
代码如下:
struct LNode *a0()
{
struct LNode *a;//*创建结点
a=(struct LNode*)malloc(sizeof(struct LNode));//*为该结点分配内存
a->next=NULL;//*将该结点的后缀置空
return a;//*返回该结点
}
struct number *a1()
{
struct LNode *a,*b;
a=a0();//*将头节点初始化
b=a;
int c[]={2,454,6547,76,7,7,5,64,35,534,4,543,54,354,53};//*将要赋值到链表中的数组
int d;
for(d=0;d<sizeof(c)/sizeof(int);d++)//*将该数组的所有元素赋值到链表中
{
struct LNode *e;//*创建新结点
e=a0();//*初始化该结点
e->data=c[d];//*将元素赋值到新结点的数据域
b->next=e;//* *b的下缀指向*e
b=e;//*指向下一个结点
}
struct number *f;//*创建信息储存包
f=(struct number*)malloc(sizeof(struct number));//*为信息储存包分配空间
f->a0=a;//*将该链表储存到信息储存包
f->length=sizeof(c)/sizeof(int);//*将链表的结点(头结点除外)数量储存在信息储存包
return f;//*返回该信息储存包
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
struct LNode
{
int data;//*数据域
struct LNode *next;//*指针域
};
struct number
{//*信息储存包
struct LNode *a0;//*用于储存链表
int length;//*用于储存结点(头结点除外)数量
};
struct LNode *a0()
{
struct LNode *a;//*创建结点
a=(struct LNode*)malloc(sizeof(struct LNode));//*为该结点分配内存
a->next=NULL;//*将该结点的后缀置空
return a;//*返回该结点
}
struct number *a1()
{
struct LNode *a,*b;
a=a0();//*将头节点初始化
b=a;
int c[]={2,454,6547,76,7,7,5,64,35,534,4,543,54,354,53};//*将要赋值到链表中的数组
int d;
for(d=0;d<sizeof(c)/sizeof(int);d++)//*将该数组的所有元素赋值到链表中
{
struct LNode *e;//*创建新结点
e=a0();//*初始化该结点
e->data=c[d];//*将元素赋值到新结点的数据域
b->next=e;//* *b的下缀指向*e
b=e;//*指向下一个结点
}
struct number *f;//*创建信息储存包
f=(struct number*)malloc(sizeof(struct number));//*为信息储存包分配空间
f->a0=a;//*将该链表储存到信息储存包
f->length=sizeof(c)/sizeof(int);//*将链表的结点(头结点除外)数量储存在信息储存包
return f;//*返回该信息储存包
}
int max(struct number a)//*寻求链表中最大值的算法
{
struct LNode *b;
b=a.a0->next;
int *c,d;
c=(int*)malloc(a.length*sizeof(int));//*为这个指针分配内存
for(d=0;d<a.length;d++)
{
c[d]=b->data;//*赋值
b=b->next;//*指向下一个结点
}
for(;;)//*整理这个指针的信息
{
for(d=0;d<a.length;d++)
{
if(c[d]>c[d+1])//*判断是否大于后缀,如果是,则进行元素交换
{
int e;
e=c[d];
c[d]=c[d+1];
c[d+1]=e;
break;//*方便判断该指针是否为有序表
}
}
if(d==a.length)//*如果该指针成为了有序表
{
break;
}
}
return c[a.length-1];//*将链表中的最大值作为返回值
}
main()
{
char aa[]="Math Dash的求链表最大值的程序";
char ab[strlen(aa)+6];
sprintf(ab,"title %s",aa);
system(ab);
puts(aa);
struct number *a;//*创建信息储存包
a=a1();//*为该信息储存包储存数据(分别为链表信息,除头结点的所有结点的数量)
struct LNode *b;
b=a->a0->next;
printf("这是该链表\n");
while(b)
{
printf("%d\n",b->data);
b=b->next;
}
printf("\n该链表最大值为%d\n",max(*a));//*显示最大值
system("pause");
return 0;
}
程序运行结果如下: