有VC 编译器的朋友运行下这个程序。把结果贴上来就是。程序我改了下。应该能过编译了
程序如下: 编译能过的话 显示n 要求输入的时候输入5 然后依次输入3 2 1 9 5 把结果贴上来 如果是错误的话 把错误贴上来 我直接给分
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
typedef struct p
/*定义一个结构体,此结构体有一个前指针和一个后指针
,以及存放道值数值的双精度浮点数和存放此道值已经平滑多次的整型数*/
{ float daozhi;
int pinghua;
struct p *front;
struct p *next;
}POIN;
typedef struct x
/*定了一个结构体为解决后面对某个道值多次平滑的时候的操作次数决定
,此结构体的作用就是先记录起来对应的道值平滑的次数。
然后为下次对某个道值是否需要进行平滑操作的时候进行判断*/
{ int m;
struct x *nett;
};
void main()
{
int i,n,j;
double a,b,c;
/*三个临时变量
,在下面的程序中的道值平滑计算中作为临时量来用*/
struct x *haad,*q,*t;
POIN *head,*p,*s;
p=(POIN *)malloc(sizeof(POIN));
head=NULL;
haad=NULL;
q=(struct x *)malloc(sizeof(struct x));
q=NULL;
do
{
printf("请输入需要平滑的道值的个数 n=");
scanf("%d",&n); /*输入需要平滑的道值个数。*/
}
while(n<3);/*输入的道值个数不能少于三个*/
i=1;
while(i<=n)/*循环依次输入N个道值的值。*/
{
s=(POIN *)malloc(sizeof(POIN));
printf("请输入第%d 个平滑的道值 ",i);
scanf("%f",&s->daozhi);
s->pinghua=0; /*初始状态的道值对应的平滑次数都为零*/
if(head==NULL)/*建立存放道值的链表,其头指针为 head*/
{
s->front=NULL;
s->next=NULL;
head=p=s;
}
else
{
s->front=p;
s->next=NULL;
p->next=s;
p=s;
}
t=(struct x *)malloc(sizeof(struct x));
t->m=0;
t->nett=NULL;
if(haad==NULL) haad=q=t;
/*建立起来临时存储的链表
,表长与前面的道值链表长度应该是相等的*/
else
{
q->nett=t;
q=t;
}
i++;
}
i=1;
while(i<=(n-1)/2) /*根据输入的道值数量可以判断出来对道值链表的操作次数应该是
等于N-1除以2次,因此循环N-1除以2次*/
{
j=i-1;
s=head;
p=s;
q=haad;
t=q;
while(p!=NULL)
/*内循环条件为当操作结点不为空的时候*/
{
if(p->front!=NULL&&p->next!=NULL)
/*判断该结点是否有前驱结点以及后继结点,有的话进行下面的判断*/
{
if(p->front->pinghua==j&&p->next->pinghua==j)
/*判断该结点的前驱结点的道值平滑次数是否为第i操作次数减一次1,
比如如果结点总数为三的时候,那么只进行第一次操作?
条件就是其前驱结点存在和后继结点存在,并且前驱道值操作次数为0
后继道值的操作次数也有0次。那么条件成立。就对第二个道值操作一次。
此判断条件主要是解决了对多道值的操作情况判断,其规律就是:
N个道值。其中道值的操作最高次数恰好就等于道值总数-1乘以2次。
并且并且在奇数的情况下和偶数的情况下是相同的。*/
{
a=p->front->daozhi;
b=p->next->daozhi;
c=p->daozhi;
p->daozhi=(1.0/4.0)*(a+2*c+b);
q->m++;
/*若对某一道值进行了某次操作
,那么对应的操作次数链表中的点将为该道值的操作次数加一。*/
}
}
p=p->next;
q=q->nett;
}
while(s!=NULL&&t!=NULL)
{
s->pinghua=t->m;
/*将对应的操作次数的值赋值给对应的道值结构体中的pinghua这个变量。
以作为下次循环的时候是否对该道值进行操作进行判断。*/
s=s->next;
t=t->nett;
}
i++;
}
i=0;
printf("重心法道值平滑以后的值分别为:\n");
while(head)/* 输出操作过后的道值的值*/
{
printf("%4.3f",head->daozhi);
head=head->next;
if(!(++i%5)) printf("\n");
}
}
[ 本帖最后由 李若斌 于 2010-5-12 09:48 编辑 ]