线性表习题二
扫描二维码
随时随地手机看文章
1、已知 first 为单链表的表头指针,链表中存储的都是整型数据,试写出实现下列运算的递归算法:
(1)求链表中的最大整数:
(2)求链表的结点个数。
(3)求链表中所有元素的平均值。
#includeusing 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<<"建立一个多项式的单链表。"<exp = -1;head->link = NULL;//表头结点的exp标志为-1 while(1) { cout<<"请输入第"<<++i<<"个结点的信息:"<>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<<"输入项的指数重复,此次输入作废!"<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->expexp 插在p之前(包括p=NULL,链尾) { pre->link = t; t->link = p; } }