一、两个长整数相加
1.实验任务
要求用链表(单链表或双向链表)实现两个任意位数的整数相加。例如,为存储100位的整数可以建立有100个结点的单链表,每个结点存储1位(如果每个结点存储4位,建立25个结点的单链表也可以)。
2.变量说明
x 第一个长整数
y 第二个长整数
L 两个长整数的和
p 指向L的next指针
LNode 单链表类型
L,L1,L2 单向链表
*head 指向链表的头指针
*next 链表结点指针域
m 整数类型,表示进位
s,t 整数类型
3.算法描述
Status MergeList_List(LinkList &La, LinkList &Lb, LinkList &Lc)
int( * compare)(ElemType,ElemType)){
//已知单链表线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
if (!InitList(Lc)) return ERROR; //存储空间分配失败
ha=GetHead(La); hb=GetHead(Lb); //ha和hb分别指向La和Lb的头结点
pa=NextPos(La,ha); pb=NextPos(Lb,hb); //pa和pb分别指向La和Lb中当前结点
while(pa&&pb){ //La和Lb均为非空
a=GetCurElem(pa); b=GetCurElem(pb); //a和b为两表中当前比较元素
if((*compare)(a,b)<=0){ //a<=b
DelFirst(ha,q); Append(Lc,q);pa=NextPos(La,ha);}
else{ //a>b
DelFirst(hb,q); Append(Lc,q); pb=NextPos(Lb,hb);}
}//while
if(pa) Append(Lc,pa); //链接La中剩余结点
else Append(Lc,pb); //链接Lb中剩余结点
FreeNode(ha); FreeNode(hb); //释放La和Lb的头结点
return OK;
}//Merge List-L
4.程序流程图
程序:
#include<stdio.h>
#include<malloc.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList CreateList_L()
{
int i;
char m;
struct LNode *p,*L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
m=getchar();
while(m!=’\n’)
{
LinkList p;
p=(LinkList)malloc(sizeof(LNode));
p->data=m-‘0’;
p->next=L->next;
L->next=p;
m=getchar();
}
return L;
}
LinkList add(LinkList &L1,LinkList &L2)
{
LinkList s,t,L,p;
int f,m;
f=0;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
s=L1->next;t=L2->next;
while(s&&t)
{
p=(LinkList)malloc(sizeof(LNode));
m=s->data+t->data+f;
if (m>9){
m=m-10;f=1;}
else f=0;
p->data=m;
p->next=L->next;
L->next=p;
s=s->next;t=t->next;
}
while(s)
{