1、已知 first 为单链表的表头指针,链表中存储的都是整型数据,试写出实现下列运算的递归算法:
(1)求链表中的最大整数:
(2)求链表的结点个数。
(3)求链表中所有元素的平均值。
#include <iostream>
using namespace std;
typedef int Elemtype;
typedef struct node
{
Elemtype data;
struct node *link;
} Node,*LinkList;
//递归算法:求链表中的最大值
int Max(LinkList first)
{
if(first->link == NULL) return first->data; //链表仅一个结点,其值即所求
int temp = Max(first->link);
if(first->data>temp) return first->data;
else return temp;
}
//递归算法:求链表中结点个数
int Num(LinkList first)
{
if(first == NULL) return 0; //空链表结点个数为0
return 1+Num(first->link);
}
//递归算法:求链表中所有元素平均值
float Avg(LinkList first,int &n)
{
if(first->link == NULL) //链表仅一个结点
{
n = 1;
return (float)(first->data);
}
else
{
float Sum = Avg(first->link,n)*n; //先递归求后继链表的平均值
n++;
return (first->data + Sum)/n;
}
}
2、用单链表存储多项式的结构定义如下:
typedef struct Term { //多项式的项
float coef; //系数
int exp; //指数
struct Term *link; //链指针
} Term,*Polynomial;
试编写一个算法,输入一组多项式的系数和指数,按指数降幂的方式建立多项式链表,要求该链表具有表头结点。
如果输入的指数与链表中已有的某一个项的指数相等,则新的项不加入,并报告作废信息。整个输入序列以输入系数为0标志结束。
算法的首部为Polynominal createPoly();
Polynomial createPoly()
{
Polynomial head,p,pre,s;
float c;int i = 0,e;
cout<<"建立一个多项式的单链表。"<<endl;
head = new Term;//创建表头结点
head->exp = -1;head->link = NULL;//表头结点的exp标志为-1
while(1)
{
cout<<"请输入第"<<++i<<"个结点的信息:"<<endl;
cin>>c>>e;
if(c==0) break;
s = new Term;
s->coef = c; s->exp = e;
p = head; pre = NULL;
while(p!=NULL&&p->exp>e)
{
pre = p;
p = p->link;
}
if(p!=NULL&&p->exp==e) cout<<"输入项的指数重复,此次输入作废!"<<endl;
else
{
s->link = p;
pre->link = s;
}
}
return head;
}
给出在多项式中插入新项的算法Insert。各个项的指数ei按递减顺序排列:em-1>em-2>...>e0>0 该算法的功能是:如果多项式中
没有与新项的指数相等的项,则将此新项插入到多项式链表的适当位置;如果多项式中已有与新项指数相等的项,则将它们合并。
typedef struct Term
{
float coef;
int exp;
struct Term *link;
} Term,*Polynominal;
void Insert(Polynominal poly,Term *t)
{
Polynominal p = poly,pre = NULL;
while(p!=NULL&&p->exp>t->exp)
{
pre = p;
p = p->link;
}
if(p->exp==t->exp)
{
if(p->coef + t->coef!=0)
{
p->coef=p->coef+t->coef; //合并
}
else
{
pre->link = p->link; //删除p结点
delete p;
}
}
else if(pre==NULL) //空表,链接在首部
{
t->link = poly;
poly = t;
}
else //p->exp<t->exp 插在p之前(包括p=NULL,链尾)
{
pre->link = t;
t->link = p;
}
}