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; } }