为什么我的程序跑出段错误

yueyueniao96 2014-07-31 01:35:57
#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>


#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1

typedef int ElemType;

struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList;

Status InitList(LinkList *L){
*L = (LinkList)malloc(sizeof(struct LNode));
if(!*L)
exit(OVERFLOW);
(*L)->next = NULL;
return OK;
}

Status ListTraverse(LinkList L,void(*vi)(ElemType)){
LinkList p = L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
return OK;
}
Status ListInsert(LinkList L,int i,ElemType e)
int j=0;
LinkList p=L,s;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(struct LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
void visit(ElemType c)
{
printf("%d ",c);
}

LinkList Merger2(LinkList L1,LinkList L2){
LinkList la = L1->next;
LinkList lb = L2->next;
if(la == NULL)
return lb;
else if(lb == NULL)
return la;
LinkList pHead = NULL;
if(la->data < lb->data){
pHead = la;
pHead->next = Merger2(la->next,lb);
}else{
pHead = lb;
pHead->next = Merger2(la,lb->next);
}
return pHead;
}
int main(){
LinkList L1,L2;
ElemType e,e0;
Status i1,i2;
int j,k;
i1 = InitList(&L1);
i2 = InitList(&L2);
for(j=1;j<=5;j++){
i1=ListInsert(L1,j,j*3);
}
for(k=1;k<=6;k++){
i2=ListInsert(L2,k,k*2);
}
printf("L1=");
ListTraverse(L1,visit);
printf("L2=");
ListTraverse(L2,visit);
printf("Mergered List:");
LinkList Mergered = Merger2(L1,L2);
ListTraverse(Mergered,visit);
return 0;
}



gcc 环境下: 段错误 (core dumped)
...全文
164 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yueyueniao96 2014-07-31
  • 打赏
  • 举报
回复
引用 2 楼 Adol1111 的回复:
段错误一般都和越界有关,自己调试下很容易就找到问题了。自己试一下,这是最基本的必备技能,别一直指望别人帮你解决所有问题。
自己肯定调试了,就是找不到原因才来问问,不然跑这来干嘛?
707wk 2014-07-31
  • 打赏
  • 举报
回复
http://pan.baidu.com/s/17yIcQ这里有链表的创建、插入、删除、反序、排序的相关代码
平头哥哥 2014-07-31
  • 打赏
  • 举报
回复
引用 3 楼 zmlovelx 的回复:
开debug,要么单步调试,要么运行,崩溃的时候再定位到崩溃处。
的确,debug! --------------------------------------------------------------------------------------------------------------------------------- 这个掌握了,程序之路又好走了很多!
帅得不敢出门 2014-07-31
  • 打赏
  • 举报
回复
开debug,要么单步调试,要么运行,崩溃的时候再定位到崩溃处。
Adol1111 2014-07-31
  • 打赏
  • 举报
回复
段错误一般都和越界有关,自己调试下很容易就找到问题了。自己试一下,这是最基本的必备技能,别一直指望别人帮你解决所有问题。
LouisScola 2014-07-31
  • 打赏
  • 举报
回复
段错误很多都是内存错误,越界。。
Adol1111 2014-07-31
  • 打赏
  • 举报
回复
引用 6 楼 yueyueniao96 的回复:
[quote=引用 2 楼 Adol1111 的回复:] 段错误一般都和越界有关,自己调试下很容易就找到问题了。自己试一下,这是最基本的必备技能,别一直指望别人帮你解决所有问题。
自己肯定调试了,就是找不到原因才来问问,不然跑这来干嘛?[/quote] 抱歉,我没别的意思,如果你觉得我的话难听,我向你道歉。 你如果真debug过了,你应该就知道出错的语句是哪一句了吧。LinkList lb = L2->next;就是这句报的错。 pHead->next = Merger2(la,lb->next);这句递归调用,但你一开始没有任何判断就直接让lb = L2->next; 你不觉得有问题么。 你调用pHead->next = Merger2(la,lb->next);之前,的确判断了lb是否为NULL,但是你传递的是lb->next,并且立刻就取了L2->next; 也就是说你每次使用的都是传递前的lb->next->next;,lb不为NULL,不代表lb->next不为NULL,这样说明白了么?

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