zzz_5 2011-06-16 20:12
浏览 200
已采纳

C语言链表出错·········求解···比较简单,原谅我是个初学者吧···

 

各位 大哥 ,小弟最近在做课程设计实验时出了点小问题··一直解决不了··

希望大家帮下忙:

 

 

 

#include<stdio.h>
#include<malloc.h>
#include<conio.h>
typedef struct LNode{
    int coef;/*系数*/
    int expn;/*指数*/
    struct LNode *next;
}LNode,*LinkList;





void Insert_sort_list(LNode *head)
{
    LNode *p, *q, *t, *r;
    p = head->next;
    head->next = NULL;
    while(NULL != p)
    {
       t = head;
       q = t->next; 
       while(NULL != q && q->expn <= p->expn)
       {
          t = q;
          q = q->next;
       }
       r = p ->next;
       t->next = p;
       p->next = q;
       p = r;        
    }
}






void CreateList(LinkList L,int m)/*带头结点*/
{
    LinkList p,q;
    int i=0;
    p=q=L;
    L->next=NULL;
    printf("先输系数后输指数,中间空格\n");
    for(i=0;i<m;i++){
        p=(LNode *)malloc(sizeof(LNode));
        scanf("%d %d",&(p->coef),&(p->expn));
        L->next=p;
        L=p;
    
    }
    L->next=NULL;    
    L=q;
    Insert_sort_list(L);
}/*test success*/


void print(LinkList L)
{
    LinkList p;
    p=L->next;
    printf("\n(下式中X为未知数)\n");
    while(p!=NULL){
        printf("\(%dX\^%d\)",p->coef,p->expn);       
        if(p->next!=NULL)printf("\ \+\ ");
        p=p->next;
    }
    
}
void DeleteNode(LNode *p)
{
    LNode *q;
    q=p->next;
    p->next=q->next;
    free(q);
}/*删除节点*/

int LocateElem(LinkList L,int expn)/*查找是否有与该多项式的系数相同的项*/
{
    LNode *p;
    p=L;
    while(p->expn!=expn&&p->next!=NULL) {  p=p->next; }
    if (p->expn==expn){ return p->coef;} /*若找到则返回系数*/
    else return 0;
   
}

int Length(LinkList L)/*求多项式的项数*/
{
    LNode *p;
    int i=0;
    p=L->next;  
    while(p!=NULL) {
    p=p->next;
    i++;
    }  
    return i;
}
/*
void Delet(LinkList L)
{
    LNode *p,*q;
    p=L->next;
    while(p!=null)
    {
           q=p;
           p=p->next;
           free(q);
    }
}
*/

void Add(LinkList pa,LinkList pb,LinkList pc)/*多项式相加,pc=pa+pa,*/
{
     LNode *p, *q, *r, *t;
     p = pa->next;
     q = pb->next;
     r = pc;
     while(p!=NULL||q!=NULL)
     {
        if(p!=NULL&&q!=NULL)
        {
           if(p->expn<q->expn)
           {
              t=(LNode *)malloc(sizeof(LNode));
              t->coef=p->coef;
              t->expn=p->expn;
              t->next=NULL;
              r->next=t; 
              p=p->next;
           }
        else if(p->expn==q->expn)
           {
              t=(LNode *)malloc(sizeof(LNode));
              t->coef=p->coef+q->coef;
              t->expn=p->expn;
              t->next=NULL;
              r->next=t;
              p=p->next;
              q=q->next;
                   
           }   
        else  
           {
              t=(LNode *)malloc(sizeof(LNode));
              t->coef=q->coef;
              t->expn=q->expn;
              t->next=NULL;
              r->next=t;
              q=q->next; 
           }
           r=r->next;
           
        }
        else if(p!=NULL&&q==NULL)
        {
             r->next=p;
             p=p->next;
             r=r->next;
        }
        else if(p==NULL&&q!=NULL)
        {
             r->next=q;
             q=q->next;
             r=r->next;
        }
     }
} 

