C語言利用連結串列求集合的交集
阿新 • • 發佈:2018-12-12
Description
假設元素依值遞增有序排列的線性表A和B分別表示兩個集合(即同一表中的元素值各不相同),現要求另闢空間構成一個線性表C,其元素為A和B中元素的交集,且表C中的元素也依值遞增有序排列。
輸入A和B集合中的元素;
輸出A和B的交集C中的元素。
提示:儲存結構採用帶表頭結點的迴圈單鏈表,結點結構如下:
typedef struct Node
{
int data;
struct Node *next;
}LNode,*LinkList;
要求:
(1)編寫函式按照升序序列輸入元素值,建立集合的迴圈單鏈表。
(2) 編寫函式實現集合的求交集演算法。
(3)編寫函式依次輸出集合中的元素。
(4)編寫main(),呼叫上述函式完成題目要求。
Input
輸入集合A的元素個數
按照升序依次輸入集合A的元素值
輸入集合B的元素個數
按照升序依次輸入集合B的元素值
Output
依次輸出A和B的交集C中的元素。
Sample Input
5 10 20 30 40 50 6 5 16 20 35 40 80
Sample Output
20 40
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *next; }LNode,*LinkList; int length_C=0; void InitLNode(LNode* pHeader,int len){ int i; LNode *pNewNode; LNode *pCurNode; pHeader->next=pNewNode; pCurNode = pHeader; for(i=0;i<len;i++) { pNewNode = (LNode*)malloc(sizeof(LNode)); scanf("%d",&pNewNode->data); pNewNode->next = NULL; pCurNode->next = pNewNode; pCurNode = pNewNode; } } void Display(LNode *pHeader) { if(length_C!=0) { LNode *pCurNode; pCurNode=pHeader; while(pCurNode->next!=NULL) { pCurNode = pCurNode->next; printf("%d ",pCurNode->data); } } } LNode* InterSet(LNode *p1,LNode *p2,LNode *C) { LNode *pCurNode1 = p1; LNode *pCurNode2 = p2; LNode *pCurNode3 = C; LNode *pNewNode3; C->next = pNewNode3; while(pCurNode1->next!=NULL) { pCurNode1=pCurNode1->next; while(pCurNode2->next!=NULL) { pCurNode2=pCurNode2->next; if(pCurNode1->data == pCurNode2->data) { pNewNode3 = (LNode*)malloc(sizeof(LNode)); length_C++; pNewNode3->data = pCurNode1->data; pNewNode3->next = NULL; pCurNode3->next = pNewNode3; pCurNode3=pNewNode3; } } pCurNode2 = p2; } pCurNode3 = C; return C; } int main() { LNode *A; LNode *B; LNode *C; int length_A,length_B ; A = (LNode*)malloc(sizeof(LNode)); B = (LNode*)malloc(sizeof(LNode)); C = (LNode*)malloc(sizeof(LNode)); scanf("%d",&length_A); InitLNode(A,length_A); scanf("%d",&length_B); InitLNode(B,length_B); InterSet(A,B,C); Display(C); return 0; }