2 bizhen npu bizhen_npu 于 2016.03.27 23:33 提问

C语言问题 感觉自己是对的 但提交后总 Runtime error

描述:

已知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;
}

2个回答

caozhy
caozhy   Ds   Rxr 2016.03.27 23:45
已采纳
 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
    }

}
u012016803
u012016803 哈哈,确实,都将P释放了
一年多之前 回复
lx624909677
lx624909677   Ds   Rxr 2016.03.27 23:36
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!