1. 程式人生 > >openjudge資料結構練習集 1:集合的交運算(單鏈表)

openjudge資料結構練習集 1:集合的交運算(單鏈表)

集合的交運算(單鏈表)

總時間限制: 
1000ms
記憶體限制: 
65536kb
描述

利用兩個單鏈表LA和LB分別表示兩個集合A和B(即線性表中的資料元素即為集合中的成員),要求一個新的集合A=A

∩B。這就要求對連結串列作如下操作:將存在於表LA中,同時又存在於LB中的資料元素保留,將LA中其他元素刪除。

例如:輸入8個整數:3 6 7 12 14 8 9 2,建立連結串列LA;再輸入10個整數:8 9 5 21 22 18 29 25 80 12,建立連結串列LB;則做集合的交運算後,LA變為:12 8 9

   要求:必須使用連結串列,程式中必須有連結串列的相關操作:初始化、插入、刪除、輸出連結串列中元素、銷燬。不滿足要求的程式即使通過,也會算作0分。

輸入
輸入包含3行:
第一行是兩個整數n和m(1 <= n,m <= 200),用空格分隔,分別代表集合A和B的元素個數。
第二行包含n個整數。每個整數之間用空格分隔;每個整數的取值在32位有符號整數範圍以內。代表集合A的元素。
第三行包含m個整數。每個整數之間用空格分隔;每個整數的取值在32位有符號整數範圍以內。代表集合B的元素。
輸出
輸出只有1行:
按輸入時的順序輸出交集中元素的值,每元素之間用空格分隔。
樣例輸入
8 103 6 7 12 14 8 9 28 9 5 21 22 14 29 25 80 12
樣例輸出
9 8 12
#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20

typedef int Status;
typedef int ElemType;

typedef struct Node
{
    ElemType data;
    struct Node *next;
} Node;

typedef struct Node *LinkList;

Status InitList(LinkList *L);//初始化連結串列

Status ListInsert(LinkList *L,int i,ElemType e);//往連結串列中第i個位置插入資料

Status ListDelete(LinkList *L,int i);//把連結串列中第i個位置的資料刪除

Status visit(ElemType c)
{
    printf("%d ",c);
    return OK;
}

int LocateElem(LinkList L,ElemType e)
{
    int i=0;
    LinkList p=L->next;
    while(p)
    {
        i++;
        if(p->data==e) /*  找到這樣的資料元素 */
        return i;
        p=p->next;
    }
    return 0;
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    LinkList la,lb,lc;//定義連結串列la,lb,lc
    InitList(&la);//初始化連結串列
    InitList(&lb);
    InitList(&lc);
    for(int i=1;i<=n;i++)//往連結串列中插入資料
    {
        int x;
        scanf("%d",&x);
        ListInsert(&la,i,x);
    }
    for(int i=1;i<=m;i++)
    {
        int x;
        scanf("%d",&x);
        ListInsert(&lb,i,x);
    }
    LinkList p=la->next;
    LinkList q=lb->next;
    while(p)
    {
        int x=0;
        q=lb->next;
        while(q)
        {

            if(p->data==q->data)
            {
                x=1;
                ListInsert(&lc,1,p->data);
            }
            q=q->next;
        }
        p=p->next;
    }
    LinkList pp = lc->next;
    while(pp)
    {
        printf("%d ",pp->data);
        pp=pp->next;
    }
    return 0;
}

Status InitList(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(Node));
    if(!(*L))
        return ERROR;
    (*L)->next=NULL;

    return OK;
}

Status ListInsert(LinkList *L,int i,ElemType e)
{
    int j;
    LinkList p,s;
    p = *L;
    j = 1;
    while(p && j < i)
    {
        p = p->next;
        ++j;
    }
    if( !p || j > i)
        return ERROR;
    s = (LinkList)malloc(sizeof(Node));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

Status ListDelete(LinkList *L,int i)
{
    int j;
    LinkList p,q;
    p = *L;
    j = 1;
    while(p->next && j < i)
    {
        p = p->next;
        ++j;
    }
    if(!(p->next) || j > i)
        return ERROR;
    q = p->next;
    p->next=q->next;
    free(q);
    return OK;
}