数据结构习题——5单链表的删除

time_limit

3000MS

memory_limit

10000KB

description

已知A,B和C为三个非递减有序的线性表,均以单链表作为存储结构。现要求对A表作如下操作:删去那些既在B表中出现又在C表中出现的元素。试对单链表编写实现上述操作的算法,并释放A表中的无用结点空间。

input

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

output

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

sample_input

8 5 6

1 2 3 4 5 6 6 7

2 3 5 9 12
2 4 5 6 12 13

sample_output

1 3 4 6 6 7

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;

typedef struct Node{
    ElemType data;
    struct Node *next;
}LNode,*PLNode;

typedef struct Linklist{
    PLNode head;
}Linklist,*PLinklist;

PLinklist Initlist(int n)
{
    int i;
    PLNode p,q;
    PLinklist plist;

    plist=(PLinklist)malloc(sizeof(Linklist));
	q=plist->head=(PLNode)malloc(sizeof(LNode));
    for(i=0;i<n;i++){
        p=(PLNode)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        q->next=p;
        q=q->next;
    }
    q->next=NULL;
    return plist;
}

ElemType get_list(PLNode p)
{
    return p->data;
}

PLNode locate_list(PLinklist plist,ElemType x)
{
    PLNode p;
    p=plist->head->next;
    while(p!=NULL&&p->data!=x){
        p=p->next;
    }
    return p;
}

void delete_list(PLinklist plist,PLNode p)
{
    PLNode q;
    q=plist->head;
    while(q->next!=p){
        q=q->next;
    }
    q->next=p->next;
    //free(p);
}

void show_list(PLinklist plist)
{
    int i=0;
    PLNode p;
    p=plist->head->next;
    while(p){
        if(0!=i)printf(" ");
        printf("%d",p->data);
        p=p->next;
        i++;
    }
    printf("\n");
}
int main()
{
    PLNode pa,pb,pc,location;
    PLinklist la,lb,lc;
    ElemType x;
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);

    la=Initlist(a);
    lb=Initlist(b);
    lc=Initlist(c);

    //下面时b和c的交集
    pb=lb->head->next;
    while(pb){
        PLNode t=pb->next;
		x=get_list(pb);
        location=locate_list(lc,x);
        if(NULL==location){
            delete_list(lb,pb);
            pb=t;
        }
        else
            pb=pb->next;
    }

    //下面是差集:
    pa=la->head->next;
    while(pa){
    	PLNode t=pa->next;
        x=get_list(pa);
        location=locate_list(lb,x);
        if(NULL!=location){
            delete_list(la,pa);
            pa=t;
        }
        else
            pa=pa->next;
    }

	show_list(la);
    //printf("Hello world!\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41858784/article/details/82180301