程序目标:
- 基本多项式加乘功能实现
- 零多项式输出0 0
- 合并同类项时有抵消
- 输出格式要求
代码实现细节:
- 多项式链表实现的输入:
对于链表的指针p而言,要想增加结点,必须对p->next进行操作使用malloc申请内存。如果对p直接进行操作相当于是p的重定向,就与原来的链表无关了。小小的怀疑,可能链表头一般默认有个空的头结点也是跟这个有关。
void input(Node *p){ //错误的定义方法
Node *p;
int i;
p = q -> Next; //对p的第一次定义
for (i = 0; i < num; i++){
p = (Node*)malloc(sizeof(Node)); //相当于是对p的第二次定义,把p的值给改了,而不是在q后面接上,断链了
scanf("%d %d", p -> a, p -> n);
}
}
void input(Node *p){ //正确的定义方法
Node *p;
int i;
p = q; //对p的定义;
for (i = 0; i < num; i++){
p -> next = (Node*)malloc(sizeof(Node)); //先把链给接上,再把p往后移;
p = p -> next;
scanf("%d %d", p -> a, p -> n);
}
}
- 对于乘法而言,直接使用一个插入函数即刻,插入的情况分三种:表头插入、中间,表尾。首先定位至需要插入的位置,然后根据三种情况不同进行操作即可。代码如下:
LNode * insert(LNode * list, int xs, int zs)
{
//插入有三种情况:开头、中间、结尾
LNode* p = list, *q;
//定位
while (p->Next != NULL && p ->Next ->Zs > zs)
p = p->Next;
//处理
if (p-> Next== NULL) {
p->Next = (LNode*)malloc(sizeof(LNode));
p = p->Next;
p->Xs = xs; p->Zs = zs; p->Next = NULL;
}
else if (p->Next->Zs < zs) {
q = (LNode*)malloc(sizeof(LNode));
q->Xs = xs; q->Zs = zs; q->Next = p->Next; p->Next = q;
}
else if (p->Next->Zs == zs) {
p->Next->Xs +=xs;
}
return list;
}
- 对于有零多项式的问题选择运算过程中先不管,最后再检查处理,代码如下:
void check(LNode* list) {
LNode *p, *q;
p = list->Next; q = list;
while (p) {
if (p->Xs == 0)
q->Next = p->Next;
p = p->Next; q = q->Next;
}
if (list->Next == NULL) {
p = list->Next = (LNode*)malloc(sizeof(LNode));
p->Next = NULL;
p->Zs = 0;
p->Xs = 0;
}
return;
}