用C语言代码利用链表计算两个大数相乘
时间: 2024-05-07 09:20:03 浏览: 13
以下是一个基于链表的 C 语言代码,用于计算两个大数的乘积。
```c
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *next;
};
typedef struct node Node;
Node *create_node(int num) {
Node *new_node = (Node *) malloc(sizeof(Node));
new_node->data = num;
new_node->next = NULL;
return new_node;
}
Node *insert_at_end(Node *head, int num) {
Node *new_node = create_node(num);
if (head == NULL) {
head = new_node;
return head;
}
Node *temp = head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_node;
return head;
}
Node *reverse_list(Node *head) {
Node *prev = NULL, *current = head, *next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
Node *multiply_lists(Node *head1, Node *head2) {
Node *result = NULL;
Node *temp1 = head1, *temp2;
int carry = 0, sum;
while (temp1 != NULL) {
temp2 = head2;
Node *new_node = NULL;
carry = 0;
while (temp2 != NULL) {
sum = (temp1->data * temp2->data) + carry;
carry = sum / 10;
new_node = insert_at_end(new_node, sum % 10);
temp2 = temp2->next;
}
if (carry > 0) {
new_node = insert_at_end(new_node, carry);
}
new_node = reverse_list(new_node);
for (int i = 0; i < temp1->data; i++) {
new_node = insert_at_end(new_node, 0);
}
result = add_lists(result, new_node);
temp1 = temp1->next;
}
return result;
}
Node *add_lists(Node *head1, Node *head2) {
Node *result = NULL;
Node *temp1 = head1, *temp2 = head2;
int carry = 0, sum;
while (temp1 != NULL || temp2 != NULL) {
sum = carry + (temp1 != NULL ? temp1->data : 0) + (temp2 != NULL ? temp2->data : 0);
carry = sum / 10;
result = insert_at_end(result, sum % 10);
if (temp1 != NULL) {
temp1 = temp1->next;
}
if (temp2 != NULL) {
temp2 = temp2->next;
}
}
if (carry > 0) {
result = insert_at_end(result, carry);
}
return result;
}
void display_list(Node *head) {
Node *temp = head;
while (temp != NULL) {
printf("%d", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
Node *num1 = NULL, *num2 = NULL, *result = NULL;
char c;
int num;
printf("Enter first number:\n");
while ((c = getchar()) != '\n') {
num = c - '0';
num1 = insert_at_end(num1, num);
}
printf("Enter second number:\n");
while ((c = getchar()) != '\n') {
num = c - '0';
num2 = insert_at_end(num2, num);
}
num1 = reverse_list(num1);
num2 = reverse_list(num2);
result = multiply_lists(num1, num2);
printf("Result:\n");
display_list(result);
return 0;
}
```
该代码将两个大数存储为链表,并使用一个辅助函数来反转链表。然后,它将两个链表相乘,产生一个新的链表,该链表包含结果。最后,它将结果链表打印到控制台上。