实验一 线性表的应用
一、实验目的
掌握线性表的基本结构和操作方法,培养学生灵活使用线性表结构解决实际问题的能力。
二、实验内容
设计一个100位以内的长整数加减运算的程序。
三、实验要求
1、输入输出要求:每四位一组,组间用逗号分隔。
2、加和减分别用不同的程序实现。
3、程序应考虑输入数据的符号。
四、详细设计
#include
#include
#define MAX 25
typedef struct num
{ int
date[MAX];//每个数据域存储四位
int
length;
}Num;//建立链表
void inum(Num *p,char *a){
int i=0;
p->length=1;
//date[0]保留做进位和记录正负号
p->date[1]=0;
if(a[0]>='0'&&a[0]<='9'||a[0]=='+')
p->date[0]=0;//输入为正数date[0]为0
else{//输入为负数date[0]为10
p->date[0]=10;i++;}//高位‘1’表示负
for(;a[i]!='\0';i++){
if(a[i]==',')//遇见逗号链表长度加一
{i++;p->length++;p->date[p->length]=0;}
p->date[p->length]=10*p->date[p->length]+(a[i]-'0');
}
}
void onum(Num *num){
int i;
switch(num->date[0])//输出符号及最高位
{
case 10:printf("-%d",num->date[1]);break;//‘10’表示负数无进位
case 1:printf("1,d",num->date[1]);break;//‘1’表示正数有进位
case 11:printf("-1,d",num->date[1]);break;//‘11’表负数无进位
case 0:printf("%d",num->date[1]);break;//‘00’表示正数无进位
default:break;
}
for(i=2;i<=num->length;i++)
printf(",d",num->date[i]);//输出其它位
printf("\n");
}
void f1(Num *num,Num *num1,Num *num2){
int i,j,x=num1->length-num2->length;//x位数判定
if(x>0){
//num1位数多
num->length=num1->length;
for(i=1;i<=x;i++)
num->date[i]=num1->date[i];
for(j=1;i<=num1->length;i++,j++)
num->date[i]=num1->date[i]+num2->date[j];
}
else if(x<0){
//num2位数多
num->length=num2->length;
for(i=1;i<=-x;i++)
num->date[i]=num2->date[i];
for(j=1;i<=num1->length;i++,j++)
num->date[i]=num2->date[i]+num1->date[j];
}
else if(x==0){
//位数相同
num->length=num1->length;
for(i=1;i<=num1->length;i++)
num->date[i]=num2->date[i]+num1->date[i];
}
int q=0;
//进位标识
for(i=num->length;i>0;i--){
num->date[i]=num->date[i]+q;//加上来自上位的进位标识
if(num->date[i]>9999){
num->date[i]-=10000;
q=1;}
//此位大于9999,使q等于1
else
q=0;}//此位不大于9999,是q等于0
if(q==1)
num->date[0]+=1;//最高位有进位,使date[0]加1变为*1
//‘*’是正负标志1为负0为正
}
void f2(Num *num,Num *num1,Num *num2){
int i=1,j,x=num1->length-num2->length;//位数判定
int t=0;
//大小判定
if(x>0){
//num1大
num->length=num1->length;
num->date[0]=num1->date[0];
for(i=1;i<=x;i++)
num->date[i]=num1->date[i];
for(j=1;i<=num1->length;i++,j++)
num->date[i]=num1->date[i]-num2->date[j];
}
else if(x<0){
//num2大
num->length=num2->length;
num->date[0]=10-num1->date[0];
for(i=1;i<=-x;i++)
num->date[i]=-num2->date[i];
for(j=1;i<=num1->length;i++,j++)
num->date[i]=num2->date[i]-num1->date[j];
}
else if(x==0){
//位数相同
while(i<=num1->length)
if(num1->date[i]>num2->date[i]){
//num1大
num->length=num1->length-i+1;
num->date[0]=num1->date[0];
t=i;
for(i=1;i<=num->length;i++)
num->date[i]=num1->date[i+t-1]-num2->date[i+t-1];
break;}
else if(num1->date[i]date[i]){
//num2大
num->length=num1->length-i+1;
num->date[0]=10-num1->date[0];
t=-i;
for(i=1;i<=num->length;i++)
num->date[i]=num2->date[i-t-1]-num1->date[i-t-1];
break;}
else
i++;
}
if(t==0){
//相等
num->length=1;
num->date[1]=0;
num->date[0]=0;
}
int q=0;
//借位标志
for(i=num->length;i>0;i--){
num->date[i]+=q;//加上借位标志
if(num->date[i]<0)
{q=-1;//此位小于零,使q等于-1
num->date[i]+=10000;}//本位加上10000变成正数
else
q=0;
//此位不小于零,使q=0;
}
i=1;
//移位
while(ilength){
if(num->date[i]!=0)
break;
i++;}//遍历链表使结果的date[1]中不为零
if(i!=1){
num->length=num->length-i+1;
for(j=1;j<=num->length;j++)
num->date[j]=num->date[j+i-1];
}
}
int P(Num *num,int p,int q,char c){
if(c=='1'){
if(p==0&&q==0){
num->date[0]=0;
return 1;}
if(p==10&&q==10){
num->date[0]=10;
return 1;}
}
else if(c=='2'){
if(p==0&&q==10){
num->date[0]=0;
return 1;}
if(p==10&&q==0){
num->date[0]=10;
return 1;}
}
return 0;
}
void main(){
char c,a[126],b[126];
Num *num1,*num2,*num;
num1=(Num *)malloc(sizeof(Num));
num2=(Num *)malloc(sizeof(Num));
num=(Num *)malloc(sizeof(Num));//分配空间
printf("输入你要进行的运算\n1:加法\n2:减法\n");
c=getchar();//输入要进行加法和还是减法运算
printf("输入第一个数:");
scanf("%s",&a);//将输入的第一个数存入字符串数组a
inum(num1,a);//将a中内容转存入顺序表num1
printf("输入第二个数:");
scanf("%s",&b);
inum(num2,b);//第二个数存入链表
if(P(num,num1->date[0],num2->date[0],c))
f1(num,num1,num2);
else
f2(num,num1,num2);
onum(num);
free(num1);
free(num2);
free(num);//释放顺序表空间
}