数据结构课程实验设计1 下载本文

内容发布更新时间 : 2024/5/19 0:52:55星期一 下面是文章的全部内容请认真阅读。

if (a->expn < b->expn) return -1; if (a->expn > b->expn) return 1; return 0; }

term* APolyn(term *Pa, term *Pb)// 多项式加法:Pa = Pa+Pb,利用两个多项式的结点构成\和多项式\。 {

term *h, *qa = Pa, *qb = Pb, *p, *q; float sum;

h = p = (term*)malloc(sizeof(term)); p->next = NULL;

while (qa && qb) // Pa和Pb均非空 {

switch (Compare(qa,qb)) {

case -1: // 多项式PA中当前结点的指数值小 p->next = qb; p = qb;

qb = qb->next; break;

case 0: // 两者的指数值相等 sum = qa->coef + qb->coef;

if (sum != 0.0) // 修改多项式PA中当前结点的系数值 {

p->next = qa; qa->coef = sum; p = qa;

qa = qa->next; }

else // 删除多项式PA中当前结点 {

q = qa;

qa = qa->next; free(q); }

q = qb;

qb = qb->next; free(q); break;

case 1: // 多项式PB中当前结点的指数值小 p->next = qa; p = qa;

qa = qa->next;

break; } // switch } // while

if (Pa) p->next = qa; // 链接Pa中剩余结点 if (Pb) p->next = qb; // 链接Pb中剩余结点 q = h;

h = h->next; free(q); return h; } // APolyn

term* A(term *Pa, term *Pb) {

int n;

puts(\再输入一元多项式的项数\ scanf(\

Pb = CreatPolyn(Pb,n); Pb = selsort(Pb); PrintfPoly(Pa);

if(Pb && Pb->coef>0) printf(\ PrintfPoly(Pb); Pa = APolyn(Pa,Pb); printf(\ Pa = selsort(Pa); PrintfPoly(Pa); return Pa; }

term* BPolyn(term *Pa, term *Pb) //多项式减法:Pa = Pa-Pb,利用两个多项式的结点构成\差多项式\。 {

term *p = Pb; while(p) {

p->coef *= -1; p = p->next; }

return APolyn(Pa,Pb); } // BPolyn

term* B(term *Pa, term *Pb) {

int n;

puts(\再输入一元多项式的项数\

scanf(\

Pb = CreatPolyn(Pb,n); Pb = selsort(Pb); PrintfPoly(Pa); printf(\

putchar('(');PrintfPoly(Pb);putchar(')'); Pa = BPolyn(Pa,Pb); printf(\ Pa = selsort(Pa); PrintfPoly(Pa); return Pa; }

term* CPolyn(term *Pa, term *Pb) //多项式乘法:Pa = Pa*Pb,利用两个多项式的结点构成\积多项式\。 {

if(!Pb) return NULL;

term *pa = Pa, *p, *q, *r, *s, *t; r = p = (term*)malloc(sizeof(term)); while(pa) {

p->coef = pa->coef; p->expn = pa->expn; q = p;

p = p->next = (term*)malloc(sizeof(term)); pa = pa->next; }

q->next = NULL; free(p); pa = Pa;

t = s = (term*)malloc(sizeof(term)); while(pa) { q = s;

s = s->next = (term*)malloc(sizeof(term)); pa = pa->next; }

q->next = NULL; free(s); pa = Pa;

while(pa) {

pa->coef *= Pb->coef; pa->expn += Pb->expn; pa = pa->next; } Pb = Pb->next; while(Pb)

{

p = r; s = t; while(p) {

s->coef = p->coef * Pb->coef; s->expn = p->expn + Pb->expn; p = p->next; s = s->next; }

Pa = APolyn(Pa,t); Pb = Pb->next; }

return Pa; } // CPolyn

term* C(term *Pa, term *Pb) {

int n;

puts(\再输入一元多项式的项数\ scanf(\

Pb = CreatPolyn(Pb,n); Pb = selsort(Pb);

putchar('(');PrintfPoly(Pa);putchar(')'); printf(\

putchar('(');PrintfPoly(Pb);putchar(')'); printf(\

Pa = CPolyn(Pa,Pb); Pa = selsort(Pa); PrintfPoly(Pa); return Pa; }

void main() {

term *M,*N; char s[2]; int i,n;

puts(\一元多项式计算:\\n输入一元多项式的项数\ scanf(\

M = CreatPolyn(M,n); M = selsort(M); PrintfPoly(M);

p: puts(\加\\n2:减\\n3:乘\\n4:退出\ getchar(); q: gets(s);

if(s[1]!='\\0' || !isdigit(*s)) {

puts(\输入有误,请重新输入!\ }

i = *s-48; switch(i) {

case 1:M = A(M,N);goto p;; case 2:M = B(M,N);goto p;; case 3:M = C(M,N);goto p; case 4:break;

default:puts(\输入有误,请重新输入!\ } }

C 猴子选大王

一.实验目的

任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

要求:输入数据:输入m,n m,n 为整数,n

输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能 二.实验要求:

利用单向循环链表模拟此过程,输出选出的大王编号。 三.程序的设计思想:

(1) 问题分析:“猴子选大王”问题是约瑟夫环问题的一个特例。由于本题目的数据元素个数不可知,所以可使用链表来动态的分配内存空间。而该问题又是一个不断的循环问题所以用循环链表来实现。

(2)总体设计:首先生成一个空链表,并给n个结点分配空间,让单链表的表尾指针指向头结点则生成一个带有n个结点的循环单链表。再给每只猴子建立顺序的编号。现从第一个结点开始报数,依次顺序查找出报数为m的待出列的结点(猴子)通过q->next=p->next