链表

作者: Micason | 来源:发表于2016-06-30 21:36 被阅读70次

    1·N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,其功能是:求出平均分,并由函数值返回。
    例如,若学生的成绩是:85 76 69 85 91 72 64 87,则平均分应当是:78.625。

    #include <stdio.h>
    #include <stdlib.h>
    #define   N   8
    struct  slist
    {  double   s;
       struct slist  *next;
    };
    typedef  struct slist  STREC;
    double  fun( STREC *h  )
    {
    
      double ave=0.0;
      STREC *p=h->next;
      while(p!=NULL)
        { ave=ave+p->s; 
           p=p->next;
        }
      return ave/N;
    }
    
    STREC * creat( double *s)
    { STREC  *h,*p,*q;   int  i=0;
      h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
      while(i<N)
      { q=(STREC*)malloc(sizeof(STREC));
        q->s=s[i]; i++;  p->next=q; p=q;
      }
      p->next=0;
      return  h;
    }
    outlist( STREC *h)
    { STREC  *p;
      p=h->next; printf("head");
      do
      { printf("->%4.1f",p->s);p=p->next;}
      while(p!=0);
      printf("\n\n");
    }
    main()
    {  double  s[N]={85,76,69,85,91,72,64,87},ave;
       void NONO (  );
       STREC  *h;
       h=creat( s );   outlist(h);
       ave=fun( h );
       printf("ave= %6.3f\n",ave);
       NONO();
    }
    

    题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,求各结点数据域中数值的和,再对和求平均分。遍历链表时应定义一个指向结点的指针p,因为"头结点"中没有数值,所以程序中让p直接指向"头结点"的下一个结点,使用语句STREC *p=h->next。

    2.N名学生的成绩已在主函数中放入一个带有头节点的链表结构中,h指向链表的头节点。请编写函数fun,其功能是:找出学生的最高分,并由函数值返回。

    #include <stdio.h>
    #include <stdlib.h>
    #define   N   8
    struct  slist
    {  double   s;
       struct slist  *next;
    };
    typedef  struct slist  STREC;
    double  fun( STREC *h  )
    {
    
      double ave=0.0;
      STREC *p=h->next;
      while(p!=NULL)
        { ave=ave+p->s; 
           p=p->next;
        }
      return ave/N;
    }
    
    STREC * creat( double *s)
    { STREC  *h,*p,*q;   int  i=0;
      h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
      while(i<N)
      { q=(STREC*)malloc(sizeof(STREC));
        q->s=s[i]; i++;  p->next=q; p=q;
      }
      p->next=0;
      return  h;
    }
    outlist( STREC *h)
    { STREC  *p;
      p=h->next; printf("head");
      do
      { printf("->%4.1f",p->s);p=p->next;}
      while(p!=0);
      printf("\n\n");
    }
    main()
    {  double  s[N]={85,76,69,85,91,72,64,87},ave;
       void NONO (  );
       STREC  *h;
       h=creat( s );   outlist(h);
       ave=fun( h );
       printf("ave= %6.3f\n",ave);
       NONO();
    }
    void NONO()
    {/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
      FILE *in, *out ;
      int i,j ; double  s[N],ave;
      STREC *h ;
      in = fopen("in.dat","r") ;
      out = fopen("out.dat","w") ;
      for(i = 0 ; i < 10 ; i++) {
        for(j=0 ; j < N; j++) fscanf(in, "%lf,", &s[j]) ;
        h=creat( s );
        ave=fun( h );
        fprintf(out, "%6.3lf\n", ave) ;    
      }
      fclose(in) ;
      fclose(out) ;
    }
    
    
    

    本题使用循环语句遍历链表中的每个结点,用判断语句比较结点数据的域大小。注意,h是一个指向结构体类型的指针变量,若要引用它所指向的结构体中的某一成员时,要用指向运算符"->"。

    相关文章

      网友评论

          本文标题:链表

          本文链接:https://www.haomeiwen.com/subject/ofdfjttx.html