使用双向循环链表设计一个程序实现两个任意长的整数求和运算,求c语言实现代码
时间: 2023-05-26 21:04:16 浏览: 150
题目比较细节,需要注意一些特殊情况,以下是一种可能的实现方法:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 定义双向循环链表节点
typedef struct Node {
int value;
struct Node *prev;
struct Node *next;
} Node;
// 创建一个新节点
Node *newNode(int value) {
Node *node = (Node *)malloc(sizeof(Node));
node->value = value;
node->prev = NULL;
node->next = NULL;
return node;
}
// 释放一个节点及其后继节点
void freeNode(Node *node) {
while (node != NULL) {
Node *next = node->next;
free(node);
node = next;
}
}
// 将一个整数转换成双向循环链表表示
Node *intToList(int n) {
Node *head = newNode(0); // 头节点
Node *tail = head; // 尾节点,头尾相连
if (n == 0) {
tail->next = newNode(0);
} else {
while (n != 0) {
int digit = n % 10;
tail->next = newNode(digit);
tail->next->prev = tail;
tail = tail->next;
n /= 10;
}
}
return head;
}
// 将一个双向循环链表表示的整数转换成一个int类型的值
int listToInt(Node *head) {
int n = 0;
int factor = 1;
Node *node = head->next;
while (node != NULL) {
n += factor * node->value;
factor *= 10;
node = node->next;
}
return n;
}
// 反转一个双向循环链表
void reverseList(Node *head) {
Node *node = head->next;
while (node != NULL) {
Node *temp = node->prev;
node->prev = node->next;
node->next = temp;
node = node->prev;
}
Node *temp = head->prev;
head->prev = head->next;
head->next = temp;
}
// 计算两个双向循环链表表示的整数的和
Node *addList(Node *a, Node *b) {
Node *head = newNode(0); // 头节点,结果链表从头开始存储
Node *tail = head; // 尾节点,头尾相连
int carry = 0; // 进位
Node *na = a->prev; // 从低位到高位依次相加
Node *nb = b->prev;
while (na != NULL || nb != NULL) {
int sum = carry;
if (na != NULL) {
sum += na->value;
na = na->prev;
}
if (nb != NULL) {
sum += nb->value;
nb = nb->prev;
}
carry = sum / 10;
sum %= 10;
tail->next = newNode(sum);
tail->next->prev = tail;
tail = tail->next;
}
if (carry != 0) {
tail->next = newNode(carry);
tail->next->prev = tail;
tail = tail->next;
}
reverseList(head); // 翻转结果链表,使其符合正常的整数表示形式
return head;
}
int main() {
char s1[10000], s2[10000];
if (scanf("%s%s", s1, s2) != 2) {
printf("Error: invalid input.\n");
return 1;
}
// 验证输入合法性
for (int i = 0; i < strlen(s1); i++) {
if (!isdigit(s1[i])) {
printf("Error: invalid input.\n");
return 1;
}
}
for (int i = 0; i < strlen(s2); i++) {
if (!isdigit(s2[i])) {
printf("Error: invalid input.\n");
return 1;
}
}
// 将输入的字符数组转换成双向循环链表
Node *a = intToList(atoi(s1));
Node *b = intToList(atoi(s2));
// 计算两数之和
Node *c = addList(a, b);
// 将结果链表转换成整数输出
printf("%d\n", listToInt(c));
// 释放内存
freeNode(a);
freeNode(b);
freeNode(c);
return 0;
}
```
注意:本代码中忽略了输入长度和结果长度超出限制的情况,需要根据具体要求进行修改。
阅读全文