按照x的幂递增的方式依次输入,回车表示一条链表的结束
【输入】2 0 2 3
1 1 3 3
【输出】2 0 1 1 5 3
代码如下:
typedef struct Data
{
int c;
int e;
}data;
typedef struct Sqlist
{
data a[10];
int length=0;
}Sqlist;
Sqlist creat(Sqlist &L)
{
int c;
int e,i=0;
char cc;
while(1)
{
scanf("%d%d",&L.a[i].c,&L.a[i].e);
i++;
L.length++;
cc=getchar();
if(cc=='\n') break;
}
return L;
}
void Delete(Sqlist &L,int i) //顺序表删除第i个元素
{
int j;
if(i<1 || i>L.length) return;
for(j=i-1;j<L.length-1;j++)
{
L.a[j]=L.a[j+1];
}
L.length--;
}
void insert(Sqlist &L,int i,data x) //顺序表在第i个位置上插入元素
{
int j;
if(i<1 || i>L.length+1 ) return;
if(L.length>=10) return; //表中的元素超过结构体中的10 储存空间已满不能再添加
for(j=L.length;j>=i;j--)
{
L.a[j]=L.a[j-1];
}
L.a[i-1]=x;
L.length++;
}
void add(Sqlist &L1,Sqlist &L2)
{
int i=0,j=0;
int temp;
while(i<L1.length && j<L2.length)
{
if(L1.a[i].e==L2.a[j].e) //1.指数相等 (相加后是否等于0?)
{
temp=L1.a[i].c+L2.a[j].c;
if(temp==0) //相加=0的要从L1中删除
{
Delete(L1,i+1);
j++;
}
else
{
L1.a[i].c=temp;
i++;
j++;
}
}
else if(L1.a[i].e>L2.a[j].e) //2.L1的指数大于L2 直接插入
{
insert(L1,i+1,L2.a[j]);
i++;
j++;
}
else if(L1.a[i].e<L2.a[j].e) //3.L1的指数小于L2 后移
{
i++;
}
}
while(j<L2.length) //L2中剩余的元素
{
insert(L1,L1.length+1,L2.a[j]);
j++;
}
}
main()
{
Sqlist L1,L2;
L1=creat(L1);
L2=creat(L2);
add(L1,L2);
for(int i=0;i<L1.length;i++)
{
printf("%d %d ",L1.a[i].c,L1.a[i].e);
}
return 0;
}
测试成功
涉及了顺序表的插入、删除函数,其实分情况无非是指数相同、大于、小于三种,具体写的时候还是要多细心一些,脑子要绕晕乎了TT
如有错误欢迎评论区大佬指正