How to make the following program work?
How to make the following program work? I think there are some place of the following program use the address NULL. But I don't know how to fix the problem. Thank you.
Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
typedef struct node /*a node denotes a P_{i,k}^{l}*/
{
int l,i,k;
} node;
typedef struct monomial_node /* a monomial denotes a monomial P_{i,k}^{l} \cdots P_{i',k'}^{l'} */
{
node y;
int coeff; /* coeff is s(m_r) */
struct monomial_node *next;
struct monomial_node *head;
struct monomial_node *tail;
} monomial_node, *monomial;
typedef struct polynomial_node /* a polynomial denotes a sum of some monomials */
{
monomial m;
struct polynomial_node *next;
struct polynomial_node *head;
struct polynomial_node *tail;
} polynomial_node, *polynomial;
monomial insert(node a, monomial b) /* insert a factor a to a monomial b such that the first subscripts i's in the new monomial is in increasing order */
{
monomial p;
monomial_node *s;
monomial_node *p1;
p=b;
p1=p->head->next;
while((p1->y).i >= a.i) /* find the position */
{
p1=p1->next;
if(p1==p->tail)
{
break;
}
}
if(p1==p->tail)
{
printf("tail\n");
}
s=(monomial)malloc(sizeof(monomial_node)); /* create new node */
s->y=a;
s->next=p1->next; /* insert the node a */
p1->next=s;
return p;
}
monomial create_monomial(int number) /* create a monomial */
{
monomial m,s;
monomial p;
int i;
m=(monomial)malloc(sizeof(monomial_node));
m->head=m->tail=(monomial)malloc(sizeof(monomial_node));
if(m->head==NULL)
{
return NULL;
}
m->head->next=m->tail;
m->tail->next=NULL;
p=(monomial)malloc(sizeof(monomial_node));
m->head->next=p;
p->next=m->tail;
printf("Please input the parameters of the heighest weight monomial(for example, 2, 2, 3 denotes the monomial Y^{2}_{2,3}). The first subscripts i of Y's should be in increase order.");
scanf("%d", &((p->y).l));
scanf("%d", &((p->y).i));
scanf("%d", &((p->y).k));
if(number > 1)
{
for(i=0;i<number-1;i++)
{
s=(monomial)malloc(sizeof(monomial_node));
scanf("%d", &((s->y).l));
scanf("%d", &((s->y).i));
scanf("%d", &((s->y).k));
m=insert(s->y,m);
}
}
return m;
}
polynomial create_polynomial(monomial n) /* create a polynomial with only one monomial n */
{
polynomial m,p;
m=(polynomial)malloc(sizeof(polynomial_node));
p=(polynomial)malloc(sizeof(polynomial_node));
m->head=(polynomial)malloc(sizeof(polynomial_node));
m->tail=(polynomial)malloc(sizeof(polynomial_node));
m->head->next=p;
p->m=n;
p->next=m->tail;
m->tail->next=NULL;
return m;
}
void print_monomial(monomial m)
{
monomial p;
p=(monomial)malloc(sizeof(monomial_node));
p=m->head->next;
if(p==m->tail)
{
printf("No element. \n");
}
while(p!=m->tail)
{
printf("Y^{%d}_{%d,%d}",(p->y).l,(p->y).i,(p->y).k);
p=p->next;
}
}
void print_polynomial(polynomial n)
{
polynomial p;
int i=0;
p=n->head->next;
if(p==n->tail)
{
printf("No element. \n");
}
while(p!=n->tail)
{
if(i !=0)
{
printf("+");
}
i++;
print_monomial(p->m);
p=p->next;
}
printf("\n");
}
int length_monomial(monomial a)
{
int len=0;
monomial_node *b;
b=a->head->next;
while(b != a->tail)
{
len++;
b=b->next;
}
return len;
}
int length_polynomial(polynomial a)
{
int len=0;
polynomial_node *b;
b=a->head->next;
while(b != a->tail)
{
len++;
b=b->next;
}
return len;
}
int compare_nodes(node a, node b)
{
int result;
if(a.l==b.l && a.i==b.i && a.k==b.k)
{
result=1;
}
else
{
result=0;
}
return result;
}
monomial delete_node(node b, monomial a)
{
monomial p;
monomial_node *p1;
p=a;
p1=p->head->next;
p=p->head;
while(p1 != a->tail)
{
if(compare_nodes(p1->y, b)==1)
{
p->next = p1->next;
break;
}
p=p->next;
p1=p1->next;
}
return p;
}
int main(int argc, char *argv[])
{
node p;
polynomial FM;
polynomial new_monomials;
polynomial phi[100][1000];
monomial s;
monomial m;
monomial mm[1000];
int type=1;
int ra=2;
int l;
int i,j;
int number;
int a;
int ccc[100][100];
printf("Please input the number of factors.\n");
scanf("%d", &number);
m=create_monomial(number);
FM=create_polynomial(m);
print_monomial(m);
printf("\n");
print_polynomial(FM);
printf("\n len(m)=%d", length_monomial(m));
printf("\n len(FM)=%d", length_polynomial(FM));
node y,z,w;
y.l=1;y.i=2;y.k=3;
z.l=1;z.i=2;z.k=3;
w.l=2;w.i=2;w.k=3;
printf("\n y=z? %d\n", compare_nodes(y,z));
printf("\n y=w? %d\n", compare_nodes(y,w));
printf("\n delete y in m:\n");
print_monomial(delete_node(y, m));
return 0;
}