对于单链表A中的每个元素e,在单链表B中进行查找,如果在B中存在与A相同的元素,则将元素从A中删除
void DelElem(LinkList A, LinkList B)
{
int i, j;
ElemType e;
ListNode* p;
//取出链表中B的每个元素与单链表中的元素作比较,如果相等则删除A中的对应点
for (i = 1; i < ListLength(B); i++)
{
p = Get(B, i); //按序号查询取出B中的结点,将指针返回给p
if (p)
{
j = LocatePos(A, p->data); //按内容查询取出B中的结点,比较两个数值是否相等
if (j > 0)
{
DeteleList(&A, j, &e); //如果相等,将其从A中删除
}
}
}
}
代码不全的部分函数 请自己补全
:https://blog.csdn.net/wh1236666/article/details/108796385
实现代码:
int i;
ElemType a[] = {5,7,9,11,12,13,14,15,43,45};
ElemType b[] = {1,2,3,4,7,11,23,34,43,57};
LinkList A, B;
ListNode* p;
InitList(&A);//初始化单链表A
InitList(&B);//初始化单链表B
for ( i = 1; i <= sizeof(a)/sizeof(a[0]); i++)//将数值a中的元素插入到单链表A中
{
if (InsertList(&A, i, a[i - 1]) == 0)
{
printf("位置不合法");
return 0;
}
}
for (i = 1; i <= sizeof(b) / sizeof(b[0]); i++) //将数值b中的元素插入到单链表A中
{
if (InsertList(&B, i, b[i - 1]) == 0)
{
printf("位置不合法");
return 0;
}
}
printf("单链表A中的元素有%d个:\n",ListLength(A));
for ( i = 1; i <= ListLength(A); i++) //输出单链表A中的元素
{
p = Get(A,i); //返回单链表A中结点的指针
if (p)
{
printf("%4d",p->data); //输出单链表A中的元素
}
}
printf("\n");
printf("单链表B中的元素有%d个:\n", ListLength(B));
for (i = 1; i <= ListLength(B); i++) //输出单链表B中的元素
{
p = Get(B, i); //返回单链表B中结点的指针
if (p)
{
printf("%4d", p->data);//输出单链表B中的元素
}
}
printf("\n");
DelElem(A,B); //将在单链表中的出现过的元素删除,即A-B
printf("执行(A-B)后,A中的元素还有%d个:\n",ListLength(A));
for ( i = 1; i < ListLength(A); i++)
{
p = Get(A, i); //返回删除后单链表A中结点的指针
if (p)
{
printf("%4d", p->data);//输出删除后的单链表A中的元素
}
}
效果图: