c语言用链表实现从文本文件读取两个超大数并相加不考虑进位
时间: 2024-02-26 22:56:22 浏览: 70
利用链表实现大数相加
3星 · 编辑精心推荐
好的,我来回答您的问题。
首先,我们可以定义一个结构体来存储每个数字的每一位,如下所示:
```c
struct digit {
int num; // 存储数字
struct digit *next; // 指向下一个数字
};
```
然后,我们可以定义一个函数来从文本文件中读取数字并创建链表。
```c
struct digit *create_list(char *filename) {
FILE *fp;
int c;
struct digit *head = NULL;
struct digit *tail = NULL;
struct digit *new_digit;
fp = fopen(filename, "r");
if (fp == NULL) {
fprintf(stderr, "Failed to open file %s\n", filename);
exit(EXIT_FAILURE);
}
while ((c = fgetc(fp)) != EOF) {
if (isdigit(c)) {
new_digit = malloc(sizeof(struct digit));
if (new_digit == NULL) {
fprintf(stderr, "Failed to allocate memory\n");
exit(EXIT_FAILURE);
}
new_digit->num = c - '0';
new_digit->next = NULL;
if (head == NULL) {
head = new_digit;
tail = new_digit;
} else {
tail->next = new_digit;
tail = new_digit;
}
}
}
fclose(fp);
return head;
}
```
接下来,我们可以定义一个函数来将两个链表中的相应位相加,并返回结果链表。
```c
struct digit *add_lists(struct digit *list1, struct digit *list2) {
struct digit *result = NULL;
struct digit *tail = NULL;
int sum, carry = 0;
while (list1 != NULL && list2 != NULL) {
sum = list1->num + list2->num + carry;
carry = sum / 10;
sum %= 10;
struct digit *new_digit = malloc(sizeof(struct digit));
if (new_digit == NULL) {
fprintf(stderr, "Failed to allocate memory\n");
exit(EXIT_FAILURE);
}
new_digit->num = sum;
new_digit->next = NULL;
if (result == NULL) {
result = new_digit;
tail = new_digit;
} else {
tail->next = new_digit;
tail = new_digit;
}
list1 = list1->next;
list2 = list2->next;
}
return result;
}
```
最后,我们可以在 `main` 函数中调用这些函数来读取两个数字并计算结果。
```c
int main() {
struct digit *list1 = create_list("num1.txt");
struct digit *list2 = create_list("num2.txt");
struct digit *result = add_lists(list1, list2);
// 输出结果
struct digit *p = result;
while (p != NULL) {
printf("%d", p->num);
p = p->next;
}
printf("\n");
return 0;
}
```
需要注意的是,这个程序只能处理不考虑进位的相加,在实际应用中需要考虑进位。
阅读全文