顺序表的删除

已知A,BC为三个非递减有序的线性表,现要求对A表作如下操作:删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法。

第一行输入3个正整数m,n,p(m,n,p<=100),用空格分开,分别表示三个线性表中的元素个数,其后3行依次输入A,B,C表中的元素。

输出实现上述操作后的A表。

8 5 6

1 2 3 4 5 6 6 7

2 3 5 9 12
2 4 5 6 12 13

1 3 4 6 6 7


#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
 datatype data;
 struct node *next;
}listnode;
typedef listnode *linklist;

linklist creatlist(int a[],int n)//创建单链表
{
 int i;
 linklist head=(linklist)malloc(sizeof(listnode));
 linklist p,q;
 q=head;
  for(i=0;i<n;i++)
 {
        p=(linklist)malloc(sizeof(listnode));
        p->data=a[i];
  q->next=p;
  q=p;
 }
 q->next=NULL;
 return head;
}

linklist jiao(linklist head1, linklist head2)
{
    linklist head=(linklist)malloc(sizeof(listnode));
    linklist tail=head;
    tail->next = NULL;
    linklist s,p1=head1->next, p2 = head2->next;
    while (p1)
    {
        while (p2)
        {
            if (p2->data == p1->data)
            {
                s = (linklist)malloc(sizeof(listnode));
                s->data= p1->data;
                s->next = NULL;
                tail->next = s;
                tail = s;

                break;
            }
            p2 = p2->next;
        }
        p1 = p1->next;
        p2 = head2->next;
    }
    return head;
}

linklist cha(linklist head1, linklist head2)
{
   linklist  head = (linklist)malloc(sizeof(listnode));
    head->next = NULL;
    linklist tail = head;
    linklist LinkJiaoji = jiao(head1, head2);
    linklist s, p1 = head1->next, p3 = LinkJiaoji->next;
    while (p1)
    {
        while (p3)
        {
            if (p1->data == p3->data)
                break;
            p3 = p3->next;
        }
        if (!p3)
        {
            s = (linklist)malloc(sizeof(listnode));
            s->data= p1->data;
            s->next = tail->next;
            tail->next = s;
            tail = s;
        }
        p3 = LinkJiaoji->next;
        p1 = p1->next;
    }
    return head;
}
void printlist(linklist head)//输出单链表
{

 linklist p;
 for(p=head->next;p;p=p->next)
    printf("%d ",p->data);
}

int main()
{
   int n,m,u,i;
 int a[100],b[100],c[100];
 scanf("%d %d %d",&n,&m,&u);
 for(i=0;i<n;i++)
 scanf("%d",&a[i]);
 for(i=0;i<m;i++)
 scanf("%d",&b[i]);
 for(i=0;i<u;i++)
 scanf("%d",&c[i]);
 linklist la=creatlist(a,n);
 linklist lb=creatlist(b,m);
 linklist lc=creatlist(c,u);
 linklist ld=jiao(lb,lc);
 linklist le=cha(la,ld);
 printlist(le);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值