输入C程序

时间:2011-06-22 20:44:41

标签: c

我编写了一个程序来生成单项式和多项式以及打印单项式和多项式。数据从键盘输入。例如,首先输入数据组3的数量,然后输入数据:1,3,2,4,3,6,3,4,2(每组有3个元素)。我需要输出单项Y ^ {1} {2,3} Y ^ {4} {3,6} Y ^ {3} _ {4,2}。我的程序可以工作。但输出不正确。我认为该计划的问题在以下部分。我认为scanf在以下方面并不好。还有其他更好的输入法来解决这个问题吗?整个计划在http://hi.baidu.com/lijr03/blog/item/51e17b0c63614bc863d98629.html

monomial create_monomial(int number) /* create a monomial */
{

   monomial m,s;
   monomial p;
   int i;


   printf("Please input the parameters (for example,  2, 2, 3 denotes the monomial P^{2}_{2,3}). The first subscripts i's of P's should be in increase order.");
   m=(monomial)malloc(sizeof(monomial_node));
   m->head=m->tail=(monomial)malloc(sizeof(monomial_node));

   if(m->head==NULL)
   {
     return NULL;
   }

   m->head->next=m->tail;

   m->tail->next=NULL;

   p=(monomial)malloc(sizeof(monomial_node));

   m->head->next=p;

   p->next=m->tail;   

   scanf("%d", &((p->y).l)); 
   scanf("%d", &((p->y).i));
   scanf("%d", &((p->y).k));

  if(number > 1)
  {
   for(i=0;i<number-1;i++)

   {

    s=(monomial)malloc(sizeof(monomial_node));

    scanf("%d", &((s->y).l)); 
    scanf("%d", &((s->y).i));
    scanf("%d", &((s->y).k));

    s->next=p->next;     /* insert the node a */

    p->next=s;

    free(s);            

   }
  }
   return m;
}

3 个答案:

答案 0 :(得分:3)

free(s)表示你正在摧毁刚刚创建的单项式。您在其上方创建的指针(来自p)意味着您在处理m时将指向可能无效的内存位。

答案 1 :(得分:1)

scanf是一个不错的选择,但它可能有点奇怪。我认为在这种情况下你需要一个像“%d,%d,%d”这样的scanf格式。然而,最好的办法是编写一个简单的小程序,只输入数据并进行实验。它看起来像

 int main(){
     int x, y, z ;

     scanf("%d,%d,%d", &x, &y, &z);
     printf("%d,%d,%d\n", x,y,z);
     return 0;
 }

一旦你有了这个工作,让真正的程序工作应该是直截了当的。

答案 2 :(得分:0)

由于您没有显示错误输出的内容,因此我只能对问题的具体内容进行有根据的猜测,但除了错误的scanf()来电和对free的调用之外即删除列表中的其他已分配节点,您有headtail的“空”节点。因此,当您遍历链接列表时,您需要考虑headtail节点是空的,否则您将获得这些节点的一些奇数值,因为它们未初始化。