【数据结构】线性表经典例题(C语言)

题目一``:大整数加法
题目描述:
计算两个大整数的和。大整数是指超过了c,c++表示范围的整数,如1234567890000000000000000000
输入:
输入包括两个大整数,每个大整数不超过100位,用空格或者换行隔开
输出:
输出两个大整数的和
样例输入:
222222222222222222222
333333333333333333333
样例输出:
555555555555555555555

#include<stdio.h>
#include<string.h>
#define listsize 100
typedef struct
{
	char data1[listsize];
	int a1[listsize];
	int length1;
	char data2[listsize];
	int a2[listsize];
	int length2;
	int result[listsize+1];
	int resultlength;
}list;
void creat(list &L)
{
	gets(L.data1);
	L.length1=strlen(L.data1);
	gets(L.data2);
	L.length2=strlen(L.data2);
	for(int i=0,j=L.length1-1 ;j>=0;)
		L.a1[i++] =L.data1[j--] -'0';
	for(int i=0,j=L.length2-1 ;j>=0;)
		L.a2[i++] =L.data2[j--] -'0';
}
void add(list &L)
{
	int i;
	int flag[listsize]={0};
	int big_length=L.length1;
	if(big_length<L.length2) big_length=L.length2 ;
	
	for(i=0;i<listsize;i++)
		L.result[i]=0;
	if(L.length1 <L.length2 )
	{
		for(i=0;i<=L.length1-1 ;i++)
		{
			if(i==0)
			{
				L.result [0]=(L.a1 [0]+L.a2 [0])%10;
				flag[1]=(L.a1 [0]+L.a2 [0])/10;
			}
			else if(i>0)
			{
				L.result [i]=(flag[i]+L.a1 [i]+L.a2 [i])%10;
				flag[i+1]=(flag [i]+L.a1 [i]+L.a2 [i])/10;
			}
		}
		for(i=L.length1;i<=L.length2-1 ;i++)
		{
			L.result [i]=( flag[i]+L.a2 [i])%10;
			flag[i+1]=(flag [i]+L.a2 [i])/10;
			if(i==L.length2 -1)
			L.result [i+1]=flag[i+1];
		}
	}
	else if(L.length1 ==L.length2 ) 
	for(i=0;i<=L.length1-1 ;i++)
		{
			L.result [i]+=(L.a1 [i]+L.a2 [i])%10;
			L.result [i+1]+=(L.a1 [i]+L.a2 [i])/10;
		}
	else
	{
		for(i=0;i<=L.length2-1 ;i++)
		{
			if(i==0)
			{
				L.result [0]=(L.a1 [0]+L.a2 [0])%10;
				flag[1]=(L.a1 [0]+L.a2 [0])/10;
			}
			else if(i>0)
			{
				L.result [i]=(flag[i]+L.a1 [i]+L.a2 [i])%10;
				flag[i+1]=(flag [i]+L.a1 [i]+L.a2 [i])/10;
			}
		}
		for(i=L.length2;i<=L.length1-1 ;i++)
		{
			L.result [i]=(flag [i]+L.a1 [i])%10;
			flag [i+1]=(flag [i]+L.a1 [i])/10;
			if(i==L.length1 -1)
			L.result [i+1]=flag[i+1];
		}
	}
	if(L.result [big_length]!=0)
	L.resultlength =big_length+1;
	else
	L.resultlength =big_length;
}
void result(list &L)
{
	int i;
	for(i=L.resultlength-1;i>=0;i--)
		printf("%d",L.result[i]);
}
int main()
{
	list L;
	creat(L);
	add(L);
	result(L);
	return 0;
}

题目二:一元多项式的求和
题目描述:一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的两个一元多项式求和,并输出求和的结果
输入:输入为两个一元多项式,每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束。系数和指数均为整数,指数不小于0。
输出:输出为求和结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行。
系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0。
样例输入:2 7 3 5 12 1 6 0 -1 -1
7 5 9 4 3 0 -1 -1

样例输出:2 7 10 5 9 4 12 1 9 0

#include<stdio.h>
#define listsize 100
typedef struct {
	int n[listsize];
	int length;
}list;
void intput(list &a,list &b)
{
	a.length =0;
	b.length =0;
	int i;
	for(i=0;i<listsize;i+=2)
	{
		scanf("%d%d",&a.n[i],&a.n[i+1]);
		a.length+=2;
		if(a.n [i]==-1&&a.n [i+1]==-1)
		{	
			a.length -=2;
			break;
		}
	}
	for(i=0;i<listsize;i+=2)
	{
		scanf("%d%d",&b.n[i],&b.n[i+1]);
		b.length+=2;
		if(b.n [i]==-1&&b.n [i+1]==-1)
		{
			b.length -=2;
			break;
		}
	}
	if(a.length ==0)
	{
		a.length =2;
		a.n [0]=0;a.n [1]=0;
	}
	if(b.length ==0)
	{
		b.length =2;
		b.n [0]=0;b.n [1]=0;
	}
}//OK
void bdelete(list &b,int location)
{
	int i;
	for(i=location-1;i<b.length-1;i++)
	{
		b.n [i]=b.n [i+1];
	}
	b.length --;
}
void add(list &a,list &b)
{
	int i,j;
	int flag=0;
	int m=a.length ,n=b.length ;
	for(i=0;i<m;i+=2)
	{
		for(j=0;j<n;j+=2)
		{
			if(a.n [i+1]>b.n [j+1])
			{
				printf("%d %d ",a.n [i],a.n [i+1]);
				flag++;
				break;
			}
			else if(a.n [i+1]<b.n [j+1])
			{
				printf("%d %d ",b.n [j],b.n [j+1]);
				flag++;
				bdelete(b,j);
				bdelete(b,j+1);
				i-=2;
				break;
			}
			else if(a.n [i+1]==b.n [j+1])
			{
				if(a.n [i]+b.n[j]==0)
				printf("");
				else 
				{
					printf("%d %d ",a.n [i]+b.n [j],a.n [i+1]);
					flag++;
				}
				bdelete(b,j);
				bdelete(b,j+1);
				break;
			}
		}
	}
	if(flag==0)
	printf("0\n");
}
int main()
{
	list a,b;
	intput(a,b);
	add(a,b);
	return 0;
}
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值