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释放了
接近 2 年之前 回复
lx624909677
lx624909677   Ds   Rxr 2016.03.27 23:36
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
LeetCode上遇到Runtime Error错误
今天在LeetCode上做一道求单链表交集的算法题(160),提交时出现如下错误: 提交的代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; *//*双指针求单链表交集*/struct ListN
Runtime Error in C
Run time error in C标签:C语言 RuntimeError目录Run time error in CRun time error 的含义 举例子 总结1.Run time error 的含义-Run time error 便是指程序运行过程中崩溃了 -导致崩溃的原因有很多: 1)除数为0; 2)数组越界; 3)指针越界; 4)使用已经释放的空间; 5)数组定义过大,占用
什么是C语言中的runtime?
大体来说,runtime是与runtime library密不可分的,这些库依赖于特定的运行平台。   按照WIKI上的说法 在计算机编程中,runtime library运行时库,是指一种被编译器用来实现编程语言内置函数一提供该语言运行时(执行时)支持的一种特殊的计算机程序库,这种库一般包括基本的输入输出或是内存管理等支持,它是一群支持正在运行程序的函数,与操作系统合作提供诸如数学运算,输
为什么人们经常认为自己是受害者?
你经常觉得自己是个受害者吗?
C语言代码,求高手解答,为什么没有错误,但是结果不对
#include #include char *cmonth(int month) { char str_month[]={ "Illegal Month" "January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November"
真正喜欢上一个人的感觉,或许从你开始觉得自己配不上她
    不要因为自己心里的小插曲,而错过了自己真正喜欢的人。    恋爱中,有时候因为家庭背景、教育背景、颜值等差异,两个人相处的过程中会觉得自己配不上他,其实这可以说是自己内心的一个小活动罢了;但这仍然不能阻止你想进一步和他发展,因为在你心里,你发现他是你遇到过最好的人了。    你是这样想的,但他又是怎样想的呢,难道他也会认为像他那么优秀的人,遇见了你,找到了你,他也同样觉得你不配他吗?如果真...
OJ的runtime error exit code对应SIGTERM代码
Signal Name Number Description SIGHUP 1 Hangup (POSIX) SIGINT 2 Terminal interrupt (ANSI) SIGQUIT 3 Terminal quit (POSIX) SIGILL 4 Illegal instruction (ANSI) SIGTRAP 5 Trace trap (POSIX)
OJ提交错误原因
Waiting:正在评测程序。  Compiling:正在编译程序。  Accepted:程序正确。  Wrong Answer:程序运行结果与正确结果不一样。  Time Limit Exceeded:运行时间超出了要求。  Memory Limit Exceeded:程序运行占用内存超出了标准。  Runtime Error:程序在运行的时候异常退出。  Compile Erro
LeetCode不通过常见原因
【runtime error】 没有初始化,
【项目经验笔记】为何感觉自己的代码越写越乱?
最近发现,代码的编写真的是一件很有技术含量的事情,需要用心研究。刚入门编程的时候,总觉得只要实现功能就行了,不需要把代码写得漂亮。但是后来上手做一个规模稍大的项目的时候才发现,如果代码写的差,后期的维护是多么痛苦的一件事。其中最重要的,就是会让你对你的代码失去信心,编写者都对代码失去了信心,这个程序还能保证正确运行吗?是什么导致程序员对代码失去信心?原因之一是,一旦代码混乱,逻辑不清晰,代码耦合大,