C語言 連結串列求一組資料的交集並集
阿新 • • 發佈:2019-02-01
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}List;
int isCheck(List *des, int tmp)
{
if (des == NULL) //連結串列為空,或者連結串列沒有資料
return 0;
while (des != NULL)
{
if (des->data == tmp)
return 1;
des = des->next;
}
return 0;
}
List *uniList(List *src1, List *src2)
{
if (src1 == NULL || src2 == NULL)
return NULL;
List *link = src1;
while (link->next != NULL)
link = link->next;
link->next = src2; //將src2連線到src1尾部,一次直接得出結果
List *des = NULL;
List *rev = NULL;
while (src1 != NULL) //有資料就繼續
{
if (!isCheck(des, src1->data)) //一個一個的將不重複的元素新增到輸出中
{
List *p = (List *)malloc(sizeof(List));
p->data = src1->data;
p->next = NULL;
if (des == NULL)
{
des = p;
rev = des;
}
else
{
rev->next = p;
rev = rev->next;
rev->next = NULL;
}
}
src1 = src1->next;
}
link->next = NULL; //連線src1和src2後,斷開連線,避免後續調用出現錯誤
return des;
}
List *secList(List *src1, List *src2) //求交集
{
if (src1 == NULL || src2 == NULL) //如果兩個分別為空(及兩個都是空級),直接返回空
return NULL;
List *des = NULL;
List *rev = NULL;
while (src1 != NULL)
{
if (!isCheck(des, src1->data) && isCheck(src2,src1->data)) //src1如果不在輸出中,且src1的元素在src2中有,那麼既是交集的一個元素
{
List *p = (List *)malloc(sizeof(List));
p->data = src1->data;
p->next = NULL;
if (des == NULL)
{
des = p;
rev = des;
}
else
{
rev->next = p;
rev = rev->next;
rev->next = NULL;
}
}
src1 = src1->next;
}
return des;
}
int main()
{
List *A = (List *)malloc(sizeof(List));
List *B = (List *)malloc(sizeof(List));
int i;
int a[7] = { 2,3,4,5,7,10,11 };
int b[6] = { 2,4,6,10,11,15 };
List *tmp1 = A;
List *tmp2 = B;
for (i = 0;i < 6;i++) //為連結串列A賦值 陣列為7個元素,此處寫6
{
tmp1->data = a[i];
tmp1->next = (List *)malloc(sizeof(List));
tmp1 = tmp1->next;
}
tmp1->data = a[i];
tmp1->next = NULL;
for (i = 0;i < 5;i++) //為連結串列B賦值,陣列為6個元素,此處寫5,比元素個數少1
{
tmp2->data = b[i];
tmp2->next = (List *)malloc(sizeof(List));
tmp2 = tmp2->next;
}
tmp2->data = b[i];
tmp2->next = NULL;
printf("A ,B的並集:\n");
List *C1 = uniList(A, B);
while (C1 != NULL)
{
printf("%d\t", C1->data);
C1 = C1->next;
}
printf("\n\n\nA ,B的交集:\n");
List *C2 = secList(A, B);
while (C2 != NULL)
{
printf("%d\t", C2->data);
C2 = C2->next;
}
printf("\n");
system("pause");
return 0;
}
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}List;
int isCheck(List *des, int tmp)
{
if (des == NULL) //連結串列為空,或者連結串列沒有資料
return 0;
while (des != NULL)
{
if (des->data == tmp)
return 1;
des = des->next;
}
return 0;
}
List *uniList(List *src1, List *src2)
{
if (src1 == NULL || src2 == NULL)
return NULL;
List *link = src1;
while (link->next != NULL)
link = link->next;
link->next = src2; //將src2連線到src1尾部,一次直接得出結果
List *des = NULL;
List *rev = NULL;
while (src1 != NULL) //有資料就繼續
{
if (!isCheck(des, src1->data)) //一個一個的將不重複的元素新增到輸出中
{
List *p = (List *)malloc(sizeof(List));
p->data = src1->data;
p->next = NULL;
if (des == NULL)
{
des = p;
rev = des;
}
else
{
rev->next = p;
rev = rev->next;
rev->next = NULL;
}
}
src1 = src1->next;
}
link->next = NULL; //連線src1和src2後,斷開連線,避免後續調用出現錯誤
return des;
}
List *secList(List *src1, List *src2) //求交集
{
if (src1 == NULL || src2 == NULL) //如果兩個分別為空(及兩個都是空級),直接返回空
return NULL;
List *des = NULL;
List *rev = NULL;
while (src1 != NULL)
{
if (!isCheck(des, src1->data) && isCheck(src2,src1->data)) //src1如果不在輸出中,且src1的元素在src2中有,那麼既是交集的一個元素
{
List *p = (List *)malloc(sizeof(List));
p->data = src1->data;
p->next = NULL;
if (des == NULL)
{
des = p;
rev = des;
}
else
{
rev->next = p;
rev = rev->next;
rev->next = NULL;
}
}
src1 = src1->next;
}
return des;
}
int main()
{
List *A = (List *)malloc(sizeof(List));
List *B = (List *)malloc(sizeof(List));
int i;
int a[7] = { 2,3,4,5,7,10,11 };
int b[6] = { 2,4,6,10,11,15 };
List *tmp1 = A;
List *tmp2 = B;
for (i = 0;i < 6;i++) //為連結串列A賦值 陣列為7個元素,此處寫6
{
tmp1->data = a[i];
tmp1->next = (List *)malloc(sizeof(List));
tmp1 = tmp1->next;
}
tmp1->data = a[i];
tmp1->next = NULL;
for (i = 0;i < 5;i++) //為連結串列B賦值,陣列為6個元素,此處寫5,比元素個數少1
{
tmp2->data = b[i];
tmp2->next = (List *)malloc(sizeof(List));
tmp2 = tmp2->next;
}
tmp2->data = b[i];
tmp2->next = NULL;
printf("A ,B的並集:\n");
List *C1 = uniList(A, B);
while (C1 != NULL)
{
printf("%d\t", C1->data);
C1 = C1->next;
}
printf("\n\n\nA ,B的交集:\n");
List *C2 = secList(A, B);
while (C2 != NULL)
{
printf("%d\t", C2->data);
C2 = C2->next;
}
printf("\n");
system("pause");
return 0;
}