void Subtract(LinkList pa,LinkList pb,LinkList pc)/*多项式相减,pc=pa-pa*/
{
     LNode *p, *q, *r, *t;
     p = pa->next;
     q = pb->next;
     r = pc;
     while(p!=NULL||q!=NULL)
     {
        if(p!=NULL&&q!=NULL)
        {
           if(p->expn<q->expn)
           {
              t=(LNode *)malloc(sizeof(LNode));
              t->coef=p->coef;
              t->expn=p->expn;
              t->next=NULL;
              r->next=t; 
              p=p->next;
           }
        else if(p->expn==q->expn)
           {
              t=(LNode *)malloc(sizeof(LNode));
              t->coef=p->coef-q->coef;
              t->expn=p->expn;
              t->next=NULL;
              r->next=t;
              p=p->next;
              q=q->next;
                   
           }   
        else  
           {
              t=(LNode *)malloc(sizeof(LNode));
              t->coef=q->coef*(-1);
              t->expn=q->expn;
              t->next=NULL;
              r->next=t;
              q=q->next; 
           }
           r=r->next;
           
        }
        else if(p!=NULL&&q==NULL)
        {
             r->next=p;
             p=p->next;
             r=r->next;
        }
        else if(p==NULL&&q!=NULL)
        {
             r->next=q;
             q=q->next;
             r=r->next;
        }
     }
}

void Multiply(LinkList pa,LinkList pb,LinkList pc)/*多项式相乘pc=pa*pb*/
{
     LNode *p, *q,  *t, *c, *t1,*t2,*temp1,*temp2;/*temp1放第i个与pb相乘的开成的多项式 */
     t1=(LinkList)malloc(sizeof(LNode));
     pc=(LinkList)malloc(sizeof(LNode));
     t1->next=NULL;
     pc->next=NULL;
     c=pc;
     t2=pc;
     temp2=t2;
     temp1=t1;
     if(pa->next==NULL||pb->next==NULL){pc->next==NULL; return;}/* */
     for(p = pa->next;p!=NULL;p=p->next)
     {
          for(q = pb->next;p!=NULL;q=q->next)
          {

              t=(LNode *)malloc(sizeof(LNode));
              t->coef=(int)((p->coef)*(q->coef));
              t->expn=(int)((p->expn)+(q->expn));
              t->next=NULL;
              temp1->next=t; 
              temp1=temp1->next;

                     
          }
          
          pc->next=NULL;
          c=pc;
          Add(t1,t2,c); 
          t2=pc;
          t1->next=NULL;
          temp1=t1;        
          
     }     
}
 
int main()
{
    LinkList L,M,N;
    int m,n;
    L=(LinkList)malloc(sizeof(LNode));
    M=(LinkList)malloc(sizeof(LNode));
    N=(LinkList)malloc(sizeof(LNode));
    N->next=NULL;
    printf("请输入您要构造的多项式的项数\n");
    scanf("%d",&m);
    CreateList(L,m);    
    print(L);
    printf("\n长度为:%d",Length(L));
    printf("\n\n输入您要查找该多项式的系数相同的项的指数值:\n");
    scanf("%d",&n);
    if(n=LocateElem(L,n)) printf("存在指数与此相同的项,系数为:%d\n",n);
    else printf("未找到!");
    printf("\n以下构造多一个多项式与原多项式进行运算\n"); 
    printf("\n请输入您要构造的多项式的项数\n");
    scanf("%d",&m);
    CreateList(M,m);    
    printf("\n两个多项式相加的结果:\n");
    Add(L,M,N);
    print(N);
    printf("\n两个多项式相减的结果:\n");
    Subtract(L,M,N);
    print(N);
    printf("\n两个多项式相乘的结果:\n");
    Multiply(L,M,N);  
    print(N);  
    
    getch();
    return 0;

} 

下面是图片,每次运行到乘法的时候 都会出现这样的错误 ··是不是内存错误····

 

 

各位兄台高抬躈帮下忙啊············感激不尽············

 

  • 写回答

1条回答 默认 最新

  • xiangjie256 2011-06-16 22:55
    关注

    第243行for(q = pb->next;p!=NULL;q=q->next)

    改成for(q = pb->next;q!=NULL;q=q->next)再试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?