m0_43413629 2021-10-16 13:36 采纳率: 0%
浏览 33

c语言程序同一组数据有时正常有时崩溃

用同一组数据,程序有时候正常运行出结果,有时候就崩了
我个人测试实在166行循环内崩掉,这种时好时坏我实在是不知道为啥了
这里有一组数据
10 10 0
1 1 10 2 1 3 7 4 3 5 3 6 8 7 8 8 11 9 11 10
3 1 3 2 10 3 6 4 3 5 10 6 3 7 4 8 5 9 10 10


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

typedef int Status;

#include<stdio.h>
#include<stdlib.h>

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10


typedef struct{//系数,指数,项结构体 
    int coef,expn;
}ElemType, term;

typedef struct LNode{//链表节点 
    ElemType data;
    struct LNode *next;
}LNode, *Link, *Position;

typedef struct LinkList{//链表 
    Link head, tail;
    int len;
}LinkList;

typedef LinkList Polynomial;//一元多项式 

Status InitList(LinkList &L){//初始化链表 
    L.len=0;
    Link p;
    p = (Link)malloc(sizeof(LNode));
    if(!p) return ERROR;
    L.head = L.tail = p;
    p->next=NULL;
}

Status MakeNode(Link &p, ElemType e){//申请节点 
    p = (Link)malloc(sizeof(ElemType));
    if(!p) return ERROR;
    p->data.coef = e.coef;
    p->data.expn = e.expn;
    return OK;
}

Status FreeNode(Link &p){//释放节点 
    if(!p) return ERROR;
    Link p1;
    p1 = p->next; 
    free(p);
    p = p1;
    return OK;
}

Status InsFirst(Link h, Link s){//s插入到h后面 
    s->next = h->next;
    h->next = s;
    return OK;
}

Status DelFirst(Link h){//删除h后第一个节点 
    if(!h->next) return ERROR;
    Link q;
    q = h->next;
    h->next = h->next->next;
    free(q);
    return OK;
}

Position LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType)){//找到符合比较的第一个位置,这里是找比他大的插入 
    Link p;
    p = L.head;
    while(p->next){
        switch(compare(e, p->next->data)){
            case 1:
                p = p->next;
                break;
            case 0:
                return p;
            case -1: 
                return p;
        }
    }
    return p;
}

Status Opposite(Polynomial &L){//将多项式变为负的 
    Link p;
    p = L.head->next;
    while(p!=NULL){
        p->data.coef *= -1;
        p = p->next;
    }
    return OK;
}

Status AddTerm(Link a, Link b){//单项相加 
    a->data.coef += b->data.coef;
    free(b);
}

void ShowPolynomial(Polynomial L){//打印多项式 
    Link p = L.head->next;
    if(!p){
        printf("0");
        return;
    }
    if(p->data.coef==-1) printf("-");
    else if(p->data.coef!=1) printf("%d",p->data.coef);
    if(p->data.expn==1) printf("x");
    else if(p->data.expn!=0) printf("x^%d",p->data.expn);
    if(abs(p->data.coef)==1&&p->data.expn==0) printf("1");
    p = p->next;
    while(p){
//        if(p->data.coef==0){
//            p=p->next;
//            continue;
//        }
        if(p->data.coef>0) printf("+");
        if(p->data.coef==-1) printf("-");
        else if(p->data.coef!=1) printf("%d",p->data.coef);
        if(p->data.expn==1) printf("x");
        else if(p->data.expn!=0) printf("x^%d",p->data.expn);
        if(abs(p->data.coef)==1&&p->data.expn==0) printf("1");
        p = p->next;
    }
}

Status cmp(term a, term b){//比较函数 
    if(a.expn == b.expn) return 0;
    else return (a.expn-b.expn)/abs(a.expn-b.expn);
}

int main(){
    int n,m,t;//第一个多项式n项第二个m项,t0加法 1减法 
    scanf("%d%d%d",&n,&m,&t);
    ElemType e;//定义 
    Link p;Link p1,p2;
    Polynomial L1,L2,L;
    InitList(L1);//初始化链表 
    InitList(L2);
    InitList(L);
    for(int i=0;i<n;i++){//输入L1 
        scanf("%d%d",&e.coef,&e.expn);
        MakeNode(p,e);
        InsFirst(L1.head,p);
    }
    for(int i=0;i<m;i++){//输入L2 
        scanf("%d%d",&e.coef,&e.expn);
        MakeNode(p,e);
        InsFirst(L2.head,p);
    }
    p1 = L1.head->next;
    while(p1){//将L1加到L上 
        p = LocateElem(L,p1->data,cmp);
        p2 = p1->next;
        InsFirst(p,p1);
        p1 = p2;
    }
    if(t) Opposite(L2);//减法就是加负的 
    p2 = L2.head->next;
    while(p2){//将L2加到L上 
        p = LocateElem(L,p2->data,cmp);//找到合适位置的前一个位置p 
        p1 = p2->next;
        //会在这个if里崩掉 
        if(p->next&&cmp(p2->data,p->next->data)==0){//可能与这一项指数相同也可能不同或者没有合适位置(接到后面) 
            AddTerm(p->next,p2);
            if(p->next->data.coef==0){//如果加出0项就删掉 
                DelFirst(p);
            } 
        }
        else{
            InsFirst(p,p2);//没找到位置加到末尾 
        } 
        p2 = p1;
    }
    p = L.head;
    while(p&&p->next){//将L中的系数为0的项删掉 
        if(p->next->data.coef==0) DelFirst(p);
        else p=p->next;
    } 
    ShowPolynomial(L);//输出L 
    return 0;
}

```

  • 写回答

1条回答 默认 最新

  • SoftwareTeacher 《编程之美》作者 2021-10-16 13:59
    关注

    abs(a.expn-b.expn) 可能是 0 么?
    InitList 要检查返回值

    评论

报告相同问题?

问题事件

  • 创建了问题 10月16日

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3