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);
}
Exemple #2
0
 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;
 }
Exemple #3
0
 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;
 }