本文章分成几个部分:
问题,代码,测试
问题:请用代码实现,两个链表,分别存储一个数字的各个位数,请计算两个链表的相加结果。
如: l1: 1->3->4 l2: 8->9 输出结果为: 223
代码:
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include "my_list.h" #define max(a,b) (((a) > (b)) ? (a) : (b)) struct ListNode* reverse_list(struct ListNode* head) { if (head == NULL || head->next == NULL) return head; struct ListNode *pre = head; struct ListNode *cur = head->next; struct ListNode *tmp = head->next->next; while(cur) { tmp = cur->next; cur->next = pre; pre = cur; cur = tmp; } head->next = NULL; return pre; } void add_list_node(struct ListNode *head, struct ListNode *node){ if (!node) return; node->next = head->next; head->next = node; head->val++; } /* caller should free ListNode memory */ struct ListNode * get_list_sum(struct ListNode* list1, struct ListNode* list2){ if (list1 == NULL || list2 == NULL) return NULL; struct ListNode *head1 = reverse_list(list1); struct ListNode *head2 = reverse_list(list2); struct ListNode *head = malloc(sizeof(struct ListNode)); struct ListNode *node = NULL; int add1 = 0; int add2 = 0; int sum = 0; int c = 0; head->val = 0; head->next = NULL; while(head1 != NULL || head2 != NULL) { if (head1) add1 = head1->val; if (head2) add2 = head2->val; sum = (add1 + add2 + c)%10; c = (add1 + add2 + c)/10; node = malloc(sizeof(struct ListNode)); node->val = sum; node->next = NULL; add_list_node(head, node); if (head1) head1 = head1->next; if (head2) head2 = head2->next; add1 = 0; add2 = 0; } if (c != 0) { node = malloc(sizeof(struct ListNode)); node->val = c; node->next = NULL; add_list_node(head, node); } return head; } struct ListNode * create_list(int *array, int n) { int i; struct ListNode *head = malloc(sizeof(struct ListNode)); struct ListNode *node; struct ListNode *cur = head; head->val = array[0]; head->next = NULL; for(i = 1; i < n; i++) { node = malloc(sizeof(struct ListNode)); node->val = array[i]; node->next = NULL; cur->next = node; cur = node; } return head; } void print_list(struct ListNode * head){ struct ListNode *cur = head; while(cur) { printf("%d ", cur->val); cur = cur->next; } printf("\n"); } void free_list(struct ListNode *head){ struct ListNode * tmp; while(head) { tmp = head; head = tmp->next; free(tmp); } }
my_list.h头文件如下所示:
/* This is my_list.h */ struct ListNode { int val; struct ListNode *next; }; /* caller should free ListNode memory */ struct ListNode * get_list_sum(struct ListNode* list1, struct ListNode* list2); struct ListNode * create_list(int *array, int n); void print_list(struct ListNode * head); void free_list(struct ListNode *head);
写了下测试代码:
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include "my_list.h" #define max(a,b) (((a) > (b)) ? (a) : (b)) bool isnum(char * str, int n){ int i; for(i = 0; i < n; i++) if (str[i] < '0' || str[i] > '9') return false; return true; } void print_addnum(struct ListNode *list1, int a1, struct ListNode *list2, int a2){ int i; if (a1 > a2) { printf(" "); print_list(list1); printf("+ "); for(i = 0; i < a1-a2; i++) printf(" "); print_list(list2); printf("=\n"); return; } printf(" "); for(i = 0; i < a2-a1; i++) printf(" "); print_list(list1); printf("+ "); print_list(list2); printf("=\n"); return; } void print_result(struct ListNode *result_head, int len1, int len2){ if (result_head->val == max(len1,len2)) printf(" "); printf(" "); print_list(result_head->next); }
int main(int argc, char *argv[]){ if (argc != 3) { printf("error: The number of parameters is incorrect\n"); return 1; } if (argv[1] == NULL || argv[2] == NULL) { printf("error: The parameter content is empty\n"); return 1; } char *add1 = argv[1]; int len1 = strlen(add1); char *add2 = argv[2]; int len2 = strlen(add2); int *array1 = malloc(len1 * sizeof(int)); int *array2 = malloc(len2 * sizeof(int)); int i; if (isnum(add1, len1) != true || isnum(add2, len2) != true) { printf("error: Parameter is not number. num1: %s num2: %s\n", add1, add2); return 1; } for (i = 0; i < len1; i++) array1[i] = add1[i] - '0'; for(i = 0; i < len2; i++) array2[i] = add2[i] - '0'; struct ListNode *head; struct ListNode * list1 = create_list(array1, len1); struct ListNode * list2 = create_list(array2, len2);
print_addnum(list1, len1, list2, len2); head = get_list_sum(list1, list2); print_result(head, len1, len2); free_list(list1); free_list(list2); free_list(head);
return 0; }
下面我们来看一下测试结果:
linux-eFsRxl:/mnt # ./list_add 204820948230948230498230482304923840929340294830948230948 203482039482333775738867028967028967028967028223133223126383126343060950621 2 0 4 8 2 0 9 4 8 2 3 0 9 4 8 2 3 0 4 9 8 2 3 0 4 8 2 3 0 4 9 2 3 8 4 0 9 2 9 3 4 0 2 9 4 8 3 0 9 4 8 2 3 0 9 4 8 + 2 0 3 4 8 2 0 3 9 4 8 2 3 3 3 7 7 5 7 3 8 8 6 7 0 2 8 9 6 7 0 2 8 9 6 7 0 2 8 9 6 7 0 2 8 2 2 3 1 3 3 2 2 3 1 2 6 3 8 3 1 2 6 3 4 3 0 6 0 9 5 0 6 2 1 = 2 0 3 4 8 2 0 3 9 4 8 2 3 3 3 7 7 5 9 4 3 6 8 7 9 7 7 1 9 7 9 7 7 1 9 7 5 2 7 1 9 7 5 1 0 5 2 8 0 5 7 0 6 4 0 5 5 7 2 3 4 2 1 1 7 4 0 0 9 1 8 1 5 6 9 linux-eFsRxl:/mnt # ./list_add 1 0 1 + 0 = 1 linux-eFsRxl:/mnt # ./list_add 5 5 5 + 5 = 1 0 linux-eFsRxl:/mnt # ./list_add 190 986 1 9 0 + 9 8 6 = 1 1 7 6