void InitPolylist(Polylist *L)/*L(二级指针:存放一级指针变量的地址)前面要加*,表示L所指向的那个指针,作L这个指针指向的PolyList类型的指针*/ *L = (Polynode*)malloc(sizeof(Polynode));/*malloc如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL;给*L动态内存分配*/ (*L)->next = NULL;/*头结点的指针域为空*/ } Polylist CreatePolylist()/*输入多项式的系数和指数,用尾插法建立一元多项式的链表*/ { Polynode *head, *rear, *s; double a; int x; head=(Polynode *)malloc(sizeof(Polynode)); head->next=NULL; rear=head; scanf("%lf",&a); /*%lf长浮点型*/ scanf("%d",&x);/*%d十进制整型*/ while(a!=0) { s=(Polynode*)malloc(sizeof(Polynode)); /*给s动态内存分配,动态分配的内存在调用malloc()或相关函数时产生,在调用free()时释放*/ s->coef=a; s->exp=x; rear->next=s; rear=s; scanf("%lf",&a); scanf("%d",&x); } rear->next=NULL; return head; } int LengthPolylist(Polylist L) { Polylist temp = L->next; int length = 0; while(temp!=NULL){/*temp不为空*/ length++; temp=temp->next;/*temp->next赋给temp*/ } return length; } void OutputPolylist(Polylist L) { Polylist list; list = L->next; int t=LengthPolylist(L); printf("inlcude %d coef/exp list is:\n",t); if(list==NULL){ printf("is empty!\n"); }else{ while(list!=NULL){ printf("%.2f,%d\n",list->coef,list->exp); list=list->next; } } }为什么这么做
时间: 2024-03-22 14:40:40 浏览: 74
这段代码实现了多项式链表的初始化、创建、求长度和输出操作。
在 `InitPolylist` 函数中,通过对传入的一级指针 `L` 进行动态内存分配,分配一块 `Polynode` 类型的内存,并将其地址赋值给 `L` 所指向的指针变量,从而实现了对头节点的初始化操作。
在 `CreatePolylist` 函数中,首先分配了一个头节点,并初始化其指针域为空。然后通过循环读取输入的系数和指数,动态分配一个节点,并将系数和指数存储在节点中。将新节点插入链表的尾部,具体地,将新节点赋值给 `rear->next`,并将 `rear` 指向新节点,从而实现了尾插法建立多项式链表的操作。
在 `LengthPolylist` 函数中,通过遍历多项式链表,统计链表中节点的个数,并返回节点个数。
在 `OutputPolylist` 函数中,首先获取多项式链表的头节点指针 `L` 的下一个节点指针 `list`,并计算多项式链表的长度 `t`。然后根据 `list` 是否为空,判断链表是否为空链表。若非空,则遍历链表,输出每个节点的系数和指数。若为空,则输出一条提示信息表明链表为空。
需要注意的是,在 `CreatePolylist` 函数中,输入系数和指数的循环条件是 `a!=0`,这意味着只有当输入的系数不为0时,才会继续读取输入的系数和指数。这是因为多项式链表的建立是基于单链表的,因此在输入系数为0时,可以视为该节点不需要存储,因此可以结束链表的建立过程。
相关问题
#include <stdio.h> #include <malloc.h> #include <math.h> typedef struct Polynode { double coef; int exp; struct Polynode *next; }Polynode,* Polylist; Polylist H=NULL;/*一元多项式头指针的全局变量*/ /*单链表模块*/ void InitPolylist(Polylist *L); Polylist CreatePolylist(); /*输入多项式的系数和指数,用尾插法建立一元多项式的链表*/ int LengthPolylist(Polylist L); void OutputPolylist(Polylist L); Polylist AddPolylist();/*创建两个多项式并相加,完成后显示序列*/ void ComputePolylist(Polylist L);/*计算多项式在x=%d的值*/ void DestroyPolylist(Polylist L); /*注解1:形式参数Polylist L是链表的头指针*/ /*主函数模块*/ int main() { H=AddPolylist(); ComputePolylist(H); OutputPolylist(H); DestroyPolylist(H); return 0; } /* 请在这里填写答案 */ /*单链表模块*/ void InitPolylist(Polylist *L) { } Polylist CreatePolylist()/*输入多项式的系数和指数,用尾插法建立一元多项式的链表*/ { } int LengthPolylist(Polylist L) { } void OutputPolylist(Polylist L) { } Polylist AddPolylist()/*创建两个多项式并相加,完成后显示序列*/ { } void ComputePolylist(Polylist L)/*计算多项式在x=%d的值*/ { } void DestroyPolylist(Polylist L) { }补全代码
/*单链表模块*/
/*初始化链表*/
void InitPolylist(Polylist *L) {
*L = NULL;
}
/*创建一元多项式的链表*/
Polylist CreatePolylist() {
Polylist L, p, q;
int n, i;
double coef;
int exp;
InitPolylist(&L);
printf("请依次输入多项式的项数、系数和指数:\n");
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%lf%d", &coef, &exp);
p = (Polylist)malloc(sizeof(Polynode));
p->coef = coef;
p->exp = exp;
p->next = NULL;
if (L == NULL) {
L = p;
} else {
q = L;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
}
return L;
}
/*计算链表的长度*/
int LengthPolylist(Polylist L) {
int len = 0;
Polylist p = L;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
/*输出链表*/
void OutputPolylist(Polylist L) {
Polylist p = L;
if (p == NULL) {
printf("多项式为空!\n");
} else {
printf("多项式的各项系数和指数分别为:\n");
while (p != NULL) {
printf("%.2lfX^%d ", p->coef, p->exp);
p = p->next;
}
printf("\n");
}
}
/*创建两个多项式并相加,完成后返回相加后的链表*/
Polylist AddPolylist() {
Polylist L1, L2, L3, p1, p2, p3, q;
InitPolylist(&L1);
InitPolylist(&L2);
InitPolylist(&L3);
printf("请输入第1个多项式:\n");
L1 = CreatePolylist();
printf("请输入第2个多项式:\n");
L2 = CreatePolylist();
p1 = L1;
p2 = L2;
p3 = L3;
while (p1 != NULL && p2 != NULL) {
q = (Polylist)malloc(sizeof(Polynode));
if (p1->exp == p2->exp) {
q->coef = p1->coef + p2->coef;
q->exp = p1->exp;
p1 = p1->next;
p2 = p2->next;
} else if (p1->exp > p2->exp) {
q->coef = p1->coef;
q->exp = p1->exp;
p1 = p1->next;
} else {
q->coef = p2->coef;
q->exp = p2->exp;
p2 = p2->next;
}
q->next = NULL;
p3->next = q;
p3 = q;
}
while (p1 != NULL) {
q = (Polylist)malloc(sizeof(Polynode));
q->coef = p1->coef;
q->exp = p1->exp;
q->next = NULL;
p3->next = q;
p3 = q;
p1 = p1->next;
}
while (p2 != NULL) {
q = (Polylist)malloc(sizeof(Polynode));
q->coef = p2->coef;
q->exp = p2->exp;
q->next = NULL;
p3->next = q;
p3 = q;
p2 = p2->next;
}
return L3;
}
/*计算多项式在x=%d的值*/
void ComputePolylist(Polylist L) {
int x;
double result = 0.0;
printf("请输入x的值:\n");
scanf("%d", &x);
Polylist p = L;
while (p != NULL) {
result += p->coef * pow(x, p->exp);
p = p->next;
}
printf("多项式在x=%d的值为:%.2lf\n", x, result);
}
/*销毁链表*/
void DestroyPolylist(Polylist L) {
Polylist p = L, q;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
}
/*单链表模块*/ void InitPolylist(Polylist *L); Polylist CreatePolylist(); /*输入多项式的系数和指数,用尾插法建立一元多项式的链表*/ int LengthPolylist(Polylist L); void OutputPolylist(Polylist L); Polylist AddPolylist();/*创建两个多项式并相加,完成后显示序列*/ void ComputePolylist(Polylist L);/*计算多项式在x=%d的值*/ void DestroyPolylist(Polylist L); /*注解1:形式参数Polylist L是链表的头指针*/
这是一段单链表模块的代码,用于实现一元多项式的链表。具体功能如下:
- InitPolylist:初始化链表
- CreatePolylist:用尾插法建立一元多项式的链表,输入多项式的系数和指数
- LengthPolylist:返回链表的长度
- OutputPolylist:输出链表中每个节点的系数和指数
- AddPolylist:创建两个多项式并相加,返回相加后的链表
- ComputePolylist:计算多项式在x=%d的值
- DestroyPolylist:销毁链表,释放内存
其中,形式参数Polylist L是链表的头指针。这段代码还缺少具体实现,需要根据需求进行实现。
阅读全文