http://acm.sdibt.edu.cn:8080/judge/contest/view.action?cid=316#problem/C
这道题,我是将a表中的元素逐个与b表中的比较,将无重复的存入新建的head3表中再打出
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int data;
    struct node *next;
}Node;
Node *create(int m){//建表,有头结点
    int i;
    Node *p,*q,*head;
    head=p=q=(Node *)malloc(sizeof(Node));
    p->next=NULL;
    scanf("%d",&p->data);
    for(i=0;i<m-1;i++){
        p=(Node *)malloc(sizeof(Node));
        p->next=NULL;
        scanf("%d",&p->data);
        q->next=p;
        q=p;
    }
    q->next=NULL;
    return head;
}
Node *minus(Node *head1,Node *head2,int *k){//求差集,*k记录差集元素个数
    Node *p,*head3,*temp,*head,*q=head2;
    int n=0,t=0;
    head=head3=temp=(Node *)malloc(sizeof(Node));//head3每次满足条件就移动,用于连接差集元素
    head3->next=NULL;//让头结点指针域为空
    while(head1!=NULL){
        n=0;
        while(head2!=NULL){
            if(head1->data==head2->data){
                n=1;//n判断是否有相同元素
                break;
            }
            head2=head2->next;//跳至下一个b表元素
        }
        head2=q;//a表中一个元素比较完后,b表回到第一个元素
        if(n==0){
            t++;//t的作用与*k相同
            p=(Node *)malloc(sizeof(Node));//新建p结点用于连接a表中满足条件的元素
            p->next=NULL;
            p->data=head1->data;
            head3->next=p;
            head3=p;
        }
        head1=head1->next;//a表换下一个元素比较
    }
    temp=temp->next;//去除头结点方便打出链表
    *k=t;
    return temp;//返回新链表中第一个结点位置
}
void print(Node *temp,int t){
    while(temp!=NULL){
        printf("%d ",temp->data);
        temp=temp->next;
    }
    printf("\n");
    printf("%d",t);
}
int main(){
    int m,k;
    Node *head1,*head2,*temp;
    scanf("%d",&m);
    head1=create(m);
    scanf("%d",&m);
    head2=create(m);
    temp=minus(head1,head2,&k);
    print(temp,k);
    return 0;
}

发表评论

电子邮件地址不会被公开。

Post Navigation