bizhen_npu 2016-03-27 15:33 采纳率: 50%
浏览 4180
已采纳

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条回答

  • threenewbee 2016-03-27 15: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
        }
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作