最近几天一直在忙老师布置的作业,现在小有成就,和大家分享一下。。
#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;
}