| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 739 人关注过本帖
标题:建立的单链表程序有错误。高手前来帮忙指点下错误。
只看楼主 加入收藏
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
结帖率:90.48%
收藏
 问题点数:0 回复次数:5 
建立的单链表程序有错误。高手前来帮忙指点下错误。
程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
typedef struct p
/*定义一个结构体,此结构体有一个前指针和一个后指针
,以及存放道值数值的双精度浮点数和存放此道值已经平滑多次的整型数*/
{ double 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));
  p=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");
  }
  getch();

}
编译能过。可是在运行时  显示n时输入5   然后依次输入3   2  1  9  5   
运行结果明显的指针指向的是未知的地址了。
搜索更多相关主题的帖子: 单链 
2010-05-12 08:52
yc2575757
Rank: 7Rank: 7Rank: 7
来 自:北京
等 级:黑侠
威 望:1
帖 子:113
专家分:522
注 册:2010-5-7
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
typedef struct p
/*定义一个结构体,此结构体有一个前指针和一个后指针
,以及存放道值数值的双精度浮点数和存放此道值已经平滑多次的整型数*/
{ double 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));
//  p=head=NULL;        //你说的问题是这个,你p刚开始开辟了内存,然后用赋为NULL,肯定不行
  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("%lf",&s->daozhi);            //你这里还有问题,double型输入要用lf~~
    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");
  }
  getchar();

}
2010-05-12 09:37
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
收藏
得分:0 
回复 2楼 yc2575757
额...晕死 我因为很急。等下看没人说错误。我就结了帖。我另外发了一个帖子。你把程序修改下。然后按我说的输入进去。把结果贴上去。我在那里把分给你吧。不好意思哈。实在是很急。
2010-05-12 09:40
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
抱歉
代碼讀一半實在讀不下去了
也沒時間幫忙調試了
說一個無關痛癢的小問題
程序代码:
  p=(POIN *)malloc(sizeof(POIN));
  p=head=NULL;
  haad=NULL;
  q=(struct x *)malloc(sizeof(struct x));
  q=NULL;
這裡內存泄漏了。。。

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2010-05-12 09:47
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
收藏
得分:0 
回复 4楼 succubus
  这个地方是有点问题。我已经修改了一下了。按照楼上的说法已经是把错误全部找出来了。
我现在需要有VC编译器的人帮忙运行下。输入方式已经说了 。我想看结果。
2010-05-12 09:51
yc2575757
Rank: 7Rank: 7Rank: 7
来 自:北京
等 级:黑侠
威 望:1
帖 子:113
专家分:522
注 册:2010-5-7
收藏
得分:0 
回复 3楼 李若斌
没事,又不是冲着分数去的,解决问题就行了~~呵呵~~
2010-05-12 17:04
快速回复:建立的单链表程序有错误。高手前来帮忙指点下错误。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017593 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved