线性表的应用算法:构造两个按指数递增的有序链表,实现两个一元多项式,写Addlist 函数 ,用C语言写
时间: 2024-11-09 18:30:10 浏览: 20
线性表,也称为数组或链表,是一种常见的数据结构,在计算机科学中有广泛应用。在这里,我们需要创建两个按指数递增顺序排列的有序链表,并通过它们表示两个一元多项式。一元多项式通常包含常数项、一次项和其他更高次项,我们可以用链表节点存储每个系数及其对应的幂。
为了实现这个功能,我们首先需要定义一个链表节点结构,用于存储多项式的系数和指数。然后,可以分别创建两个链表,并将指数递增的数据添加到链表中。最后编写一个`AddList`函数,该函数会遍历两个链表,计算相应的和并更新节点值。
这是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct ListNode {
double value; // 一元多项式的系数
int exponent; // 指数
struct ListNode* next; // 链接下一个节点
} ListNode;
// 创建新节点
ListNode* createNode(double val, int exp) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->value = val;
newNode->exponent = exp;
newNode->next = NULL;
return newNode;
}
// 插入按指数递增的元素到链表
void insertSorted(ListNode** head, double val, int exp) {
if (*head == NULL || exp > (*head)->exponent) {
*head = createNode(val, exp);
} else {
ListNode* current = *head;
while (current->next != NULL && current->next->exponent < exp) {
current = current->next;
}
if (current->next != NULL && current->next->exponent == exp) {
current->next->value += val;
} else {
ListNode* newNode = createNode(val, exp);
newNode->next = current->next;
current->next = newNode;
}
}
}
// AddList 函数
ListNode* AddList(ListNode* list1, ListNode* list2) {
ListNode* result = NULL;
ListNode* temp1 = list1, *temp2 = list2;
while (temp1 != NULL && temp2 != NULL) {
double sum = temp1->value + temp2->value;
ListNode* newNode = createNode(sum, temp1->exponent);
if (result == NULL) {
result = newNode;
} else {
newNode->next = result;
}
temp1 = temp1->next;
temp2 = temp2->next;
}
// 如果其中一个链表还有剩余元素
if (temp1 != NULL) {
while (temp1 != NULL) {
newNode = createNode(temp1->value, temp1->exponent);
newNode->next = result;
result = newNode;
temp1 = temp1->next;
}
} else if (temp2 != NULL) {
while (temp2 != NULL) {
newNode = createNode(temp2->value, temp2->exponent);
newNode->next = result;
result = newNode;
temp2 = temp2->next;
}
}
return result;
}
// 打印链表
void printList(ListNode* head) {
while (head != NULL) {
printf("%.2f x^%d -> ", head->value, head->exponent);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建两个示例链表
ListNode* list1 = NULL;
insertSorted(&list1, 1, 0); // 1x^0
insertSorted(&list1, 2, 2); // 2x^2
ListNode* list2 = NULL;
insertSorted(&list2, 3, 1); // 3x^1
insertSorted(&list2, 4, 3); // 4x^3
// 添加链表
ListNode* result = AddList(list1, list2);
// 打印结果链表
printList(result);
return 0;
}
```
在这个例子中,`AddList`函数实现了合并两个一元多项式链表的功能。运行`main`函数,你会看到输出的结果是一个新的链表,包含了两个输入链表对应项的和。注意,这里假设输入的链表已经是按照指数递增排序的。
阅读全文