动态链表实现对称差有两种方式,一:求出交集和并集,再将两个求交集。二直接检验两次,将所有不同的筛选出储存起来即可。此处的方式为创建第三个链表进行保存。
前面基础操作不做过多赘述,主要是在异或的实现部分。
LNode* InterSet(LNode* p1, LNode* p2, LNode* C, int lena, int lenb)
{
LNode* pCurNode1 = p1;
LNode* pCurNode2 = p2;
LNode* pCurNode3 = C;
LNode* pNewNode3 = NULL;
int pg = 0;
C->next = pNewNode3;
while (pCurNode1->next != NULL)
{
pCurNode1 = pCurNode1->next;
while (pCurNode2->next != NULL)
{
pCurNode2 = pCurNode2->next;
if (pCurNode1->data == pCurNode2->data)
{
break;
}
pg++;
}
if (pg == lenb)
{
pNewNode3 = (LNode*)malloc(sizeof(LNode));
length_C++;
pNewNode3->data = pCurNode1->data;
pNewNode3->next = NULL;
pCurNode3->next = pNewNode3;
pCurNode3 = pNewNode3;
}
pg = 0;
pCurNode2 = p2;
}
pCurNode1 = p1;
pg = 0;
while (pCurNode2->next != NULL)
{
pCurNode2 = pCurNode2->next;
while (pCurNode1->next != NULL)
{
pCurNode1 = pCurNode1->next;
if (pCurNode2->data == pCurNode1->data)
{
break;
}
pg++;
}
if (pg == lena)
{
pNewNode3 = (LNode*)malloc(sizeof(LNode));
length_C++;
pNewNode3->data = pCurNode2->data;
pNewNode3->next = NULL;
pCurNode3->next = pNewNode3;
pCurNode3 = pNewNode3;
}
pg = 0;
pCurNode1 = p1;
}
pCurNode3 = C;
return C;
}
这是大学实验的作业,此处仅作记录,如有不足之处,还请多多包涵,欢迎评论指正。
#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 = NULL;
LNode* pCurNode = NULL;
pHeader->next = pNewNode;
pCurNode = pHeader;
printf("请输入链表元素:\n");
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, int lena, int lenb)
{
LNode* pCurNode1 = p1;
LNode* pCurNode2 = p2;
LNode* pCurNode3 = C;
LNode* pNewNode3 = NULL;
int pg = 0;
C->next = pNewNode3;
while (pCurNode1->next != NULL)
{
pCurNode1 = pCurNode1->next;
while (pCurNode2->next != NULL)
{
pCurNode2 = pCurNode2->next;
if (pCurNode1->data == pCurNode2->data)
{
break;
}
pg++;
}
if (pg == lenb)
{
pNewNode3 = (LNode*)malloc(sizeof(LNode));
length_C++;
pNewNode3->data = pCurNode1->data;
pNewNode3->next = NULL;
pCurNode3->next = pNewNode3;
pCurNode3 = pNewNode3;
}
pg = 0;
pCurNode2 = p2;
}
pCurNode1 = p1;
pg = 0;
while (pCurNode2->next != NULL)
{
pCurNode2 = pCurNode2->next;
while (pCurNode1->next != NULL)
{
pCurNode1 = pCurNode1->next;
if (pCurNode2->data == pCurNode1->data)
{
break;
}
pg++;
}
if (pg == lena)
{
pNewNode3 = (LNode*)malloc(sizeof(LNode));
length_C++;
pNewNode3->data = pCurNode2->data;
pNewNode3->next = NULL;
pCurNode3->next = pNewNode3;
pCurNode3 = pNewNode3;
}
pg = 0;
pCurNode1 = p1;
}
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));
printf("*********求异或*********\n");
printf("请输入第一个链表的元素个数:\n");
scanf("%d", &length_A);
InitLNode(A, length_A);
printf("请输入第二个链表的元素个数:\n");
scanf("%d", &length_B);
InitLNode(B, length_B);
InterSet(A, B, C, length_A, length_B);
printf("异或元素为:\n");
Display(C);
return 0;
}