#include<stdio.h>
struct Node
{
int data;
struct Node *next;
};
//创建链表
struct Node *create(int n,int count)
{
int i, step;
struct Node *head,*p1,*p2;
head = p1 = p2 = (struct Node*)malloc(sizeof(struct Node));
head->data = n;
printf("%s %d %d %p\n", __func__, __LINE__, head->data, p2);
if(count == 30)
step = 2;
else
step = 5;
for(i=1; i<count; i+=step)
{
p1 = (struct Node*)malloc(sizeof(struct Node));
p1->data = i+n;
p2->next = p1;
p2 = p1;
printf("%s %d %d %p\n", __func__, __LINE__, p1->data, p1);
}
p2->next = NULL;
return head;
}
//删除链表A和链表B中重复的节点
void delSame(struct Node **headA, struct Node **headB)
{
int flag;
struct Node *p11,*p11_last,*p22,*p22_last,*t1, *t2;
p11 = *headA;
p22 = *headB;
p11_last = p11;
p22_last = p22;
printf("%s %d %p %p\n", __func__, __LINE__, p11, p22);
while(p11 != NULL)
{
flag = 0;
while(p22 != NULL)
{
printf("%s %d %p %d %p %d\n", __func__, __LINE__, p11, p11->data, p22, p22->data);
if(p11->data == p22->data)
{
printf("删除%d\n", p11->data);
flag = 1;
//删除从链表A找到的重复节点
if(p11 == *headA) { // update link A head
printf("delete head A\n");
t1 = p11;
*headA = p11->next;
p11 = *headA;
p11_last = p11;
} else {
t1 = p11;
p11_last->next = t1->next;
p11 = p11_last->next;
}
printf("删除A link %p\n", t1);
free(t1);
//删除从链表B找到的重复节点
if(p22 == *headB) { // update link B head
printf("delete head B\n");
t2 = p22;
*headB = p22->next;
p22 = *headB;
p22_last = p22;
printf("search B link next %p\n", p22);
} else {
t2 = p22;
p22_last->next = t2->next;
}
printf("删除B link %p\n", t2);
free(t2);
break;
}
p22_last = p22;
p22 = p22->next;
}
p22 = *headB;
p22_last = p22;
if(flag == 0)
{
p11_last = p11;
p11 = p11->next;
}
}
}
void main()
{
struct Node *p1,*p11,*p2,*p22,*p3;
//创建链表
p11 = p1 = create(2,60);
p22 = p2 = create(2,30);
printf("链表1初始数据:\n");
while(p1)
{
printf("%d\n", p1->data);
p1 = p1->next;
}
printf("\n链表2初始数据:\n");
while(p2)
{
printf("%d\n", p2->data);
p2 = p2->next;
}
printf("\n从链表1中删去与链表2相同的结点后的链表1的内容:\n");
delSame(&p11,&p22);
while(p11)
{
printf("link A: %d %p\n", p11->data, p11);
p11 = p11->next;
}
while(p22)
{
printf("link B: %d %p\n", p22->data, p22);
p22 = p22->next;
}
}
`