qiu关于未知数据量的输入如何结束的问题
情况很简单,原题是用单链表做一个多项式相加减的程序,问题不在于多项式加减的算法,而是在于数据的录入,我想用scanf进行数据的输入,但是不知道该如何结束,试过特殊数据,EOF等方式,都没能保证程序的正常录入。希望大神指点啊。。。我最近一直纠结于信息的如何输入的问题。。。附加用c语言写的程序代码如下:
程序代码:#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
typedef struct node//定义数据类型
{
int p;//系数
int e;//指数
struct node*next;
}Polynomial,*P_Polynomial;
P_Polynomial do_malloc(void)//分配并判断是否分配成功
{
P_Polynomial t;
if(!(t=(P_Polynomial)malloc(sizeof(P_Polynomial))))
{
printf("内存不足!\n");
exit(1);
}
return t;
}
void Add_Polynomial(P_Polynomial i1,P_Polynomial i2)//加法函数
{
P_Polynomial Pre1,Pre2;
Pre1=i1;
Pre2=i2;
while (i1&&i2)
{
if(i1->e==i2->e)
{
i1->p=i1->p+i2->p;
if(i1->p==0)
{
Pre1->next=i1->next;
free (i1);
i1=Pre1->next;
i2=i2->next;
free(Pre2);
}
else
{
Pre1=i1;
Pre2=i2;
i1=i1->next;
i2=i2->next;
free(Pre2);
}
}
if(i1->e<i2->e)
{
Pre1=i1;
i1=i1->next;
}
else
{
P_Polynomial t;
t=do_malloc();
t->p=i2->p;
t->e=i2->e;
t->next=i1;
Pre1->next=t;
Pre1=Pre1->next;
Pre2=i2;
i2=i2->next;
free(Pre2);
}
}
while(i2)
{
P_Polynomial t;
t=do_malloc();
t->p=i2->p;
t->e=i2->e;
t->next=NULL;
Pre1->next=t;
Pre1=Pre1->next;
Pre2=i2;
i2=i2->next;
free(Pre2);
}
}
void do_print(P_Polynomial p1)
{
while(p1)
{
printf("%d*x^%d",p1->p,p1->e);
p1=p1->next;
}
printf("\n");
}
void main()
{
int chose;
printf("请选择运算类型,1=加法,2=减法\n");
scanf("%d",&chose);
P_Polynomial head1,data1,head2,data2,temp;//用temp指针来记录data的前一个数据,辅助完成输入
head1=do_malloc();
head2=do_malloc();
data1=head1;
data2=head2; //用data访问数据,head作为头指针
printf("请分别输入两个需要运算的一元多项式,每个多项式以EOF结束\n");
while(EOF!=scanf("%d*x^%d",&(data1->p),&(data1->e)))
{
data1->next=do_malloc();
temp=data1;
data1=data1->next;
}
temp->next=NULL;
free(data1);
while('\n'!=getchar());
while(EOF!=scanf("%d*x^%d",&(data2->p),&(data2->e)))
{
data2->next=do_malloc();
temp=data2;
data2=data2->next;
}
temp->next=NULL;
free(data2);
switch(chose)
{
case 1:
{
Add_Polynomial(head1,head2);
do_print(head1);
break;
}
case 2:
{
temp=head1;
while(temp)//取反,将减法与加法用同一个函数进行
{
temp->p=-(temp->p);
temp=temp->next;
}
Add_Polynomial(head1,head2);
do_print(head1);
break;
}
default:break;
}
}






