链表问题(C语言描述)
请教大家个问题。有单链表A、B、C,要在A中删除那些既在B又在C中出现的元素。我写的下面的代码运行时候出错,不知道原因。希望大家抽出点时间帮我看看。十分感谢!
-------------------------------
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Node, *LinkList;
/*---------------------创建链表------------------------*/
struct node *CreatList(void)
{
int n = 1;
LinkList head = NULL;
LinkList L1 = NULL;
LinkList L2 = NULL;
L1 = L2 =(LinkList)malloc(sizeof(Node));
if (NULL == L1)
{
printf("Faile to get values.\n");
exit (1);
}
printf("Please input the List Data:\n");
scanf("%d", &L1->data);
while (L1->data != -1)//当输入的数据是-1时表示结束
{
if (n == 1)
{
head = L1;
}
else
{
L2->next = L1;
}
L2 = L1;
L1 = (LinkList)malloc(sizeof(Node));
scanf("%d", &L1->data);
n++;
}
L2->next = NULL;
return (head);
}
/*--------------------删除链表A中的数据------------------------*/
void SqList_Intersect_Delete(LinkList A, LinkList B, LinkList C)
{
LinkList pa = A;
LinkList pb = B;
LinkList pc = C;
LinkList s;
LinkList t;
int u;
while (pa && pb && pc)
{
if (pb->data < pc->data)
{
pb = pb->next;
}
else if (pb->data > pc->data)
{
pc = pc->next;
}
else
{
u = pb->data; //保存要删除的数据
while (pa->next->data < u)
{
pa = pa->next;
}
if (pa->data == u)//假如A中存在和u的值一样的数据则进行删除
{
s = pa->next;
while (s->data == u)
{
t = s;
s = s->next;
free(t);
}
pa->next = s;
}
while (pb->data == u)//如果链表B后一个结点的数据还等于u则移动指针
{
pb = pb->next;
}
while (pc->data == u)
{
pc = pc->next;
}
}
}
}
/*---------------------打印链表数据--------------------------*/
void PrintListData(LinkList L)
{
while (L)
{
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
/*-----------------------------------------------------------*/
int main(void)
{
LinkList A, B, C;
printf("The A_List :\n");
A = CreatList();
printf("The List A data are:\n");
PrintListData(A);
printf("The B_List :\n");
B = CreatList();
printf("The List B data are:\n");
PrintListData(B);
printf("The C_List :\n");
C = CreatList();
printf("The List C data are:\n");
PrintListData(C);
SqList_Intersect_Delete(A, B, C);
printf("Now, the A_List is:\n");
PrintListData(A);
system("Pause");
return 0;
}