题目:
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node* List;
struct Node {
List Next;
int z; // 指数
int x; // 系数
};
// 读入链表
List Read() {
List L = (List)malloc(sizeof(struct Node));
List head = L;
int n;
int i = 0;
scanf_s("%d", &n);
for (i = 0; i < n; i++) {
int x;
int z;
List t = (List)malloc(sizeof(struct Node));
scanf_s("%d %d", &x, &z);
t->x = x;
t->z = z;
L->Next = t;
L = L->Next;
}
L->Next = NULL;
return head->Next;
}
// 实现加法运算
List addition(List L1, List L2) {
List tmpL1 = L1;
List tmpL2 = L2;
List add = (List)malloc(sizeof(struct Node));
add->Next = NULL;
List head = add;
List t;
while (tmpL1 && tmpL2) {
t = (List)malloc(sizeof(struct Node));
if (tmpL1->z == tmpL2->z) { //指数相等,系数相加
t->x = tmpL1->x + tmpL2->x;
t->z = tmpL1->z;
tmpL1 = tmpL1->Next;
tmpL2 = tmpL2->Next;
}
else if (tmpL1->z < tmpL2->z) { // L2 结点指数更大,把 L2 结点加入链表
t->x = tmpL2->x;
t->z = tmpL2->z;
tmpL2 = tmpL2->Next;
}
else if (tmpL2->z < tmpL1->z) { // L1 结点指数更大,把 L1 结点加入链表
t->x = tmpL1->x;
t->z = tmpL1->z;
tmpL1 = tmpL1->Next;
}
add->Next = t;
add = add->Next;
}
if (tmpL1) // 若 L1 不等于 NULL,将剩下结点加入其后
add->Next = tmpL1;
else if (tmpL2) // 同理
add->Next = tmpL2;
return head->Next; // head 结点只有指针域存值
}
// 实现乘法运算
List multiplication(List L1, List L2) {
List tmpL1 = L1;
List tmpL2 = L2;
List mul = (List)malloc(sizeof(struct Node));
mul->Next = NULL;
List head = mul;
List t;
for (; tmpL1; tmpL1 = tmpL1->Next)
for (tmpL2 = L2; tmpL2; tmpL2 = tmpL2->Next) {
t = (List)malloc(sizeof(struct Node));
t->x = tmpL1->x * tmpL2->x; // 系数相乘
t->z = tmpL1->z + tmpL2->z; // 指数相加
t->Next = NULL;
head = addition(t, mul); // 将新增结点和之前已经排好序的结点排序
mul = head; // 重新确定开头
}
return head;
}
void Print(List L) {
List t = L;
int flag = 1;
for (; t; t = t->Next) {
if (!flag && t->x) //控制空格输出
printf(" ");
if (t->x) { // 如果系数为 0,不输出
printf("%d %d", t->x, t->z);
flag = 0;
}
}
if (flag)
printf("0 0");
printf("\n");
}
int main() {
List L1, L2, add, mul;
L1 = Read();
L2 = Read();
add = addition(L1, L2);
mul = multiplication(L1, L2);
Print(mul);
Print(add);
return 0;
}
题目:
本题要求实现给定二叉搜索树的5种常用操作。
函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针;
函数Delete将X从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针;
函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针;
函数FindMin返回二叉搜索树BST中最小元结点的指针;
函数FindMax返回二叉搜索树BST中最大元结点的指针。
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
void PreorderTraversal( BinTree BT ); /* 先序遍历,由裁判实现,细节不表 */
void InorderTraversal( BinTree BT ); /* 中序遍历,由裁判实现,细节不表 */
BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );
int main()
{
BinTree BST, MinP, MaxP, Tmp;
ElementType X;
int N, i;
BST = NULL;
scanf("%d", &N);
for ( i=0; i<N; i++ ) {
scanf("%d", &X);
BST = Insert(BST, X);
}
printf("Preorder:"); PreorderTraversal(BST); printf("\n");
MinP = FindMin(BST);
MaxP = FindMax(BST);
scanf("%d", &N);
for( i=0; i<N; i++ ) {
scanf("%d", &X);
Tmp = Find(BST, X);
if (Tmp == NULL) printf("%d is not found\n", X);
else {
printf("%d is found\n", Tmp->Data);
if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data);
if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data);
}
}
scanf("%d", &N);
for( i=0; i<N; i++ ) {
scanf("%d", &X);
BST = Delete(BST, X);
}
printf("Inorder:"); InorderTraversal(BST); printf("\n");
return 0;
}
// 插入
BinTree Insert( BinTree BST, ElementType X ){
if(!BST){ // 如果为空,创建新结点
BST = (BinTree)malloc(sizeof(struct TNode));
BST->Data = X;
BST->Left = NULL;
BST->Right = NULL;
}else{
if(X < BST->Data)
BST->Left = Insert(BST->Left,X);
else if(BST->Data < X)
BST->Right = Insert(BST->Right,X);
}
return BST;
}
// 删除
BinTree Delete( BinTree BST, ElementType X ){
BinTree tmp;
if(!BST){
printf("Not Found\n");
return BST;
}else{
if(X < BST->Data)
BST->Left = Delete(BST->Left,X);
else if(BST->Data < X)
BST->Right = Delete(BST->Right,X);
else{ // 找到要删除结点
if(BST->Left && BST->Right){ // 如果该结点有左右儿子
tmp = FindMin(BST->Right);
BST->Data = tmp->Data;
BST->Right = Delete(BST->Right,tmp->Data);
}else{
tmp = BST;
if(BST->Left && !BST->Right)
BST = BST->Left;
else if(!BST->Left && BST->Right)
BST = BST->Right;
else
BST = NULL;
free(tmp);
}
}
}
return BST;
}
// 寻找值最小结点
Position FindMin( BinTree BST ){
if(BST)
while(BST->Left)
BST = BST->Left;
return BST;
}
// 寻找值最大结点
Position FindMax( BinTree BST ){
if(BST)
while(BST->Right)
BST = BST->Right;
return BST;
}
// 查找
Position Find( BinTree BST, ElementType X ){
if(!BST){
return NULL;
}else if(X < BST->Data)
return Find(BST->Left,X);
else if(BST->Data < X)
return Find(BST->Right,X);
else
return BST;
}
// 先序遍历
void PreorderTraversal( BinTree BT ){
if(BT){
printf(" %d",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
}
// 中序遍历
void InorderTraversal( BinTree BT ){
if(BT){
InorderTraversal(BT->Left);
printf(" %d",BT->Data);
InorderTraversal(BT->Right);
}
}