多项式相加 程序有点问题 求指点
多项式相加 数据从外部文件读取 我这有个程序 不过有问题 谁能帮忙看看 改改 谢谢#include<stdio.h>
#include <string.h>
#include<malloc.h>
#include <stdlib.h>
typedef struct nodelink
{
int c;//系数
int exp; //指数
struct nodelink *next;
}nodelink;
FILE *stream;
void printhead(nodelink *head)//输出连表数据
{ int pcount=1;//结点计数器
nodelink *phead;
phead=head->next; //指向第一个元素结点
while(phead!=NULL)
{
printf("第%d个结点的系数和指数分别为:",pcount);
printf("%2d%4d\n",phead->c,phead->exp);
phead=phead->next;
pcount++;
}
printf("\n");
}
void ADD(nodelink *heada,nodelink *headb)//实现多项式相加
{
nodelink *p,*q,*prea,*preb,*temp;
int sum;
p=heada->next;//分别使p和q指向第一个元素结点
q=headb->next;
prea=heada;
free(headb);//释放headb链表的头结点
while(p!=NULL&&q!=NULL)
{
if(p->exp<q->exp)
{
prea=p;
p=p->next;
}
else if(p->exp==q->exp)
{
sum=p->c+q->c;
if(sum!=0)
{
p->c=sum;
preb=q;
prea=p;
p=p->next;
q=q->next;
free(preb);
}
else//如果和为零
{
temp=p;
p=p->next;
prea->next=p;
free(temp);
preb=q;
q=q->next;
free(preb);
}
}
else //若p->exp大于q->exp
{
preb=q;
q=q->next;
preb->next=p;
prea->next=preb;
prea=prea->next;
}
}
if(q!=NULL)
prea->next=q;
printhead(prea);
}
int main(int argc, char* argv[])
{
void Add(nodelink *heada,nodelink *headb );
char buf[256];
char *token;
char seps[] = ",;";// 文本转化后,回车将变成一个字符,是\n,不是\r
nodelink * list_head1 =NULL;
nodelink * list_head2 =NULL;
nodelink * list_rear =NULL;
nodelink * temp_node;
if( (stream = fopen( argv[1], "r" )) == NULL )
printf( "The file 'data' was not opened\n" );
else
printf("OK!\n");
memset(buf,0,256);//新的初始化的方法
fscanf( stream, "%s", buf );//读取文件,并且将文件按格式提取出,输出存在buf中
token = strtok( buf, seps );
while( token != NULL )
{
temp_node = (struct nodelink *)malloc(sizeof(nodelink)); //为临时节点分配内存
temp_node->next=NULL; //空指针
temp_node->c = atof(token ); // 系数;
token = strtok( NULL, seps ); //开始下一字节的比较
temp_node->exp =atoi(token); //指数
if(list_head1==NULL){
list_head1=temp_node;
list_rear=temp_node;
}
else{
list_rear->next =temp_node;
list_rear = temp_node;
}
token = strtok( NULL, seps ); // 从当前位置开始下一处寻找
}
//printf(buf);
printhead(list_head1);
printf("\n");
fscanf( stream, "%s", buf );//读取文件,并且将文件按格式提取出,输出存在buf中
//printf(buf);
//本例用来说明stream文件指针是可以移动的。当执行第一句fscanf的时候,会略掉转义字符,结束在最后一个转义字符之前。
//当第一句执行完毕之后,在第二次的执行的时候,stream指针已经跳向刚才完毕的地方,书中说过,有个函数可以让stream指针再次归零,所以说此时就可以再接着找了。
token = strtok( buf, seps );
while( token != NULL )
{
nodelink * temp;
temp = (struct nodelink *)malloc(sizeof(nodelink)); //为临时节点分配内存
temp->next=NULL; //空指针
temp->c = atof(token ); // 系数;
token = strtok( NULL, seps ); //开始下一字节的比较
temp->exp =atoi(token); //指数
if(list_head2==NULL){ //判断是不是头指针
list_head2=temp;
list_rear=temp;
}
else{
list_rear->next =temp;
list_rear = temp;
}
token = strtok( NULL, seps ); // 从当前位置开始下一处寻找
}
//printf(buf);
printhead(list_head2);
printf("\n");
fclose(stream);
Add(list_head1,list_head2);
free(list_head1);
free(list_head2);
return 0;
}