描述:
已知a、b和c三個遞增有序的鏈表,現在要求對a做如下操作:刪除其中既即在b中出現又在c中出現的元素(注意同一表中的元素有可能重復)。
輸入:
先在第一行輸入3個小於100的正整數m,n,l分別表示鏈表a,b,c的長度,然後在第二行輸入m個遞增的正整數,第三行輸入n個遞增的正整數,第四行輸入l個遞增的正整數,分別為這三個鏈表的元素,
輸出:
按順序輸出刪除元素後的鏈表a的值,每個元素占一行。
輸入樣例:
3 8 5
23 47 88
2 5 7 9 47 47 88 99
10 20 30 40 47
輸出樣例:
23
88
我的代碼:(很多數據都試過了,都沒錯啊!!!)
#include
#include
typedef struct List{
int data;
int length;
struct List *next;
} List;
List *LA,*LB,*LC;
void CreateLink(List **L,int length)
{
List p,*s;
p=*L=(List *)malloc(sizeof(List));
(*L)->length=length;
for(;length>0;length--)
{
s=(List *)malloc(sizeof(List));
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL;
}
/*int GetLinkData(List *L,int n){
List *p;
int i=0;
p=L->next;
if(n> L->length -1) {
printf("輸入位置錯誤!\n");
return -1;
}
for(i=0;p!=NULL;i++){
if(i==n) return p->data;
p=p->next;
}
return 0;
}/
int GetDataPosition(List *L,int value){
List *p;
int i=0;
p=L->next;
for(i=0;p!=NULL;i++){
if(p->data == value){
return i;
}
p=p->next;
}
return -1;
}
void DeleteLink(List *L,int n){
List *p = L->next;
List *s = L;
int i=0;
for(i=0;p!=NULL;i++){
if(i==n){
s->next=p->next;
free(p);
}
s=s->next;
p=p->next;
}
}
void PrintLink(List L)
{
List *p;
p=L->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}
/*void InsertLink(List *L,int insert){
List *p=L->next;
List *s=L;
List *p2=(List *)malloc(sizeof(List));
p2->data=insert;
while(p!=NULL){
if(p->data >= insert){
p2->next=p;
s->next=p2;
return;
}
s=s->next;
p=p->next;
}
s->next=p2;
p2->next=NULL;
}/
void ProcessLink(List *L1,List *L2,List *L3){
int i=0,t1=0,t2=0,d=0;
List *p = L1->next;
for(i=0;p!=NULL;i++){
d=p->data;
// printf("p-data %d\n",d);
t1=GetDataPosition(L2,d);
// printf("在L2表中p-data的位置:%d\n",t1);
t2=GetDataPosition(L3,d);
// printf("在L3表中p-data的位置:%d\n",t2);
if(t1!=-1 && t2!=-1){
p=p->next;
DeleteLink(L1,i);
i--;
/*調試了好幾天啊,鏈表刪除一個節點之後總長度減一,如果i不自減,
因為GetDataPosition()都是每次遍歷查找的,DeleteLink(L1,i)將會
刪去你想要刪去的後面那個節點*/
continue;
}
p=p->next;
}
}
void DestroyList(List *L)
{
List *p,*q;
p=L;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
L=NULL;
}
int main()
{
// freopen("input.txt","r",stdin);
int l1=0,l2=0,l3=0;
scanf("%d",&l1);
scanf("%d",&l2);
scanf("%d",&l3);
CreateLink(&LA,l1);
CreateLink(&LB,l2);
CreateLink(&LC,l3);
// PrintLink(LA);
ProcessLink(LA,LB,LC);
PrintLink(LA);
DestroyList(LA);
DestroyList(LB);
DestroyList(LC);
return 0;
}
void DeleteLink(List *L,int n){
List *p = L->next;
List *s = L;
int i=0;
for(i=0;p!=NULL;i++){
if(i==n){
s->next=p->next;
free(p); //這裡free p了,p就不能用了
}
s=s->next;
p=p->next; 你還在訪問p->next
}
}