用c语言写一个单链表表示多项式,并实现一元多项式的输入和输出返回一元多项式中一共有多少项数据,得到一元多项式中指数最大的系数并打印输出,输入系数和指数,如果元素存在,则删除若不存在打印出错信息
时间: 2023-05-24 08:04:34 浏览: 134
一元多项式_单链表实现一元多项式求和_signa67_pleasekzo_
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int coef;//系数
int exp;//指数
struct node *next;//指向下一个节点的指针
} Node, *PNode;
//函数声明
int readList(PNode);
void printList(PNode);
int countList(PNode);
int maxExp(PNode);
void deleteNode(PNode, int);
int main() {
Node head = {0, 0, NULL};//定义链表头节点
PNode pHead = &head;//定义指向头节点的指针
printf("请输入一元多项式:\n");
int count = readList(pHead);//读入一元多项式
printf("多项式中共有%d项数据\n", count);
printList(pHead);//打印输出一元多项式
int max = maxExp(pHead);//求出一元多项式中指数最大的系数
printf("一元多项式中指数最大的系数为:%d\n", max);
printf("请输入要删除节点的指数:");
int exp;
scanf("%d", &exp);
deleteNode(pHead, exp);//删除指定指数的节点
printf("删除后的一元多项式:\n");
printList(pHead);//打印输出删除后的一元多项式
return 0;
}
/**
* 从标准输入读取一元多项式
* @param pHead 指向头节点的指针
* @return 多项式中元素的个数
*/
int readList(PNode pHead) {
int n, count = 0;//n表示多项式中元素的个数,count表示已经读入的元素个数
printf("请输入多项式中元素的个数:");
scanf("%d", &n);
PNode p = pHead;//定义指向头节点的指针变量,用于遍历链表
for (int i = 0; i < n; i++) {
printf("请输入第%d个元素的系数和指数:", i + 1);
//创建新节点
PNode newNode = (PNode) malloc(sizeof(Node));
scanf("%d %d", &newNode->coef, &newNode->exp);
newNode->next = NULL;
//插入到链表中
while (p->next != NULL && p->next->exp < newNode->exp) {
p = p->next;
}
if (p->next != NULL && p->next->exp == newNode->exp) {
printf("元素已存在,无法添加!\n");
free(newNode);//释放新节点的内存
} else {
newNode->next = p->next;
p->next = newNode;
p = pHead;//指针重新指向链表头节点
count++;//元素个数加1
}
}
return count;
}
/**
* 打印输出一元多项式
* @param pHead 指向头节点的指针
*/
void printList(PNode pHead) {
printf("多项式为:");
PNode p = pHead->next;
while (p != NULL) {
printf("%dX^%d", p->coef, p->exp);
if (p->next != NULL) {
printf("+");
}
p = p->next;
}
printf("\n");
}
/**
* 统计一元多项式中元素的个数
* @param pHead 指向头节点的指针
* @return 多项式中元素的个数
*/
int countList(PNode pHead) {
int count = 0;
PNode p = pHead->next;
while (p != NULL) {
count++;
p = p->next;
}
return count;
}
/**
* 求出一元多项式中指数最大的系数
* @param pHead 指向头节点的指针
* @return 指数最大的系数
*/
int maxExp(PNode pHead) {
int max = 0;
PNode p = pHead->next;
while (p != NULL) {
if (p->exp > max) {
max = p->coef;
}
p = p->next;
}
return max;
}
/**
* 删除一元多项式中指定指数的节点
* @param pHead 指向头节点的指针
* @param exp 指定的指数
*/
void deleteNode(PNode pHead, int exp) {
PNode p = pHead->next;
PNode prev = pHead;//定义指向前一个节点的指针
while (p != NULL && p->exp != exp) {
prev = p;
p = p->next;
}
if (p != NULL) {//找到要删除的节点
prev->next = p->next;
free(p);//释放要删除节点的内存
} else {//没有找到要删除的节点
printf("指定的节点不存在,无法删除!\n");
}
}
```
阅读全文