openjudge資料結構練習集 1:集合的交運算(單鏈表)
阿新 • • 發佈:2019-01-28
集合的交運算(單鏈表)
- 總時間限制:
- 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; }