#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define N 1000 //此处可以改输入大数据的位数
struct Add_Number
{
int num;
struct Add_Number *pnext;
};
typedef struct Add_Number A_N;
A_N* node(A_N*head, int inum) //创建链表
{
A_N *newnode = (A_N*)malloc(sizeof(A_N));
newnode->num = inum;
newnode->pnext = NULL;
if (head == NULL)
{
head = newnode;
}
else
{
A_N *p = head;
while (p->pnext != NULL)
{
p = p->pnext;
}
p->pnext = newnode;
}
return head;
}
A_N* Invert(A_N*head) //倒置链表
{
A_N *p1;
A_N *p2;
A_N *p3;
p1 = head;
p2 = head->pnext;
if (head == NULL || head->pnext == NULL)
{
return head;
}
while (p2 != NULL)
{
p3 = p2->pnext;
p2->pnext = p1;
p1 = p2;
p2 = p3;
}
head->pnext = NULL;
head = p1;
return head;
}
int Change_To_Str(A_N*head, char *number) //将链表中的数转换为字符数组中,返回数的个数
{
A_N *p = head;
int count = 0;
while (p != NULL)
{
number[count] = p->num + 48;
count++;
p = p->pnext;
}
return count;
}
void Show_All(A_N*head) //显示全部节点
{
A_N *p = head;
while (p != NULL)
{
printf("%d", p->num);
p = p->pnext;
}
printf("\n");
}
A_N* ADD(A_N*head1, A_N*head2, A_N*head3) //实现两个链表相加,返回值为新的链表,即两链表之和,个位在前
{
A_N*p1 = head1;
A_N*p2 = head2;
int add_sum;
int one;
int ten = 0;
while ((p1 != NULL) && (p2 != NULL))
{
if (ten == 0)
{
add_sum = (p1->num) + (p2->num);
if (add_sum > 9)
{
one = add_sum % 10;
ten = 1;
head3 = node(head3, one);
}
else
{
head3 = node(head3, add_sum);
}
}
else
if (ten == 1)
{
add_sum = (p1->num) + (p2->num) + 1;
if (add_sum > 9)
{
one = add_sum % 10;
ten = 1;
head3 = node(head3, one);
}
else
{
head3 = node(head3, add_sum);
ten = 0;
}
}
p1 = p1->pnext;
p2 = p2->pnext;
}
if (p1 == NULL)
{
while (p2 != NULL)
{
if (ten == 0)
{
add_sum = p2->num;
head3 = node(head3, add_sum);
}
else if (ten == 1)
{
add_sum = (p2->num) + 1;
if (add_sum > 9)
{
one = add_sum % 10;
ten = 1;
head3 = node(head3, one);
}
else
{
head3 = node(head3, add_sum);
ten = 0;
}
}
p2 = p2->pnext;
}
}
else if (p2 == NULL)
{
while (p1 != NULL)
{
if (ten == 0)
{
add_sum = p1->num;
head3 = node(head3, add_sum);
}
else
{
add_sum = (p1->num) + 1;
if (add_sum > 9)
{
one = add_sum % 10;
ten = 1;
head3 = node(head3, one);
}
else
{
head3 = node(head3, add_sum);
ten = 0;
}
}
p1 = p1->pnext;
}
}
if (ten == 1)
{
head3 = node(head3, 1);
}
return head3;
}
A_N* Free_all(A_N *head) //释放内存
{
A_N *p1, *p2;
p1 = head;
p2 = head->pnext;
while (p2 != NULL)
{
p1->pnext = p1->pnext->pnext;
free(p2);
p2 = p1->pnext;
}
free(p1);
head = NULL;
return head;
}
//A_N * Input_Change() //输入数据并相加转化成新的链表,个位在前
//{
// A_N *head1=NULL;
// A_N *head2=NULL;
// A_N *head3=NULL;
// char number1[N];
// char number2[N];
// scanf("%s%s", number1, number2);
// int length_n1 = strlen(number1);
// int length_n2 = strlen(number2);
// while (length_n1 > 0)
// {
// int num = (int)number1[length_n1 - 1] - 48;
// length_n1--;
// head1 = node(head1, num);
// }
// while (length_n2 > 0)
// {
// int num = (int)number2[length_n2 - 1] - 48;
// length_n2--;
// head2 = node(head2, num);
// }
// head3 = ADD(head1, head2,head3);
// return head3;
//}
A_N * Input_Change() //输入数据并转化成新的链表,个位在前
{
A_N *head = NULL;
char number[N];
scanf("%s", number);
int length_n = strlen(number);
while (length_n > 0)
{
int num = (int)number[length_n - 1] - 48;
length_n--;
head = node(head, num);
}
return head;
}
void main()
{
A_N *head1 = NULL;
A_N *head2 = NULL;
A_N*head3 = NULL;
head1 = Input_Change();
head2 = Input_Change();
head3 = ADD(head1, head2, head3);
head3 = Invert(head3);
Show_All(head3);
head1=Free_all(head1);
head2=Free_all(head2);
head3=Free_all(head3);
system("pause");
}
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define N 1000 //此处可以改输入大数据的位数
struct Add_Number
{
int num;
struct Add_Number *pnext;
};
typedef struct Add_Number A_N;
A_N* node(A_N*head, int inum) //创建链表
{
A_N *newnode = (A_N*)malloc(sizeof(A_N));
newnode->num = inum;
newnode->pnext = NULL;
if (head == NULL)
{
head = newnode;
}
else
{
A_N *p = head;
while (p->pnext != NULL)
{
p = p->pnext;
}
p->pnext = newnode;
}
return head;
}
A_N* Invert(A_N*head) //倒置链表
{
A_N *p1;
A_N *p2;
A_N *p3;
p1 = head;
p2 = head->pnext;
if (head == NULL || head->pnext == NULL)
{
return head;
}
while (p2 != NULL)
{
p3 = p2->pnext;
p2->pnext = p1;
p1 = p2;
p2 = p3;
}
head->pnext = NULL;
head = p1;
return head;
}
int Change_To_Str(A_N*head, char *number) //将链表中的数转换为字符数组中,返回数的个数
{
A_N *p = head;
int count = 0;
while (p != NULL)
{
number[count] = p->num + 48;
count++;
p = p->pnext;
}
return count;
}
void Show_All(A_N*head) //显示全部节点
{
A_N *p = head;
while (p != NULL)
{
printf("%d", p->num);
p = p->pnext;
}
printf("\n");
}
A_N* ADD(A_N*head1, A_N*head2, A_N*head3) //实现两个链表相加,返回值为新的链表,即两链表之和,个位在前
{
A_N*p1 = head1;
A_N*p2 = head2;
int add_sum;
int one;
int ten = 0;
while ((p1 != NULL) && (p2 != NULL))
{
if (ten == 0)
{
add_sum = (p1->num) + (p2->num);
if (add_sum > 9)
{
one = add_sum % 10;
ten = 1;
head3 = node(head3, one);
}
else
{
head3 = node(head3, add_sum);
}
}
else
if (ten == 1)
{
add_sum = (p1->num) + (p2->num) + 1;
if (add_sum > 9)
{
one = add_sum % 10;
ten = 1;
head3 = node(head3, one);
}
else
{
head3 = node(head3, add_sum);
ten = 0;
}
}
p1 = p1->pnext;
p2 = p2->pnext;
}
if (p1 == NULL)
{
while (p2 != NULL)
{
if (ten == 0)
{
add_sum = p2->num;
head3 = node(head3, add_sum);
}
else if (ten == 1)
{
add_sum = (p2->num) + 1;
if (add_sum > 9)
{
one = add_sum % 10;
ten = 1;
head3 = node(head3, one);
}
else
{
head3 = node(head3, add_sum);
ten = 0;
}
}
p2 = p2->pnext;
}
}
else if (p2 == NULL)
{
while (p1 != NULL)
{
if (ten == 0)
{
add_sum = p1->num;
head3 = node(head3, add_sum);
}
else
{
add_sum = (p1->num) + 1;
if (add_sum > 9)
{
one = add_sum % 10;
ten = 1;
head3 = node(head3, one);
}
else
{
head3 = node(head3, add_sum);
ten = 0;
}
}
p1 = p1->pnext;
}
}
if (ten == 1)
{
head3 = node(head3, 1);
}
return head3;
}
A_N* Free_all(A_N *head) //释放内存
{
A_N *p1, *p2;
p1 = head;
p2 = head->pnext;
while (p2 != NULL)
{
p1->pnext = p1->pnext->pnext;
free(p2);
p2 = p1->pnext;
}
free(p1);
head = NULL;
return head;
}
//A_N * Input_Change() //输入数据并相加转化成新的链表,个位在前
//{
// A_N *head1=NULL;
// A_N *head2=NULL;
// A_N *head3=NULL;
// char number1[N];
// char number2[N];
// scanf("%s%s", number1, number2);
// int length_n1 = strlen(number1);
// int length_n2 = strlen(number2);
// while (length_n1 > 0)
// {
// int num = (int)number1[length_n1 - 1] - 48;
// length_n1--;
// head1 = node(head1, num);
// }
// while (length_n2 > 0)
// {
// int num = (int)number2[length_n2 - 1] - 48;
// length_n2--;
// head2 = node(head2, num);
// }
// head3 = ADD(head1, head2,head3);
// return head3;
//}
A_N * Input_Change() //输入数据并转化成新的链表,个位在前
{
A_N *head = NULL;
char number[N];
scanf("%s", number);
int length_n = strlen(number);
while (length_n > 0)
{
int num = (int)number[length_n - 1] - 48;
length_n--;
head = node(head, num);
}
return head;
}
void main()
{
A_N *head1 = NULL;
A_N *head2 = NULL;
A_N*head3 = NULL;
head1 = Input_Change();
head2 = Input_Change();
head3 = ADD(head1, head2, head3);
head3 = Invert(head3);
Show_All(head3);
head1=Free_all(head1);
head2=Free_all(head2);
head3=Free_all(head3);
system("pause");
}