首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

链表操作,该如何解决

2013-10-14 
链表操作//已知:struct Polynomial{int coef//系数int expn//指数struct Polynomial* next}/*该函数用

链表操作


//已知:
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);
 
}
链表 合并 c
[解决办法]
引用:
Quote: 引用:

           while(p->expn == q->expn && q)
    如果 q为NULL,你的程序会Crash
   改成这样好点while(q && p->expn == q->expn)
这有区别吗?


q && q->expn 
如果q为NULL, q->expn 就不会执行。
不过我忘了这个是不是标准里的了。
[解决办法]
先保证逻辑正确,再写代码
合并同类项
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; 
}

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

           while(p->expn == q->expn && q)
    如果 q为NULL,你的程序会Crash
   改成这样好点while(q && p->expn == q->expn)
这有区别吗?


q && q->expn 
如果q为NULL, q->expn 就不会执行。
不过我忘了这个是不是标准里的了。

是。
逻辑短路

热点排行