已知遞增單鏈表A和B,求集合A和集合B的差集,保存在鏈表A中

算法思想:只需將鏈表A中共有的節點刪除即可。定義指針p,q分別指向A,B的頭結點,當A中元素小於B的時,p右移一位(B類似操作),值相等時,刪除該節點,任一指針爲空時停止循環

代碼: 
 

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;
typedef struct LNode{
   int data;
   struct LNode *next;
}LNode;

void differ(LNode *&A,LNode *B)  //刪節點
{
  LNode *p,*q,*s;
  p=A;
  q=B;
  while(p->next!=NULL&&q->next!=NULL)
  {
      if(p->next->data==q->next->data)
      {
          s=p->next;
          p->next=p->next->next;
          free(s);

      }
      else if(p->next->data<q->next->data) p=p->next;
      else if(p->next->data>q->next->data) q=q->next;
  }
}
void create(LNode *&A,int n) //創建鏈表
{
    int i,a[30];
    LNode *s,*r;
    A=(LNode *)malloc(sizeof(LNode));
    A->next=NULL;
    r=A;
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        s=(LNode *)malloc(sizeof(LNode));
        s->data=a[i];
        r->next=s;
        r=r->next;
    }
    r->next=NULL;
}
void find(LNode *A) //輸出鏈表
{
   LNode *p;
   p=A;
   while(p->next!=NULL)
   {
       printf("%d ",p->next->data);
       p=p->next;
   }
   printf("\n");
}

int main()
{
    LNode *A,*B;
    int n,m;
    scanf("%d%d",&n,&m);
    create(A,n);
    create(B,m);
    differ(A,B);
    find(A);
    return 0;
}

時間複雜度:O(m+n)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章