【数据结构】OJ显示Segmentation fault:段错误,检查是否有数组越界,指针异常,访问到不应该访问的内存区域

ihewro 2016-04-16 06:58:39

一元多项式的加法问题


#include <stdio.h>
#include <malloc.h>

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

typedef int ElemType;
typedef int Status;

typedef struct
{
int coef;//系数
int index;//指数
}term;

typedef struct Node
{
term data;
struct Node *next;

}Node,*LinkList;

Status InitPoyln(LinkList *l)
{
//【1】构建一个空链表
*l = (LinkList)malloc (sizeof(Node));
(*l)->next = NULL;
return OK;

}

Status CreatPoyln(LinkList *l)
{
//【2】尾插法建立链表
LinkList p,r;
r = (*l);
while (1)
{
p = (Node*)malloc(sizeof(Node));
// printf("请输入多项式的系数和指数:");
scanf("%d %d",&p->data.coef,&p->data.index);
if(p->data.coef == -1&&p->data.index == -1)
break;
r->next = p;
r = p;
}
r->next = NULL; //最后一个节点的next要置为NULL
return OK;
}


Status DestroyPoyln(LinkList *l)
{
//【3】销毁链表
LinkList p,q;
p = (*l)->next;
while (p)
{
q= p->next;
free(p);
p = q;
}
return OK;
}

void PrintfPoyln(LinkList l)
{
//【4】打印链表
LinkList p;

p = l->next;
if(p->data.coef ==0)
{
printf("0\n");
}
else
{
while (p!=NULL)
{

printf("%d %d ",p->data.coef,p->data.index);
p = p->next;
}
}
}

Status LengthPoyln(LinkList l)
{
//【5】链表的长度
int i = 0;
LinkList p;
p = l->next;
while (p)
{
i = i+1;
p = p->next;
}
return i;
}

Status AddPoyln (LinkList *la,LinkList *lb)
{
//【6】多项式相加
LinkList p1,p2,pb1,pb2;
pb1 = (*la);
p1 = pb1->next;
p2 = (*lb)->next;
pb2 = (*lb);
int i;

while(1)
{
if(p1->data.index > p2->data.index)
{

pb1 = p1;
p1 = p1->next;
if(!pb1->next)
{
pb2->next = p2->next;
pb1->next = p2;
break;
}
if(!pb2->next&&!pb1->next)
break;

}
if(p1->data.index == p2->data.index)
{

p1->data.coef = p1->data.coef + p2->data.coef;
pb1 = p1;
p1 = p1->next;
pb2 = p2;
p2 = p2->next;

if(!pb2->next&&!pb1->next)
break;
}
if(p1->data.index < p2->data.index)
{
pb2->next = p2->next;
p2->next = p1;
pb1->next = p2;
pb1 = pb1->next;
p2 = pb2->next;
if(pb2->next == NULL)
break;
if(!pb2->next&&!pb1->next)
break;
}
}
return OK;
}

void main ()
{
LinkList la,lb;
InitPoyln(&la);
InitPoyln(&lb);
CreatPoyln(&la);
CreatPoyln(&lb);
// PrintfPoyln(la);
// PrintfPoyln(la);
AddPoyln(&la,&lb);
DestroyPoyln(&lb);
PrintfPoyln(la);
// PrintfPoyln(lb);
}



自己运行测试数据没有发现哪不对,求大神,找出测试数据不能运行也行,跪谢
...全文
699 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 版主 2016-04-16
  • 打赏
  • 举报
回复
更正一下: 4.AddPoyln 函数略长,刚看第一个if就觉得有点奇怪,如果链表a的第一项的指数大于链表b的第一项指数,就让pb1和p1往后移了一个节点(如果链表a=3x^2+4x^3,链表b=x+2x^2),那第一个if过后,p1就已经指向了4x^3,根本没有机会和链表b的2x^2合并啊?
小灸舞 版主 2016-04-16
  • 打赏
  • 举报
回复
看了一下其他几个函数:
1.CreatPoyln有内存泄露,应该在循环结束完free(p)
2.PrintfPoyln函数,如果遇到空链表,那么会段错误产生异常(OJ里应该会测试这种情况)
3.DestroyPoyln函数,好像没有free头结点啊?
4.AddPoyln 函数略长,刚看第一个if就觉得有点奇怪,如果链表a的第一项的系数大于链表b的第一项系数,就让pb1和p1往后移了一个节点(如果链表a=3x^2+4x^3,链表b=x+2x^2),那第一个if过后,p1就已经指向了4x^3,根本没有机会和链表b的2x^2合并啊?
PS:由此没有往下看,试了一组测试用例,结果崩了

69,371

社区成员

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

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