链表操作
链表 合并 c
//已知:
struct Polynomial
{
int coef;//系数
int expn;//指数
struct Polynomial* next;
};
/*该函数用于实现合并同类项的第二步:(第一步系数相加)去掉相同项(p->expn == q->expn) 。为什么程序运行后自动停止呢?*/
void Delete(struct Polynomial * la )
{
struct Polynomial *p,*q;
p=la;
if(la)
{
do
{
q=p->next;
while(p->expn == q->expn && q)
{
p->next =q->next;
free(q);
q=p->next;
}
p=p->next;
}while(p->next);
printf("\nxx");
}
else exit(1);
}
合并同类项
struct Polynomial {
int coef; //系数
int expn; //指数
struct Polynomial* next;
};
bool MergeNode( Polynomial *a, Polynomial *b)
{
assert(a && b);
//if(!a
[解决办法]
!b)return false;
if(a->expn == b->expn){//指数相等,需要合并
a->coef += b->coef; //合并同类项的数学意义,系数相加。
return true; //返回true,表示执行了合并运算
}
return false; //返回false,表示没有,也不需要,合并。
}
Polynomial * MergeList( Polynomial *a)
{
assert(a );
if(!a)return NULL;
Polynomial *p=a,*q,*r;//当前节点p 初始化为a,前向指针r,要合并的节点指针q;
do{
r = p; //从下各节点开始,依次合并到本节点,前指针就是置为当前节点。
while(q = r->next ){ //下个节点是合并对象。
if(MergeNode( p,q)){ //需要合并,合并之并,删除被合并的节点
r ->next = q->next; //取下节点
free(q); //释放内存
}else { //不需要合并,不合并,向下走
r = r->next; //没合并,到下个节点,看看
};
}while(p = p->next);
return a;
}
这有区别吗?
while(p->expn == q->expn && q)
如果 q为NULL,你的程序会Crash
改成这样好点while(q && p->expn == q->expn)
q && q->expn
如果q为NULL, q->expn 就不会执行。
不过我忘了这个是不是标准里的了。