鏈表--已知集合A和B的元素分別用不含頭結點的單鏈表存儲,函數difference()用於求解集合A與B的差集,並將結果保存在集合A的單鏈表中。

已知集合A和B的元素分別用不含頭結點的單鏈表存儲,函數difference()用於求解集合A與B的差集,並將結果保存在集合A的單鏈表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成計算後A={10,20,30}。
鏈表結點的結構類型定義如下:

struct node 
{ 
    int elem; 
    node* next; 
}; 

思路:
遍歷A的每一個結點,通過A來遍歷B中的每一個結點。
當pa爲空時結束總循環。
如果此時pa所指的結點與pb所指的結點元素相同,或者pb爲空時跳出內循環。
如果此時pb存在,則說明找到了,這時候就要刪除。
如果pb此時指向空了,則pa要向後走一步。

void difference(node** LA,node* LB)
{
     if(LA == NULL || *LA == NULL || LB == NULL)
          return ;

     node* pa = *LA;
     node* pb = *LB;
     node* del = NULL;
     node* pre = NULL;

     //退出循環兩個條件,pa爲空
     while(pa)
     {
          //pb每一次都要從頭開始找
          pb = LB;
          while(pb && pb -> elem != pa -> elem)
                 pb = pb -> next;
          //如果這裏pb還存在也就是說滿足pa,pb兩個值相同
          if(pb)
          {
               //如果pre爲空
               if(pre == NULL)
                    *LA = pa -> next;
               else
                    pre -> next = pa -> next;

               del = pa;
               pa = pa -> next;
               free(del);
          }
          else
          {
                pre = pa;    
                pa = pa -> next;
          }
     }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章