c - C中使用链表时的指针问题

标签 c pointers gcc linked-list polynomials

我正在编写 C 编程代码,除了多项式乘法部分之外,大多数代码都工作正常。它有一个运行时错误。请帮助我从多项式乘法中删除此运行时错误,我找不到错误,我认为它位于第三个 for 循环中。 谢谢... 如果你能解决这个错误那就太好了

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 17

typedef struct node
{
    int coeff;
    struct node *next;
}node;

node * init();
void read(node *h1);
void print(node *h1);
node * add(node *h1,node *h2);
node * multiply(node *h1, node *h2);

void main()
{
    node *h1=NULL,*h2=NULL,*h3=NULL;
    int option;
    do
    {
        printf("\n1 : create 1’st polynomial");
        printf("\n2 : create 2’nd polynomial");
        printf("\n3 : Add polynomials");
        printf("\n4 : Multiply polynomials");
        printf("\n5 : Quit");
        printf("\nEnter your choice :");
        scanf("%d",&option);
        switch(option)
        {
            case 1:
                h1=init();
                read(h1);
                break;

            case 2:
                h2=init();
                read(h2);
                break;

            case 3:
                h3=add(h1,h2);
                printf("\n1’st polynomial -> ");
                print(h1);
                printf("\n2’nd polynomial -> ");
                print(h2);
                printf("\n Sum = ");
                print(h3);
                break;

            case 4:
                h3=multiply(h1,h2);
                printf("\n1’st polynomial -> ");
                print(h1);
                printf("\n2’nd polynomial -> ");
                print(h2);
                printf("\n Product = ");
                print(h3);
                break;
        }
    }while(option!=5);
}

void read(node *h)
{
    int n,i,j,power,coeff;
    node *p;
    p=init();
    printf("\n Enter number of terms :");
    scanf("%d",&n);
    /* read n terms */
    for (i=0;i<n;i++)
    {
        printf("\nenter a term(power coeff.)");
        scanf("%d%d",&power,&coeff);
        for(p=h,j=0;j<power;j++)
            p=p->next;
        p->coeff=coeff;
    }
}

void print(node *p)
{
    int i;
    for(i=0;p!=NULL;i++,p=p->next)
        if(p->coeff!=0)
            printf("%dX^%d ",p->coeff,i);
}

node * add(node *h1, node *h2)
{
    node *h3,*p;
    h3=init();
    p=h3;
    while(h1!=NULL)
    {
        h3->coeff=h1->coeff+h2->coeff;
        h1=h1->next;
        h2=h2->next;
        h3=h3->next;
    }
    return(p);
}

node * multiply(node *h1, node *h2)
{
    node *h3,*p,*q,*r;
    int i,j,k,coeff,power;
    h3=init();
    for(p=h1,i=0;p!=NULL;p=p->next,i++)
        for(q=h2,j=0;q!=NULL;q=q->next,j++)
        {
            coeff=p->coeff * q->coeff;
            power=i+j;
            for(r=h3,k=0;k<power;k++)
                r=r->next;
            r->coeff=r->coeff+coeff;
        }
    return(h3);
}

node * init()
{
    int i;
    node *h=NULL,*p;
    for(i=0;i<MAX;i++)
    {
        p=(node*)malloc(sizeof(node));
        p->next=h;
        p->coeff=0;
        h=p;
    }
    return(h);
}

最佳答案

multiply 函数中至少存在一个问题:

...
for (r = h3, k = 0; k < power; k++)
  r = r->next;

r->coeff = r->coeff + coeff;
...

在某些时候,r 会变为 NULL,并且在下一步中,当您使用 r->coeff 取消引用 r 时>(r 现在是NULL)您的程序将导致未定义的行为(大多数平台上的段错误)。

关于c - C中使用链表时的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52867729/

相关文章:

c - '[' 标记之前的汇编语言解析错误

c++ - 摩西中对 `gzopen' 的 undefined reference

c - 我应该使用什么数据类型来解析/proc/[pid]/smaps 中的大小?

pointers - 如何定义一个函数,该函数接收一个指针作为参数并返回一个指向该参数的子节点之一的指针?

c++ - 为 GCC 创建正确的 D3D11 库文件

python - 指针和 "Storing unsafe C derivative of temporary Python reference"

c - C语言只打印字符串中以指定字母开头的单词

c - 打包一个结构是否会错位相邻的内存?

c - 对内核模块代码进行单元测试是否可行?

c - 将数据发送到我的服务器中选定的客户端