您的位置:首页 > 其它

新手一枚,写了个大数相加的C程序

2016-04-25 23:08 225 查看
#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
;

// char number2
;

// 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
;

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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: