M087

02-程序修改题 软件154 范金瑞 464浏览

所属年份:2012.3;

下列给定程序的功能是:建立一个带头结点的单向链表,并用随机函数为各结点数据域赋值。函数fun的作用是求出单向链表结点(不包括头结点)数据域中的最大值,并且作为函数值返回。

请改正函数fun中的错误,使它能得出正确的结果。
注意:部分源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct aa
{
    int data;
    struct aa *next;
} NODE;
fun (NODE *h)
{
    int max=-1;
    NODE *p;
    /*************found**************/
    p=h;
    while(p)
    {
        if(p->data>max)
            max=p->data;
        /*************found**************/
        p=h->next;
    }
    return max;
}
outresult(int s, FILE *pf)
{
    fprintf(pf, "\nThe max in link :%d\n",s);
}
NODE *creatlink(int n, int m)
{
    NODE *h,*p,*s;
    int i;
    h=p=(NODE *)malloc(sizeof(NODE));
    h->data=9999;
    for(i=1; i<=n; i++)
    {
        s=(NODE *) malloc(sizeof(NODE));
        s->data=rand()%m;
        s->next=p->next;
        p->next=s;
        p=p->next;
    }
    p->next=NULL;
    return h;
}
outlink(NODE *h,FILE *pf)
{
    NODE  *p;
    p=h->next;
    fprintf(pf, "\n The LIST :\n\n HEAD");
    while(p)
    {
        fprintf(pf, "->%d",p->data);
        p=p->next;
    }
    fprintf(pf, "\n");
}
main()
{
    NODE *head;
    int m;
    system("CLS");
    head=creatlink(12,100);
    outlink(head,stdout);
    m=fun(head);
    printf("\nThe RESULT :\n");
    outresult(m,stdout);
}

【参考答案】

(1)p=h->next;
(2)p=p->next;

【解题思路】
(1)因为链表的头结点没有数据域,所以对指针p进行初始化时,要将p指向头结点的下一个结点。
(2)通过指针p的移动遍历链表,因此此处应改为p=p->next;。