C语言 数据结构 用链表设计一个100位以内的长整数加减运算的程序。 三、实验要求 1、输入输出要求:每四位一组,组间用逗号分隔。
时间: 2024-09-07 22:04:14 浏览: 86
在C语言中,我们可以利用链表数据结构来表示长整数,因为它可以动态地存储任意长度的数据。这里是一个简单的例子,我们将使用单链表来设计一个可以处理100位以内整数的加减操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int digit; // 存储每一位数字
struct Node* next; // 指向下一个节点
} ListNode;
// 初始化链表
ListNode* createNode(int num) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->digit = num;
newNode->next = NULL;
return newNode;
}
// 将链表转换为字符串
char* nodeListToString(ListNode* head) {
char* str = malloc(100);
int i = 0;
while (head) {
str[i++] = head->digit + '0';
head = head->next;
}
str[i] = '\0'; // 添加结束符
return str;
}
// 链表加法
ListNode* addLinkedList(ListNode* list1, ListNode* list2) {
ListNode* dummy = createNode(0); // 创建虚拟头节点
ListNode* tail = dummy;
int carry = 0;
while (list1 || list2) {
int sum = carry;
if (list1) {
sum += list1->digit;
list1 = list1->next;
}
if (list2) {
sum += list2->digit;
list2 = list2->next;
}
carry = sum / 10; // 更新进位
tail->next = createNode(sum % 10);
tail = tail->next;
}
if (carry > 0) {
tail->next = createNode(carry);
}
return dummy->next;
}
// 链表减法
ListNode* subtractLinkedList(ListNode* minuend, ListNode* subtrahend) {
ListNode* dummy = createNode(0);
ListNode* tail = dummy;
int borrow = 0;
ListNode* currentMinuend = minuend;
ListNode* currentSubtrahend = subtrahend;
while (currentMinuend && currentSubtrahend) {
int difference = currentMinuend->digit - borrow - currentSubtrahend->digit;
if (difference < 0) {
borrow = 1;
difference += 10;
} else {
borrow = 0;
}
tail->next = createNode(difference);
tail = tail->next;
currentMinuend = currentMinuend->next;
currentSubtrahend = currentSubtrahend->next;
}
while (currentMinuend) {
int difference = currentMinuend->digit - borrow;
if (difference < 0) {
borrow = 1;
difference += 10;
} else {
borrow = 0;
}
tail->next = createNode(difference);
tail = tail->next;
currentMinuend = currentMinuend->next;
}
if (borrow == 1) { // 补借位
tail->next = createNode(1);
}
return dummy->next;
}
int main() {
ListNode* num1, *num2;
printf("请输入第一个100位内的长整数(用逗号分隔每四位): ");
scanf("%d", &num1);
ListNode* num1Str = createListNode(num1, 4);
num1 = num1Str;
printf("请输入第二个100位内的长整数(用逗号分隔每四位): ");
scanf("%d", &num2);
ListNode* num2Str = createListNode(num2, 4);
num2 = num2Str;
ListNode* resultAdd = addLinkedList(num1, num2);
ListNode* resultSubtract = subtractLinkedList(num1, num2);
char* addResult = nodeListToString(resultAdd);
char* subtractResult = nodeListToString(resultSubtract);
printf("两数相加结果: %s\n", addResult);
printf("两数相减结果: %s\n", subtractResult);
free(addResult);
free(subtractResult);
free(resultAdd);
free(resultSubtract);
return 0;
}
// 辅助函数:创建链表并连接
ListNode* createListNode(int num, int digitsPerGroup) {
ListNode* node = NULL;
for (int i = num; i >= 0; i /= 10) {
node = createNode(i % 10);
node->next = node;
node = node->next;
}
node->next = NULL;
return node;
}
```
在这个程序中,我们首先将用户输入的十进制数转换成链表形式,然后分别对两个链表进行加法和减法运算,并将结果也转换回链表形式。注意,由于输入限制在100位内,这个程序只适用于不超过四位数的整数。
阅读全文