用同一组数据,程序有时候正常运行出结果,有时候就崩了
我个人测试实在166行循环内崩掉,这种时好时坏我实在是不知道为啥了
这里有一组数据
10 10 0
1 1 10 2 1 3 7 4 3 5 3 6 8 7 8 8 11 9 11 10
3 1 3 2 10 3 6 4 3 5 10 6 3 7 4 8 5 9 10 10
```c#
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{//系数,指数,项结构体
int coef,expn;
}ElemType, term;
typedef struct LNode{//链表节点
ElemType data;
struct LNode *next;
}LNode, *Link, *Position;
typedef struct LinkList{//链表
Link head, tail;
int len;
}LinkList;
typedef LinkList Polynomial;//一元多项式
Status InitList(LinkList &L){//初始化链表
L.len=0;
Link p;
p = (Link)malloc(sizeof(LNode));
if(!p) return ERROR;
L.head = L.tail = p;
p->next=NULL;
}
Status MakeNode(Link &p, ElemType e){//申请节点
p = (Link)malloc(sizeof(ElemType));
if(!p) return ERROR;
p->data.coef = e.coef;
p->data.expn = e.expn;
return OK;
}
Status FreeNode(Link &p){//释放节点
if(!p) return ERROR;
Link p1;
p1 = p->next;
free(p);
p = p1;
return OK;
}
Status InsFirst(Link h, Link s){//s插入到h后面
s->next = h->next;
h->next = s;
return OK;
}
Status DelFirst(Link h){//删除h后第一个节点
if(!h->next) return ERROR;
Link q;
q = h->next;
h->next = h->next->next;
free(q);
return OK;
}
Position LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType)){//找到符合比较的第一个位置,这里是找比他大的插入
Link p;
p = L.head;
while(p->next){
switch(compare(e, p->next->data)){
case 1:
p = p->next;
break;
case 0:
return p;
case -1:
return p;
}
}
return p;
}
Status Opposite(Polynomial &L){//将多项式变为负的
Link p;
p = L.head->next;
while(p!=NULL){
p->data.coef *= -1;
p = p->next;
}
return OK;
}
Status AddTerm(Link a, Link b){//单项相加
a->data.coef += b->data.coef;
free(b);
}
void ShowPolynomial(Polynomial L){//打印多项式
Link p = L.head->next;
if(!p){
printf("0");
return;
}
if(p->data.coef==-1) printf("-");
else if(p->data.coef!=1) printf("%d",p->data.coef);
if(p->data.expn==1) printf("x");
else if(p->data.expn!=0) printf("x^%d",p->data.expn);
if(abs(p->data.coef)==1&&p->data.expn==0) printf("1");
p = p->next;
while(p){
// if(p->data.coef==0){
// p=p->next;
// continue;
// }
if(p->data.coef>0) printf("+");
if(p->data.coef==-1) printf("-");
else if(p->data.coef!=1) printf("%d",p->data.coef);
if(p->data.expn==1) printf("x");
else if(p->data.expn!=0) printf("x^%d",p->data.expn);
if(abs(p->data.coef)==1&&p->data.expn==0) printf("1");
p = p->next;
}
}
Status cmp(term a, term b){//比较函数
if(a.expn == b.expn) return 0;
else return (a.expn-b.expn)/abs(a.expn-b.expn);
}
int main(){
int n,m,t;//第一个多项式n项第二个m项,t0加法 1减法
scanf("%d%d%d",&n,&m,&t);
ElemType e;//定义
Link p;Link p1,p2;
Polynomial L1,L2,L;
InitList(L1);//初始化链表
InitList(L2);
InitList(L);
for(int i=0;i<n;i++){//输入L1
scanf("%d%d",&e.coef,&e.expn);
MakeNode(p,e);
InsFirst(L1.head,p);
}
for(int i=0;i<m;i++){//输入L2
scanf("%d%d",&e.coef,&e.expn);
MakeNode(p,e);
InsFirst(L2.head,p);
}
p1 = L1.head->next;
while(p1){//将L1加到L上
p = LocateElem(L,p1->data,cmp);
p2 = p1->next;
InsFirst(p,p1);
p1 = p2;
}
if(t) Opposite(L2);//减法就是加负的
p2 = L2.head->next;
while(p2){//将L2加到L上
p = LocateElem(L,p2->data,cmp);//找到合适位置的前一个位置p
p1 = p2->next;
//会在这个if里崩掉
if(p->next&&cmp(p2->data,p->next->data)==0){//可能与这一项指数相同也可能不同或者没有合适位置(接到后面)
AddTerm(p->next,p2);
if(p->next->data.coef==0){//如果加出0项就删掉
DelFirst(p);
}
}
else{
InsFirst(p,p2);//没找到位置加到末尾
}
p2 = p1;
}
p = L.head;
while(p&&p->next){//将L中的系数为0的项删掉
if(p->next->data.coef==0) DelFirst(p);
else p=p->next;
}
ShowPolynomial(L);//输出L
return 0;
}
```