void SortPolyn(polynomail *p) { Link *p1, *p2; //采用直接插入排序 for (p1 = p->head->next; p1; p1 = p1->next) { for (p2 = p->head->next; p2 != p1; p2 = p2->next) { if (p2->data->expn == p1->data->expn) { //若后边待排序的节点的指数跟前面已排序 Link *pri; //节点的指数相同,则应该合并两项,即删除后者,并入前者 p2->data->coef += p1->data->coef; pri = PriorPos(*p, p1); DelFirst(pri, &p1); FreeNode(p1); --p->len; if (fabs(p2->data->coef) < 1e-6) { //如果合并后系数为0,那也要把这个节点删除 pri = PriorPos(*p, p2); DelFirst(pri, &p2); FreeNode(p2); --p->len; } p1 = pri; break; } else if (p1->data->expn < p2->data->expn) { Link *pri1, *pri2; pri1 = PriorPos(*p, p1); DelFirst(pri1, &p1); pri2 = PriorPos(*p, p2); InsFirst(pri2, p1); p1 = pri1; break; } } } p->tail = GetLast(*p); }
Status InsBefore(LinkList *L,Link *p,Link s) { /* 已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前, */ /* 并修改指针p指向新插入的结点 */ Link q; q=PriorPos(*L,*p); /* q是p的前驱 */ if(!q) /* p无前驱 */ q=(*L).head; s->next=*p; q->next=s; *p=s; (*L).len++; return OK; }
static Status InsBefore(LinkList &L,Link &p,Link s) { // 已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前, // 并修改指针p指向新插入的结点 Link q; q=PriorPos(L,p); // q是p的前驱 if(!q) // p无前驱 q=L.head; s->next=p; q->next=s; p=s; L.len++; return OK; }