数据结构链表实验c语言程序,数据结构实验练习(—):链表实现100位数的加减法...

实验一  线性表的应用

一、实验目的

掌握线性表的基本结构和操作方法,培养学生灵活使用线性表结构解决实际问题的能力。

二、实验内容

设计一个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);//释放顺序表空间

}

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值