我编写了一个程序来生成单项式和多项式以及打印单项式和多项式。数据从键盘输入。例如,首先输入数据组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;
}
答案 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
的调用之外即删除列表中的其他已分配节点,您有head
和tail
的“空”节点。因此,当您遍历链接列表时,您需要考虑head
和tail
节点是空的,否则您将获得这些节点的一些奇数值,因为它们未初始化。