第一题:02-线性结构1 两个有序链表序列的合并 (15 分)
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
函数接口定义:
List Merge( List L1, List L2 );
其中List
结构定义如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L1
和L2
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge
要将L1
和L2
合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
3
1 3 5
5
2 4 6 8 10
输出样例:
1 2 3 4 5 6 8 10
NULL
NULL
参考网址:https://blog.csdn.net/ccdllyy/article/details/52651066
注意的地方:1.合并为一个非递减的序列。2.L1和L2不能直接用(暂时不知道为什么..) 3.新建的链表需要再设一个指针,用它进行操作,而不是用L。不然操作完之后就找不回头结点了
代码如下:
List Merge( List L1, List L2 ){
List L;
List p;
List temp1=L1->Next;
List temp2=L2->Next;
L=(List)malloc(sizeof(struct Node));
L->Next=NULL;
p=L;
while(temp1!=NULL && temp2!=NULL){
if(temp1->Data < temp2->Data){
p->Next=temp1;
temp1=temp1->Next;
p=p->Next;
}
else{
p->Next=temp2;
temp2=temp2->Next;
p=p->Next;
}
}
if(temp1==NULL && temp2==NULL){
p->Next=NULL;
}
else if(temp1!=NULL)/*方法一*/
p->Next=temp1;
else
p->Next=temp2;
// else { /*方法二*/
// while(temp1!=NULL){
// p->Next=temp1;
// temp1=temp1->Next;
// p=p->Next;
// }
// while(temp2!=NULL){//L1=NULL
// p->Next=temp2;
// temp2=temp2->Next;
// p=p->Next;
// }
// }
L1->Next=NULL;
L2->Next=NULL;
// p->Next=NULL;
return L;
}
第二题:02-线性结构2 一元多项式的乘法与加法运算 (20 分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct PolyNode{
int coef;//系数
int expon;//指数
struct PolyNode *link;
};
typedef struct PolyNode *Polynomial;
Polynomial P1,P2;
Polynomial ReadPoly();
void PrintPoly(Polynomial P);
Polynomial Mult(Polynomial P1,Polynomial P2);
Polynomial Add(Polynomial P1,Polynomial P2);
void Attach(int c,int e,Polynomial *pRear);
int main(void){
Polynomial P1,P2,Pa,Pm;
P1=ReadPoly();
P2=ReadPoly();
Pm=Mult(P1,P2);
Pa=Add(P1,P2);
PrintPoly(Pm);
printf("\n");
PrintPoly(Pa);
return 0;
}
Polynomial ReadPoly(){
Polynomial P,rear,t;
int c,e,N;
scanf("%d",&N);
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
rear=P;
while(N--){
// t=(Polynomial)malloc(sizeof(struct PolyNode));
// t->coef
scanf("%d %d",&c,&e);
Attach(c,e,&rear);
}
t=P;
P=P->link;
free(t);
return P;
}
void Attach(int c,int e,Polynomial *pRear){
Polynomial P;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->coef=c;
P->expon=e;
P->link=NULL;
(*pRear)->link=P;
*pRear=P;
}
void PrintPoly(Polynomial P){
int flag=0;
if(!P)printf("0 0");
while(P){
if(!flag)flag=1;
else printf(" ");
printf("%d %d",P->coef,P->expon);
P=P->link;
}
}
Polynomial Mult(Polynomial P1,Polynomial P2){
Polynomial P,rear,t,t1,t2;
int c,e;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
rear=P;
if(!P1 || !P2)return NULL;
t1=P1;
t2=P2;
while(t2){
Attach(t1->coef * t2->coef,t1->expon + t2->expon,&rear);
t2=t2->link;
}
t1=t1->link;
while(t1){
t2=P2; //当时脑子傻掉了写成t2=t2->link
rear=P;
while(t2){
c=t1->coef*t2->coef;
e=t1->expon+t2->expon;
while(rear->link && rear->link->expon > e)
rear=rear->link;
if(rear->link && rear->link->expon == e){
if(rear->link->coef + c)rear->link->coef += c;
else{
t=rear->link;
rear->link=t->link;
free(t);
}
}
else{
t=(Polynomial)malloc(sizeof(struct PolyNode));
t->coef=c;
t->expon=e;
t->link=rear->link;
rear->link=t;
rear=rear->link;
}
t2=t2->link;
}
t1=t1->link;
}
t=P;P=P->link;free(t);
return P;
}
Polynomial Add(Polynomial P1,Polynomial P2){
Polynomial P,rear,t;
int sum;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
rear=P;
while(P1 && P2){
// switch(strcmp(P1->expon,P2->expon)){
// case 1:
if(P1->expon > P2->expon){
Attach(P1->coef,P1->expon,&rear);
P1=P1->link;
}// break;
// case -1:
else if(P1->expon < P2->expon){
Attach(P2->coef,P2->expon,&rear);
P2=P2->link;
}// break;
// case 0:
else{
sum=P1->coef + P2->coef;
if(sum) Attach(sum,P1->expon,&rear);
P1=P1->link;
P2=P2->link;
}
}
for(;P1;P1=P1->link)Attach(P1->coef,P1->expon,&rear);
for(;P2;P2=P2->link)Attach(P2->coef,P2->expon,&rear);
rear->link=NULL;
t=P; P=P->link; free(t);
return P;
}