用单链表实现两个大型整数的相加
2010-12-16 21:57
405 查看
最近几天一直在忙老师布置的作业,现在小有成就,和大家分享一下。。
#include<stdio.h>
#include<malloc.h>
#define null 0
#define len sizeof(struct lnode)//宏定义结构体的大小
typedef struct lnode {
int data;
struct lnode *next;
}lnode ,*list;//定义两个节点类型,一个是普通的一个是指针的
void makelnode(list &l)//创建一个空的节点
{l=(list)malloc(len);
l->next=null;
}
void creatlist(list &l)//创建链表
{ char c;
l=(list)malloc(len);//动态申请空间
l->next=null;
while((c=getchar())!='/n')//当从键盘输入的不是回车键的时候把该字符放到一个节点中,并把节点都连起来
{list p;
p=(list)malloc(len);
p->data=c-'0';//把节点的数据域里存上数字
p->next=l->next;//下面两行是把节点连起来
l->next=p;
}
}
void add(list l1,list l2,list &l3)//实现两个链表的相加,相当于两个链表归并成第三个链表
{list p1,p2,p3;
int sum=0;
int cy=0;//定义进位标志
p1=l1->next;//分别始指针指向第一个节点,准备实现个位的相加
p2=l2->next;
while(p1&&p2)//当两个表的长度相同时,即两个数的个数相同while语句是实现相加并且实现第三个链表的创建
{
p3=(list)malloc(len);
sum=p1->data+p2->data+cy;//每个节点只存了一位数
if(sum>=10)//如果多余一位数,节点处只能存一位而两一个要进位
{p3->data=sum-10;
cy=1;//进位标志变为1,为下次相加时候做准备
}
else if(sum>=0&&sum<10)
{p3->data=sum;
cy=0;//没有大于9所以进位标志要归零
}
p1=p1->next;//指针一移到下一个节点,为一个数的十位或百位做准备
p2=p2->next;
p3->next=l3->next;//将创建的节点连起来
l3->next=p3;
}
while(p1)//当第一个数比第二个数的位数多的时候
{
p3=(list)malloc(len);
sum=p1->data+cy;
if(sum>=10)
{p3->data=sum-10;
cy=1;
}
else if(sum>=0&&sum<10)
{p3->data=sum;
cy=0;
}
p1=p1->next;
p3->next=l3->next;
l3->next=p3;
}
while(p2)
{
p3=(list)malloc(len);
sum=p2->data+cy;
if(sum>=10)
{p3->data=sum-10;
cy=1;
}
else if(sum>=0&&sum<10)
{p3->data=sum;
cy=0;
}
p2=p2->next;
p3->next=l3->next;
l3->next=p3;
}
if(cy)//当都加完了,还有进位标志,则在开辟一个空间把它也放到链表中去
{
p3=(list)malloc(len);
p3->data=1;
p3->next=l3->next;
l3->next=p3;
}
}
void out (list l)//定义输出函数
{
list p;
p=l->next;
while(p)
{printf("%d", p->data);
p=p->next;
}
}
void main()
{
list l1,l2,l3;//定义指针变量,是指向结构体的
makelnode(l3);//只为打三个来链表创建头结点
printf("please put a number/n");
creatlist(l1);//创建第一个链表
printf("please put another one/n");
creatlist(l2);//创建第二个量链表
add(l1,l2,l3);//实现两个链表的相加,并把结果放在第三个链表中去
out(l3);输出第三个链表
return;
}
#include<stdio.h>
#include<malloc.h>
#define null 0
#define len sizeof(struct lnode)//宏定义结构体的大小
typedef struct lnode {
int data;
struct lnode *next;
}lnode ,*list;//定义两个节点类型,一个是普通的一个是指针的
void makelnode(list &l)//创建一个空的节点
{l=(list)malloc(len);
l->next=null;
}
void creatlist(list &l)//创建链表
{ char c;
l=(list)malloc(len);//动态申请空间
l->next=null;
while((c=getchar())!='/n')//当从键盘输入的不是回车键的时候把该字符放到一个节点中,并把节点都连起来
{list p;
p=(list)malloc(len);
p->data=c-'0';//把节点的数据域里存上数字
p->next=l->next;//下面两行是把节点连起来
l->next=p;
}
}
void add(list l1,list l2,list &l3)//实现两个链表的相加,相当于两个链表归并成第三个链表
{list p1,p2,p3;
int sum=0;
int cy=0;//定义进位标志
p1=l1->next;//分别始指针指向第一个节点,准备实现个位的相加
p2=l2->next;
while(p1&&p2)//当两个表的长度相同时,即两个数的个数相同while语句是实现相加并且实现第三个链表的创建
{
p3=(list)malloc(len);
sum=p1->data+p2->data+cy;//每个节点只存了一位数
if(sum>=10)//如果多余一位数,节点处只能存一位而两一个要进位
{p3->data=sum-10;
cy=1;//进位标志变为1,为下次相加时候做准备
}
else if(sum>=0&&sum<10)
{p3->data=sum;
cy=0;//没有大于9所以进位标志要归零
}
p1=p1->next;//指针一移到下一个节点,为一个数的十位或百位做准备
p2=p2->next;
p3->next=l3->next;//将创建的节点连起来
l3->next=p3;
}
while(p1)//当第一个数比第二个数的位数多的时候
{
p3=(list)malloc(len);
sum=p1->data+cy;
if(sum>=10)
{p3->data=sum-10;
cy=1;
}
else if(sum>=0&&sum<10)
{p3->data=sum;
cy=0;
}
p1=p1->next;
p3->next=l3->next;
l3->next=p3;
}
while(p2)
{
p3=(list)malloc(len);
sum=p2->data+cy;
if(sum>=10)
{p3->data=sum-10;
cy=1;
}
else if(sum>=0&&sum<10)
{p3->data=sum;
cy=0;
}
p2=p2->next;
p3->next=l3->next;
l3->next=p3;
}
if(cy)//当都加完了,还有进位标志,则在开辟一个空间把它也放到链表中去
{
p3=(list)malloc(len);
p3->data=1;
p3->next=l3->next;
l3->next=p3;
}
}
void out (list l)//定义输出函数
{
list p;
p=l->next;
while(p)
{printf("%d", p->data);
p=p->next;
}
}
void main()
{
list l1,l2,l3;//定义指针变量,是指向结构体的
makelnode(l3);//只为打三个来链表创建头结点
printf("please put a number/n");
creatlist(l1);//创建第一个链表
printf("please put another one/n");
creatlist(l2);//创建第二个量链表
add(l1,l2,l3);//实现两个链表的相加,并把结果放在第三个链表中去
out(l3);输出第三个链表
return;
}
相关文章推荐
- 两个超大正整数相加问题之链表实现(代码惨不忍睹,慎进)
- 编程实现任意长度的两个正整数相加 代码实现
- 算法--两种方法实现一个Add函数,让两个整数相加,但是不能使用+、-、*、/等四则运算符。
- (面试题)请用C语言实现在32位环境下,两个无符号长整数相加的函数,相加之和不能存储在64位变量中
- 不用(+)运算符实现两个整数相加
- 4.用链表实现两个大数相加
- 链表系列之单链表——使用单链表实现大整数相加
- C++实现两个大整数相加
- 链表实现两个数字相加
- 不用任何操作符实现两个正整数相加
- 剑指offer之面试题12 大数相加 实现任意两个整数的加法
- 利用位运算实现两个整数相加
- 【面试之问题一】不使用加减乘除实现两个整数的相加
- python实现单链表,及两个链表按位相加
- c++实现两个大整数相加(一)
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 两个超大正整数相减问题之链表实现
- 用汇编实现任意长度的两个整数相加
- (链表实现)写出两个一元多项式相加的算法
- 两个一元多项式相加(链表 || 顺序表实现)