数据结构上机题多项式的基本操作

合集下载

数据结构实验2多项式求和

数据结构实验2多项式求和

链式存储结构的实现调试结果如图所示:
6、结果分析与实验体会
本次实验是参考了X例程序,经过自己的改写,从而实现要求。

先做简单的输出,一步步的再做其它格式的设置。

而且,在具体操作中我对顺序存储结构和链式存储结构的优点和缺点有了更深刻的体会,顺序存储结构的算法较为简单,但是在输入的过程中有很大的局限性,必须从大到小依次且连续的输入多项式次数,所以,它只适合最高次数较小的多项式求和,而链式存储结构设计的算法则更灵活,输入时,不需要次数在数值上连续,所以,它更具有普遍性、实用性。

再从算法效率的角度来评价,顺序存储结构在做次数大小跨度大的多项式求和时,会浪费很多的存储空间,而链式存储结构则可以充分利用,不会浪费,即其空间复杂度较小。

最后,我想说,通过调试程序,我不光学会编程了的基本步骤、基本算法,也使自己更有耐心。

【数据结构算法】实验1 线性表应用-多项式计算(附源代码)

【数据结构算法】实验1 线性表应用-多项式计算(附源代码)

浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验一线性表应用---多项式计算实验成绩指导老师(签名)日期一.实验目的和要求1.进一步掌握线性表的的基本操作。

2.掌握线性表的典型应用----多项式表示与计算。

二. 实验内容1.设用线性表( (a1, e1), (a2, e2), ……, (am, em) ) 表示多项式P(x) = a1*x e1 + a2*x e2+…+ am*x em,其中:a1~am为非零系数,0≤e1<e2<…..<em,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。

多项式基本操作应包括初始化多项式、清除多项式、输出多项式、插入一项、删除一项、多项式求值、多项式相加等。

要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在头文件Linkpoly.h中,主函数存放在主文件test6_1.cpp中,在主函数中通过调用Linkpoly.h中的函数进行测试。

2.选做:编写用顺序存储结构存储多项式时,多项式基本操作的实现函数。

要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主文件test6_1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。

3.填写实验报告,实验报告文件取名为report1.doc。

4.上传实验报告文件report1.doc与源程序文件test6_1.cpp及Linkpoly.h、Seqpoly.h(若有)到Ftp服务器上自己的文件夹下。

三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路※注1:除了[多项式求值]与[多项式相加]两个函数外,线性表的基本操作函数,大部分沿用上学期[线性表的链式/顺序表示和实现]两个实验中的函数。

※注2:选作部分函数功能与思路与非选作部分基本一致,略去思路描述函数:void InitList(LNode *&H)功能:初始化单链表思路:使用附带头结点的方式初始化单链表函数:int LengthList (LNode *H)功能:求单链表长度思路:遍历整个单链表,设置变量记录并返回它的长度函数:bool EmptyList (LNode *H)功能:判断单链表是否为空表思路:判断头结点的后一结点是否为空,若空则为空表函数:void TraverseList(LNode *H)功能:遍历单链表思路:遍历整个单链表,输出所含所有元素函数:bool InsertList ( LNode *&H, ElemType item, int pos)功能:向单链表插入一个元素思路:创建新结点,根据pos的值来确定位置并向单链表中插入新元素。

数据结构上机实验

数据结构上机实验

目录第1章绪论——上机实验题1解析实验题1.1求素数实验题1.2求一个正整数的各位数字之和实验题1.3求一个字符串是否为回文第2章线性表——上机实验题2解析实验题2.1实现顺序表各种基本运算的算法/*文件名:algo2-1.cpp*/#include <stdio.h>#include <malloc.h>#define MaxSize 50typedef char ElemType;typedef struct{ElemType elem[MaxSize];int length;} SqList;void InitList(SqList *&L){L=(SqList *)malloc(sizeof(SqList));L->length=0;}void DestroyList(SqList *L){free(L);}int ListEmpty(SqList *L){return(L->length==0);}int ListLength(SqList *L){return(L->length);}void DispList(SqList *L){int i;if (ListEmpty(L)) return;for (i=0;i<L->length;i++)printf("%c",L->elem[i]);printf("\n");}int GetElem(SqList *L,int i,ElemType &e){if (i<1 || i>L->length)return 0;e=L->elem[i-1];return 1;}int LocateElem(SqList *L, ElemType e){int i=0;while (i<L->length && L->elem[i]!=e) i++;if (i>=L->length)return 0;elsereturn i+1;}int ListInsert(SqList *&L,int i,ElemType e){int j;if (i<1 || i>L->length+1)return 0;i--; /*将顺序表位序转化为elem下标*/for (j=L->length;j>i;j--) /*将elem[i]及后面元素后移一个位置*/L->elem[j]=L->elem[j-1];L->elem[i]=e;L->length++; /*顺序表长度增1*/return 1;}int ListDelete(SqList *&L,int i,ElemType &e){int j;if (i<1 || i>L->length)return 0;i--; /*将顺序表位序转化为elem下标*/e=L->elem[i];for (j=i;j<L->length-1;j++)L->elem[j]=L->elem[j+1];L->length--;return 1;}实验题2.2实现单链表各种基本运算的算法*文件名:algo2-2.cpp*/#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct LNode /*定义单链表结点类型*/{ElemType data;struct LNode *next;} LinkList;void InitList(LinkList *&L){L=(LinkList *)malloc(sizeof(LinkList)); /*创建头结点*/L->next=NULL;}void DestroyList(LinkList *&L){LinkList *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p);}int ListEmpty(LinkList *L){return(L->next==NULL);}int ListLength(LinkList *L){LinkList *p=L;int i=0;while (p->next!=NULL){i++;p=p->next;}return(i);}void DispList(LinkList *L){LinkList *p=L->next;while (p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}int GetElem(LinkList *L,int i,ElemType &e) {int j=0;LinkList *p=L;while (j<i && p!=NULL){j++;p=p->next;}if (p==NULL)return 0;else{e=p->data;return 1;}}int LocateElem(LinkList *L,ElemType e){LinkList *p=L->next;int n=1;while (p!=NULL && p->data!=e){p=p->next;n++;}if (p==NULL)return(0);elsereturn(n);}int ListInsert(LinkList *&L,int i,ElemType e)int j=0;LinkList *p=L,*s;while (j<i-1 && p!=NULL){j++;p=p->next;}if (p==NULL) /*未找到第i-1个结点*/return 0;else /*找到第i-1个结点*p*/{s=(LinkList *)malloc(sizeof(LinkList)); /*创建新结点*s*/s->data=e;s->next=p->next; /*将*s插p->next=s;return 1;}}int ListDelete(LinkList *&L,int i,ElemType &e){int j=0;LinkList *p=L,*q;while (j<i-1 && p!=NULL){j++;p=p->next;}if (p==NULL) /*未找到第i-1个结点*/return 0;else /*找到第i-1个结点*p*/{q=p->next; /*q指向要删除的结点*/p->next=q->next; /*从单链表中删除*q结点*/free(q); /*释放*q结点*/return 1;}}第3章栈和队列——上机实验题3解析实验题3.1实现顺序栈各种基本运算的算法*文件名:algo3-1.cpp*/#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct{ElemType elem[MaxSize];int top; /*栈指针*/} SqStack;void InitStack(SqStack *&s){s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}void ClearStack(SqStack *&s){free(s);}int StackLength(SqStack *s){return(s->top+1);}int StackEmpty(SqStack *s){return(s->top==-1);}int Push(SqStack *&s,ElemType e){if (s->top==MaxSize-1)return 0;s->top++;s->elem[s->top]=e;return 1;}int Pop(SqStack *&s,ElemType &e){if (s->top==-1)return 0;e=s->elem[s->top];s->top--;return 1;int GetTop(SqStack *s,ElemType &e){if (s->top==-1)return 0;e=s->elem[s->top];return 1;}void DispStack(SqStack *s){int i;for (i=s->top;i>=0;i--)printf("%c ",s->elem[i]);printf("\n");}实验题3.2实现链栈各种基本运算的算法/*文件名:algo3-2.cpp*/#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct linknode{ElemType data; /*数据域*/struct linknode *next; /*指针域*/} LiStack;void InitStack(LiStack *&s){s=(LiStack *)malloc(sizeof(LiStack));s->next=NULL;}void ClearStack(LiStack *&s){LiStack *p=s->next;while (p!=NULL){free(s);s=p;p=p->next;}}int StackLength(LiStack *s){int i=0;LiStack *p;p=s->next;while (p!=NULL){i++;p=p->next;}return(i);}int StackEmpty(LiStack *s){return(s->next==NULL);}void Push(LiStack *&s,ElemType e){LiStack *p;p=(LiStack *)malloc(sizeof(LiStack));p->data=e;p->next=s->next; /*插入*p结点作为第一个数据结点*/s->next=p;}int Pop(LiStack *&s,ElemType &e){LiStack *p;if (s->next==NULL) /*栈空的情况*/return 0;p=s->next; /*p指向第一个数据结点*/e=p->data;s->next=p->next;free(p);return 1;}int GetTop(LiStack *s,ElemType &e){if (s->next==NULL) /*栈空的情况*/return 0;e=s->next->data;return 1;}void DispStack(LiStack *s){LiStack *p=s->next;while (p!=NULL){printf("%c ",p->data);p=p->next;}printf("\n");}实验题3.3实现顺序队列各种基本运算的算法/*文件名:algo3-3.cpp*/#include <stdio.h>#include <malloc.h>#define MaxSize 5typedef char ElemType;typedef struct{ElemType elem[MaxSize];int front,rear; /*队首和队尾指针*/} SqQueue;void InitQueue(SqQueue *&q){q=(SqQueue *)malloc (sizeof(SqQueue));q->front=q->rear=0;}void ClearQueue(SqQueue *&q){free(q);}int QueueEmpty(SqQueue *q){return(q->front==q->rear);}int QueueLength(SqQueue *q){return (q->rear-q->front+MaxSize)%MaxSize; }int enQueue(SqQueue *&q,ElemType e){if ((q->rear+1)%MaxSize==q->front) /*队满*/return 0;q->rear=(q->rear+1)%MaxSize;q->elem[q->rear]=e;return 1;}int deQueue(SqQueue *&q,ElemType &e){if (q->front==q->rear) /*队空*/return 0;q->front=(q->front+1)%MaxSize;e=q->elem[q->front];return 1;}实验题3.4实现链队各种基本运算的算法/*文件名:algo3-4.cpp*/#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct qnode{ElemType data;struct qnode *next;} QNode;typedef struct{QNode *front;QNode *rear;} LiQueue;void InitQueue(LiQueue *&q){q=(LiQueue *)malloc(sizeof(LiQueue));q->front=q->rear=NULL;}void ClearQueue(LiQueue *&q){QNode *p=q->front,*r;if (p!=NULL) /*释放数据结点占用空间*/{r=p->next;while (r!=NULL){free(p);p=r;r=p->next;}}free(q); /*释放头结点占用空间*/ }int QueueLength(LiQueue *q){int n=0;QNode *p=q->front;while (p!=NULL){n++;p=p->next;}return(n);}int QueueEmpty(LiQueue *q){if (q->rear==NULL)return 1;elsereturn 0;}void enQueue(LiQueue *&q,ElemType e){QNode *s;s=(QNode *)malloc(sizeof(QNode));s->data=e;s->next=NULL;if (q->rear==NULL) /*若链队为空,则新结点是队首结点又是队尾结点*/q->front=q->rear=s;else{q->rear->next=s; /*将*s结点链到队尾,rear指向它*/q->rear=s;}}int deQueue(LiQueue *&q,ElemType &e){QNode *t;if (q->rear==NULL) /*队列为空*/return 0;if (q->front==q->rear) /*队列中只有一个结点时*/{t=q->front;q->front=q->rear=NULL;}else /*队列中有多个结点时*/{t=q->front;q->front=q->front->next;}e=t->data;free(t);return 1;}第4章串——上机实验题4解析实验题4.1实现顺序串各种基本运算的算法/*文件名:algo4-1.cpp*/#include <stdio.h>#define MaxSize 100 /*最多的字符个数*/typedef struct{ char ch[MaxSize]; /*定义可容纳MaxSize个字符的空间*/ int len; /*标记当前实际串长*/} SqString;void StrAssign(SqString &str,char cstr[]) /*str为引用型参数*/ {int i;for (i=0;cstr[i]!='\0';i++)str.ch[i]=cstr[i];str.len=i;}void StrCopy(SqString &s,SqString t) /*s为引用型参数*/ {int i;for (i=0;i<t.len;i++)s.ch[i]=t.ch[i];s.len=t.len;}int StrEqual(SqString s,SqString t){int same=1,i;if (s.len!=t.len) /*长度不相等时返回0*/same=0;else{for (i=0;i<s.len;i++)if (s.ch[i]!=t.ch[i]) /*有一个对应字符不相同时返回0*/same=0;}return same;}int StrLength(SqString s){return s.len;}SqString Concat(SqString s,SqString t){SqString str;int i;str.len=s.len+t.len;for (i=0;i<s.len;i++) /*将s.ch[0]~s.ch[s.len-1]复制到str*/ str.ch[i]=s.ch[i];for (i=0;i<t.len;i++) /*将t.ch[0]~t.ch[t.len-1]复制到str*/ str.ch[s.len+i]=t.ch[i];return str;}SqString SubStr(SqString s,int i,int j){SqString str;int k;str.len=0;if (i<=0 || i>s.len || j<0 || i+j-1>s.len){printf("参数不正确\n");return str; /*参数不正确时返回空串*/}for (k=i-1;k<i+j-1;k++) /*将s.ch[i]~s.ch[i+j]复制到str*/str.ch[k-i+1]=s.ch[k];str.len=j;return str;}SqString InsStr(SqString s1,int i,SqString s2){int j;SqString str;str.len=0;if (i<=0 || i>s1.len+1) /*参数不正确时返回空串*/{printf("参数不正确\n");return s1;}for (j=0;j<i-1;j++) /*将s1.ch[0]~s1.ch[i-2]复制到str*/str.ch[j]=s1.ch[j];for (j=0;j<s2.len;j++) /*将s2.ch[0]~s2.ch[s2.len-1]复制到str*/str.ch[i+j-1]=s2.ch[j];for (j=i-1;j<s1.len;j++) /*将s1.ch[i-1]~s.ch[s1.len-1]复制到str*/str.ch[s2.len+j]=s1.ch[j];str.len=s1.len+s2.len;return str;}SqString DelStr(SqString s,int i,int j){int k;SqString str;str.len=0;if (i<=0 || i>s.len || i+j>s.len+1) /*参数不正确时返回空串*/{printf("参数不正确\n");return str;}for (k=0;k<i-1;k++) /*将s.ch[0]~s.ch[i-2]复制到str*/str.ch[k]=s.ch[k];for (k=i+j-1;k<s.len;k++)/*将s.ch[i+j-1]~ch[s.len-1]复制到str*/ str.ch[k-j]=s.ch[k];str.len=s.len-j;return str;}SqString RepStr(SqString s,int i,int j,SqString t){int k;SqString str;str.len=0;if (i<=0 || i>s.len || i+j-1>s.len) /*参数不正确时返回空串*/ {printf("参数不正确\n");return str;}for (k=0;k<i-1;k++) /*将s.ch[0]~s.ch[i-2]复制到str*/str.ch[k]=s.ch[k];for (k=0;k<t.len;k++) /*将t.ch[0]~t.ch[t.len-1]复制到str*/str.ch[i+k-1]=t.ch[k];for (k=i+j-1;k<s.len;k++) /*将s.ch[i+j-1]~ch[s.len-1]复制到str*/str.ch[t.len+k-j]=s.ch[k];str.len=s.len-j+t.len;return str;}void DispStr(SqString str){int i;if (str.len>0){for (i=0;i<str.len;i++)printf("%c",str.ch[i]);printf("\n");}}实验题4.2实现链串各种基本运算的算法*文件名:algo4-2.cpp*/#include <stdio.h>#include <malloc.h>typedef struct snode{char data;struct snode *next;} LiString;void StrAssign(LiString *&s,char t[]){int i;LiString *r,*p;s=(LiString *)malloc(sizeof(LiString));s->next=NULL;r=s;for (i=0;t[i]!='\0';i++){p=(LiString *)malloc(sizeof(LiString));p->data=t[i];p->next=NULL;r->next=p;r=p;}}void StrCopy(LiString *&s,LiString *t){LiString *p=t->next,*q,*r;s=(LiString *)malloc(sizeof(LiString));s->next=NULL;s->next=NULL;r=s;while (p!=NULL) /*将t的所有结点复制到s*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}}int StrEqual(LiString *s,LiString *t){LiString *p=s->next,*q=t->next;while (p!=NULL && q!=NULL && p->data==q->data){p=p->next;q=q->next;}if (p==NULL && q==NULL)return 1;elsereturn 0;}int StrLength(LiString *s){int i=0;LiString *p=s->next;while (p!=NULL){i++;p=p->next;}return i;}LiString *Concat(LiString *s,LiString *t){LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;while (p!=NULL) /*将s的所有结点复制到str*/ {q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}p=t->next;while (p!=NULL) /*将t的所有结点复制到str*/ {q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}LiString *SubStr(LiString *s,int i,int j){int k;LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) {printf("参数不正确\n");return str; /*参数不正确时返回空串*/ }for (k=0;k<i-1;k++)p=p->next;for (k=1;k<=j;k++) /*将s的第i个结点开始的j个结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}LiString *InsStr(LiString *s,int i,LiString *t){int k;LiString *str,*p=s->next,*p1=t->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;if (i<=0 || i>StrLength(s)+1) /*参数不正确时返回空串*/{printf("参数不正确\n");return str;}for (k=1;k<i;k++) /*将s的前i个结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}while (p1!=NULL) /*将t的所有结点复制到str*/ {q=(LiString *)malloc(sizeof(LiString));q->data=p1->data;q->next=NULL;r->next=q;r=q;p1=p1->next;}while (p!=NULL) /*将*p及其后的结点复制到str*/ {q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}LiString *DelStr(LiString *s,int i,int j){int k;LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) {printf("参数不正确\n");return str; /*参数不正确时返回空串*/ }for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}for (k=0;k<j;k++) /*让p沿next跳j个结点*/p=p->next;while (p!=NULL) /*将*p及其后的结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}LiString *RepStr(LiString *s,int i,int j,LiString *t){int k;LiString *str,*p=s->next,*p1=t->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) {printf("参数不正确\n");return str; /*参数不正确时返回空串*/ }for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}for (k=0;k<j;k++) /*让p沿next跳j个结点*/p=p->next;while (p1!=NULL) /*将t的所有结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p1->data;q->next=NULL;r->next=q;r=q;p1=p1->next;}while (p!=NULL) /*将*p及其后的结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}void DispStr(LiString *s){LiString *p=s->next;while (p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}第5章数组和稀疏矩阵——上机实验题5解析实验题5.1求5×5阶螺旋方阵/*文件名:exp5-1.cpp*/#include <stdio.h>#define MaxLen 10void fun(int a[MaxLen][MaxLen],int n){int i,j,k=0,m;if (n%2==0) //m=én/2ùm=n/2;elsem=n/2+1;for (i=0;i<m;i++){for (j=i;j<n-i;j++){k++;a[i][j]=k;}for (j=i+1;j<n-i;j++){k++;a[j][n-i-1]=k;}for (j=n-i-2;j>=i;j--){k++;a[n-i-1][j]=k;}for (j=n-i-2;j>=i+1;j--){k++;a[j][i]=k;}}}void main(){int n,i,j;int a[MaxLen][MaxLen];printf("\n");printf("输入n(n<10):");scanf("%d",&n);fun(a,n);printf("%d阶数字方阵如下:\n",n);for (i=0;i<n;i++){for (j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}printf("\n");}实验题5.2求一个矩阵的马鞍点/*文件名:exp5-2.cpp*/#include <stdio.h>#define M 4#define N 4void MinMax(int A[M][N]){int i,j,have=0;int min[M],max[N];for (i=0;i<M;i++) /*计算出每行的最小值元素,放入min[0..M-1]之中*/{min[i]=A[i][0];for (j=1;j<N;j++)if (A[i][j]<min[i])min[i]=A[i][j];}for (j=0;j<N;j++) /*计算出每列的最大值元素,放入max[0..N-1]之中*/{max[j]=A[0][j];for (i=1;i<M;i++)if (A[i][j]>max[j])max[j]=A[i][j];}for (i=0;i<M;i++)for (j=0;j<N;j++)if (min[i]==max[j]){printf(" A[%d,%d]=%d\n",i,j,A[i][j]); /*显示马鞍点*/have=1;}if (!have)printf("没有鞍点\n");}void main(){int i,j;int A[M][N]={{9, 7, 6, 8},{20,26,22,25},{28,36,25,30},{12,4, 2, 6}};printf("A矩阵:\n");for (i=0;i<M;i++){for (j=0;j<N;j++)printf("%4d",A[i][j]);printf("\n");}printf("A矩阵中的马鞍点:\n");MinMax(A); /*调用MinMax()找马鞍点*/}实验题5.3求两个对称矩阵之和与乘积/*文件名:exp5-3.cpp*/#include <stdio.h>#define n 4#define m 10int value(int a[],int i,int j){if (i>=j)return a[(i*(i-1))/2+j];elsereturn a[(j*(j-1))/2+i];}void madd(int a[],int b[],int c[n][n]){int i,j;for (i=0;i<n;i++)for (j=0;j<n;j++)c[i][j]=value(a,i,j)+value(b,i,j);}void mult(int a[],int b[],int c[n][n]){int i,j,k,s;for (i=0;i<n;i++)for (j=0;j<n;j++){s=0;for (k=0;k<n;k++)s=s+value(a,i,k)*value(b,k,j); c[i][j]=s;}}void disp1(int a[]){int i,j;for (i=0;i<n;i++){for (j=0;j<n;j++)printf("%4d",value(a,i,j));printf("\n");}}void disp2(int c[n][n]){int i,j;for (i=0;i<n;i++){for (j=0;j<n;j++)printf("%4d",c[i][j]);printf("\n");}}void main(){int a[m]={1,2,3,4,5,6,7,8,9,10};int b[m]={1,1,1,1,1,1,1,1,1,1};int c1[n][n],c2[n][n];madd(a,b,c1);mult(a,b,c2);printf("\n");printf("a矩阵:\n");disp1(a);printf("b矩阵:\n");disp1(b);printf("a+b:\n");disp2(c1);printf("a*b:\n");disp2(c2);printf("\n");}实验题5.4实现稀疏矩阵(采用三元组表示)的基本运算/*文件名:exp5-4.cpp*/#include <stdio.h>#define N 4typedef int ElemType;#define MaxSize 100 /*矩阵中非零元素最多个数*/ typedef struct{ int r; /*行号*/int c; /*列号*/ElemType d; /*元素值*/} TupNode; /*三元组定义*/typedef struct{ int rows; /*行数值*/int cols; /*列数值*/int nums; /*非零元素个数*/TupNode data[MaxSize];} TSMatrix; /*三元组顺序表定义*/void CreatMat(TSMatrix &t,ElemType A[N][N]){int i,j;t.rows=N;t.cols=N;t.nums=0;for (i=0;i<N;i++){for (j=0;j<N;j++)if (A[i][j]!=0){t.data[t.nums].r=i;t.data[t.nums].c=j;t.data[t.nums].d=A[i][j];t.nums++;}}}void DispMat(TSMatrix t){int i;if (t.nums<=0)return;printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);printf("\t------------------\n");for (i=0;i<t.nums;i++)printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d); }void TranMat(TSMatrix t,TSMatrix &tb){int p,q=0,v; /*q为tb.data的下标*/tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;if (t.nums!=0){for (v=0;v<t.cols;v++) /*tb.data[q]中的记录以c 域的次序排列*/for (p=0;p<t.nums;p++) /*p为t.data的下标*/if (t.data[p].c==v){tb.data[q].r=t.data[p].c;tb.data[q].c=t.data[p].r;tb.data[q].d=t.data[p].d;q++;}}}int MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c){int i=0,j=0,k=0;ElemType v;if (a.rows!=b.rows || a.cols!=b.cols)return 0; /*行数或列数不等时不能进行相加运算*/c.rows=a.rows;c.cols=a.cols; /*c的行列数与a的相同*/while (i<a.nums && j<b.nums) /*处理a和b中的每个元素*/{if (a.data[i].r==b.data[j].r) /*行号相等时*/{if(a.data[i].c<b.data[j].c) /*a元素的列号小于b 元素的列号*/{c.data[k].r=a.data[i].r;/*将a元素添加到c中*/c.data[k].c=a.data[i].c;c.data[k].d=a.data[i].d;k++;i++;}else if (a.data[i].c>b.data[j].c)/*a元素的列号大于b元素的列号*/{c.data[k].r=b.data[j].r; /*将b元素添加到c中*/c.data[k].c=b.data[j].c;c.data[k].d=b.data[j].d;k++;j++;}else /*a元素的列号等于b元素的列号*/{v=a.data[i].d+b.data[j].d;if (v!=0) /*只将不为0的结果添加到c中*/{c.data[k].r=a.data[i].r;c.data[k].c=a.data[i].c;c.data[k].d=v;k++;}i++;j++;}}else if (a.data[i].r<b.data[j].r) /*a元素的行号小于b元素的行号*/{c.data[k].r=a.data[i].r; /*将a元素添加到c中*/c.data[k].c=a.data[i].c;c.data[k].d=a.data[i].d;k++;i++;}else /*a元素的行号大于b元素的行号*/{c.data[k].r=b.data[j].r; /*将b元素添加到c中*/c.data[k].c=b.data[j].c;c.data[k].d=b.data[j].d;k++;j++;}c.nums=k;}return 1;}int value(TSMatrix c,int i,int j){int k=0;while (k<c.nums && (c.data[k].r!=i || c.data[k].c!=j))k++;if (k<c.nums)return(c.data[k].d);elsereturn(0);}int MatMul(TSMatrix a,TSMatrix b,TSMatrix &c){int i,j,k,p=0;ElemType s;if (a.cols!=b.rows) /*a的列数不等于b的行数时不能进行相乘运算*/return 0;for (i=0;i<a.rows;i++)for (j=0;j<b.cols;j++){s=0;for (k=0;k<a.cols;k++)s=s+value(a,i,k)*value(b,k,j);if (s!=0) /*产生一个三元组元素*/{c.data[p].r=i;c.data[p].c=j;c.data[p].d=s;p++;}}c.rows=a.rows;c.cols=b.cols;c.nums=p;return 1;}void main(){ElemType a1[N][N]={{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};ElemType b1[N][N]={{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};TSMatrix a,b,c;CreatMat(a,a1);CreatMat(b,b1);printf("a的三元组:\n");DispMat(a);printf("b的三元组:\n");DispMat(b);printf("a转置为c\n");TranMat(a,c);printf("c的三元组:\n");DispMat(c);printf("c=a+b\n");MatAdd(a,b,c);printf("c的三元组:\n");DispMat(c);printf("c=a*b\n");MatMul(a,b,c);printf("c的三元组:\n");DispMat(c);}实验题5.5实现广义表的基本运算#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct lnode{ int tag; /*结点类型标识*/ union{ElemType data;struct lnode *sublist;}val;struct lnode *link; /*指向下一个元素*/} GLNode;extern GLNode *CreatGL(char *&s);extern void DispGL(GLNode *g);void Change(GLNode *&g,ElemType s,ElemType t) /*将广义表g中所有原子s 替换成t*/{if (g!=NULL){if (g->tag==1) /*子表的情况*/Change(g->val.sublist,s,t);else if (g->val.data==s) /*原子且data域值为s的情况*/g->val.data=t;Change(g->link,s,t);}}void Reverse(GLNode *&g) /*将广义表g所有元素逆置*/{GLNode *p,*q,*t;t=NULL;if (g!=NULL){p=g;while (p!=NULL) /*将同级的兄弟逆置*/{q=p->link;if (t==NULL){t=p;p->link=NULL;}else{p->link=t;t=p;}p=q;}g=t;p=g;while (p!=NULL){if (p->tag==1)Reverse(p->val.sublist);p=p->link;}}}int Same(GLNode *g1,GLNode *g2) /*判断两个广义表是否相同*/ {int s;if (g1==NULL && g2==NULL) /*均为NULL的情况*/return 1;else if ((g1==NULL && g2!=NULL) || (g1!=NULL && g2==NULL)) /*一个为NULL,另一不为NULL的情况*/return 0;else{s=1;while (g1!=NULL && g2!=NULL && s==1){if (g1->tag==1 && g2->tag==1)/*均为子表的情况*/s=Same(g1->val.sublist,g2->val.sublist);else if (g1->tag==0 && g2->tag==0)/*均为原子的情况*/{if (g1->val.data!=g2->val.data)s=0;}else /*一个为原子,另一为子表的情况*/s=0;g1=g1->link;g2=g2->link;}if (g1!=NULL || g2!=NULL) /*有一个子表尚未比较完时*/s=0;return s;}}ElemType MaxAtom(GLNode *g) /*求广义表g中最大的原子*/{ElemType m=0,m1; /*m赋初值0*/while (g!=NULL){if (g->tag==1) /*子表的情况*/{m1=MaxAtom(g->val.sublist); /*对子表递归调用*/if (m1>m) m=m1;}else{if (g->val.data>m) /*为原子时,进行原子比较*/m=g->val.data;}g=g->link;}return m;}void DelAtom(GLNode *&g,ElemType x) /*删除广义表g中的第一个为x原子*/{GLNode *p=g,*q,*pre;while (p!=NULL){q=p->link;if (p->tag==1) /*子表的情况*/DelAtom(p->val.sublist,x); /*对子表递归调用*/else{if (p->val.data==x) /*为原子时,进行原子比较*/{if (p==g)/*被删结点是本层的第1个结点*/{g=q;free(p); /*释放结pre=g;}else /*被删结{pre->link=q;free(p);}return;}}pre=p;p=q;}}void DelAtomAll(GLNode *&g,ElemType x) /*删除广义表g中的所有为x原子*/{GLNode *p=g,*q,*pre;while (p!=NULL){q=p->link;if (p->tag==1) /*子表的情况*/DelAtomAll(p->val.sublist,x); /*对子表递归调用*/else{if (p->val.data==x) /*为原子时,进行原子比较*/if (p==g)/*被删结点是本层的第1个结点*/{g=q;free(p); /*释放结pre=g;}else /*被删结{pre->link=q;free(p);}}pre=p;p=q;}}void PreOrder(GLNode *g) /*采用先根遍历g*/{if (g!=NULL){if (g->tag==0) /*为原子结点时*/printf("%c ",g->val.data);elsePreOrder(g->val.sublist); /*为子表时*/ PreOrder(g->link);}}void main(){GLNode *g1,*g2,*g3,*g4;char *str1="(a,(a),((a,b)),((a)),a)";char *str2="(a,(b),((c,d)),((e)),f)";char *str3="(a,(a,b),(a,b,c)))";char *str4="(a,(b),((c,d)),((e)),f)";g1=CreatGL(str1);printf("\n");printf(" 广义表g1:");DispGL(g1);printf("\n");printf(" 将广义表g1中所有'a'改为'b'\n");Change(g1,'a','b');printf(" 广义表g1:");DispGL(g1);printf("\n\n");g2=CreatGL(str2);printf(" 广义表g2:");DispGL(g2);printf("\n");printf(" 广义表g2中最大原子:%c\n",MaxAtom(g2));printf(" 将g2的元素逆置\n");Reverse(g2);printf(" 广义表g2:");DispGL(g2);printf("\n\n");printf(" 广义表g1和g2%s\n\n",(Same(g1,g2)?"相同":"不相同"));g3=CreatGL(str3);printf(" 广义表g3:");DispGL(g3);printf("\n");printf(" 删除广义表g3的第一个为'a'的原子\n");DelAtom(g3,'a');printf(" 广义表g3:");DispGL(g3);printf("\n\n");printf(" 删除广义表g3中的所有'a'原子\n");DelAtomAll(g3,'a');printf(" 广义表g3:");DispGL(g3);printf("\n\n");g4=CreatGL(str4);printf(" 广义表g4:");DispGL(g4);printf("\n");printf(" 采用先根遍历g4的结果:");PreOrder(g4);printf("\n\n");}。

数据结构 多项式乘法

数据结构 多项式乘法

实习报告一、实习题:请写出计算两个以单链接表表示的多项式相乘的程序。

1.需求分析和说明两个多项式相乘,可以利用两个多项式的加法来实现,因为乘法运算可以分解为一系列的加法运算:C(x)=A(x)*B(x)=A(x)*(b1x+b2x2+…+b n x n)=∑=niii xbxA1)(先用其中一个多项式去乘以另一个多项式的每一项,得出的若干个多项式按照一定的顺序相加,即幂不同的按照升幂排列,幂相同的将系数相加。

例如:对于(X->1+2X->2)*(2X->2+4X->3).X->1*(2X->2+4X->3)=2X->3+4X->4;2X->2*(2X->2+4X->3)=4X->4+8X->5;排列结果:2X->3+8X-4+8X->52.设计用两个单链表的存储两个多项式,每个结点包含单项式的系数,幂和指向下一个元素地址的指针。

用其中的一个多项式乘以另一个多项式的每一项,随后将所得结果按照升幂顺序排列,最后得到结果。

存储结构://单项式结构struct Term {float coef; // 系数。

int exp; // 幂指数。

Term( float c, int e) { coef = c; exp = e;}Term( ) { }friend int operator == (const Term & L, const Term & T ) { return L.exp == T.exp; }friend int operator > (const Term & L, const Term & T ) { return L.exp > T.exp; }friend int operator < (const Term & L, const Term & T ) { return L.exp < T.exp; }friend Term & operator += ( Term & L, const Term & T ){ L.coef += T.coef; return L; } //幂指数相同,则系数相加。

数据结构一元多项式报告

数据结构一元多项式报告

一元多项式计算:程序要求:1)、能够按照指数降序排列建立并输出多项式;2)、能够完成两个多项式的相加、相减,并将结果输入。

概要设计:1.功能:将要进行运算的多项式输入输出。

2.数据流入:要输入的多项式的系数与指数。

3.数据流出:合并同类项后的多项式。

4.程序流程图:多项式输入流程图如图3.2.1所示。

5.测试要点:输入的多项式是否正确,若输入错误则重新输入2、多项式的加法(1)功能:将两多项式相加。

(2)数据流入:输入函数。

(3)数据流出:多项式相加后的结果。

(4)程序流程图:多项式的加法流程图如图3.2.2所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

3、多项式的减法(1)功能:将两多项式相减。

(2)数据流入:调用输入函数。

(3)数据流出:多项式相减后的结果。

(4)程序流程图:多项式的减法流程图如图3.2.3所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

详细代码:#include<iostream>#include<conio.h>#include<stdlib.h>using namespace std; struct Node{float coef;//结点类型int exp;};typedef Node polynomial;struct LNode{polynomial data;//链表类型LNode *next;};typedef LNode* Link;void CreateLink(Link &L,int n);void PrintList(Link L);void PolyAdd(Link &pc,Link pa,Link pb);void PolySubstract(Link &pc,Link pa,Link pb); void CopyLink(Link &pc,Link pa);void PolyMultiply(Link &pc,Link pa,Link pb);int JudgeIfExpSame(Link pa,Link e);void DestroyLink(Link &L);int CompareIfNum(int i);void DestroyLink(Link &L){Link p;p=L->next;while(p){L->next=p->next;delete p;p=L->next;}delete L;L=NULL;}//创建含有n个链表类型结点的项,即创建一个n项多项式void CreateLink(Link &L,int n){if(L!=NULL){DestroyLink(L);}Link p,newp;L=new LNode;L->next=NULL;(L->data).exp=-1;//创建头结点p=L;for(int i=1;i<=n;i++){newp=new LNode;cout<<"请输入第"<<i<<"项的系数和指数:"<<endl;cout<<"系数:";cin>>(newp->data).coef;cout<<"指数:";cin>>(newp->data).exp;if(newp->data.exp<0){cout<<"您输入有误,指数不允许为负值!"<<endl;delete newp;i--;continue;}newp->next=NULL;p=L;if(newp->data.coef==0){cout<<"系数为零,重新输入!"<<endl;delete newp;i--;continue;}while((p->next!=NULL)&&((p->next->data).exp<(newp->data).exp)){p=p->next; //p指向指数最小的那一个}if(!JudgeIfExpSame( L, newp)){newp->next=p->next;p->next=newp;}else{cout<<"输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式"<<endl;delete newp;DestroyLink(L);CreateLink(L,n); //创建多项式没有成功,递归调用重新创建break;}}}/*判断指数是否与多项式中已存在的某项相同*/int JudgeIfExpSame(Link L,Link e){Link p;p=L->next;while(p!=NULL&&(e->data.exp!=p->data.exp))p=p->next;if(p==NULL)return 0;else return 1;}/*输出链表*/void PrintList(Link L){Link p;if(L==NULL||L->next==NULL)cout<<"该一元多项式为空!"<<endl;else{p=L->next;//项的系数大于的种情况if((p->data).coef>0){if((p->data).exp==0)cout<<(p->data).coef;else if((p->data).coef==1&&(p->data).exp==1)cout<<"x";else if((p->data).coef==1&&(p->data).exp!=1)cout<<"x^"<<(p->data).exp;else if((p->data).exp==1&&(p->data).coef!=1)cout<<(p->data).coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }//项的系数小于的种情况if((p->data).coef<0){if((p->data).exp==0)cout<<(p->data).coef;else if(p->data.coef==-1&&p->data.exp==1)cout<<"-x";else if(p->data.coef==-1&&p->data.exp!=1)cout<<"-x^"<<p->data.exp;else if(p->data.exp==1)cout<<p->data.coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }p=p->next;while(p!=NULL){if((p->data).coef>0){if((p->data).exp==0)cout<<"+"<<(p->data).coef;else if((p->data).exp==1&&(p->data).coef!=1)cout<<"+"<<(p->data).coef<<"x";else if((p->data).exp==1&&(p->data).coef==1)cout<<"+"<<"x";else if((p->data).coef==1&&(p->data).exp!=1)cout<<"+"<<"x^"<<(p->data).exp;else cout<<"+"<<(p->data).coef<<"x^"<<(p->data).exp; }if((p->data).coef<0){if((p->data).exp==0)cout<<(p->data).coef;else if(p->data.coef==-1&&p->data.exp==1)cout<<"-x";else if(p->data.coef==-1&&p->data.exp!=1)cout<<"-x^"<<p->data.exp;else if(p->data.exp==1)cout<<p->data.coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp;}p=p->next;}}cout<<endl;}/*把一个链表的内容复制给另一个链表*/void CopyLink(Link &pc,Link pa){Link p,q,r;pc=new LNode;pc->next=NULL;r=pc;p=pa;while(p->next!=NULL){q=new LNode;q->data.coef=p->next->data.coef;q->data.exp=p->next->data.exp;r->next=q;q->next=NULL;r=q;p=p->next;}}/*将两个一元多项式相加*/void PolyAdd(Link &pc,Link pa,Link pb){Link p1,p2,p,pd;CopyLink(p1,pa);CopyLink(p2,pb);pc=new LNode;pc->next=NULL;p=pc;p1=p1->next;p2=p2->next;while(p1!=NULL&&p2!=NULL){if(p1->data.exp<p2->data.exp){p->next=p1;p=p->next;p1=p1->next;}else if(p1->data.exp>p2->data.exp){p->next=p2;p=p->next;p2=p2->next;}else{p1->data.coef=p1->data.coef+p2->data.coef;if(p1->data.coef!=0){p->next=p1;p=p->next;p1=p1->next;p2=p2->next;}else{pd=p1;p1=p1->next;p2=p2->next;delete pd;}}}if(p1!=NULL){p->next=p1;}if(p2!=NULL){p->next=p2;}}/*将两个多项式相减*/void PolySubstract(Link &pc,Link pa,Link pb) {Link p,pt;CopyLink(pt,pb);p=pt;while(p!=NULL){(p->data).coef=(-(p->data).coef);p=p->next;}PolyAdd(pc,pa,pt);DestroyLink(pt);}//清屏函数void Clear(){system("pause");system("cls");}/*将两个一元多项式相乘*/void PolyMultiply(Link &pc,Link pa,Link pb) {Link p1,p2,p,pd,newp,t;pc=new LNode;pc->next=NULL;p1=pa->next;p2=pb->next;while(p1!=NULL){pd=new LNode;pd->next=NULL;p=new LNode;p->next=NULL;t=p;while(p2){newp=new LNode;newp->next=NULL;newp->data.coef=p1->data.coef*p2->data.coef;newp->data.exp=p1->data.exp+p2->data.exp;t->next=newp;t=t->next;p2=p2->next;}PolyAdd(pd,pc,p);CopyLink(pc,pd);p1=p1->next;p2=pb->next;DestroyLink(p);DestroyLink(pd);}}//菜单函数void Menu(){cout<<""<<endl;cout<<endl;cout<<"\t=========================一元多项式的简单运算========================="<<endl;cout<<"\t\t\t\t\t\t\t\t "<<endl;cout<<"\t\t\t [1] 创建要运算的两个一元多项式\t\t "<<endl; cout<<"\t\t\t [2] 将两个一元多项式相加\t\t\t "<<endl; cout<<"\t\t\t [3] 将两个一元多项式相减\t\t\t "<<endl; cout<<"\t\t\t [4] 将两个一元多项式相乘\t\t\t "<<endl; cout<<"\t\t\t [5] 显示两个一元多项式\t\t\t "<<endl;cout<<"\t\t\t [6] 销毁所创建的二个多项式\t\t "<<endl; cout<<"\t\t\t [7] 退出\t\t\t\t\t "<<endl;cout<<"\t\t\t\t\t\t\t\t "<<endl;cout<<"\t=========================一元多项式的简单运算========================="<<endl;cout<<endl;cout<<"\t\t 请选择:";}//判断输入的整数是不是为到的数字int CompareIfNum(int i){if(i>0&&i<8)return 0;else return 1;}void main(){{system("color b");//system("pause");system("color a");//system("pause");}int n;Link L,La=NULL,Lb=NULL;//La,Lb分别为创建的两个多项式int choose;while(1){Menu(); //调用菜单函数cin>>choose;switch(choose){case 1:cout<<"请输入你要运算的第一个一元多项式的项数:"<<endl; cin>>n;if(CompareIfNum(n)==1){cout<<"您的输入有误,请重新输入……"<<endl;Clear();break;}CreateLink(La,n);cout<<"请输入你要运算的第二个一元多项式的项数:"<<endl; cin>>n;if(CompareIfNum(n)==1){cout<<"您的输入有误,请重新输入……"<<endl;Clear();break;}CreateLink(Lb,n);Clear();break;case 2:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolyAdd(L,La,Lb);cout<<""<<endl;cout<<"待相加的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相加后的结果为:";PrintList(L);cout<<""<<endl;Clear();DestroyLink(L);break;case 3:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolySubstract(L,La,Lb);cout<<"相减的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相减后的结果为:";PrintList(L);cout<<""<<endl;Clear();DestroyLink(L);break;case 4:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolyMultiply(L,La,Lb);cout<<"相乘的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相乘后的结果为:";PrintList(L);DestroyLink(L);cout<<""<<endl;Clear();break;case 5:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}cout<<"一元多项式A为:"<<endl;PrintList(La);cout<<""<<endl;cout<<"一元多项式B为:"<<endl;PrintList(Lb);cout<<""<<endl;Clear();break;case 6:if(La&&Lb){DestroyLink(La);DestroyLink(Lb);cout<<"多项式销毁成功!"<<endl;Clear();}else{cout<<"多项式不存在,请重新选择^^^"<<endl;Clear();}break;case 7:exit(0); //exit(0)强制终止程序,返回状态码表示正常结束default:cout<<"您的输入有误,请重新选择操作……"<<endl;Clear();break;}}}。

〈数据结构〉上机实验指导

〈数据结构〉上机实验指导

〈数据结构〉上机实验指导数据结构是计算机科学中的一门重要课程,它研究的是数据的组织、存储和管理方式,以及对数据进行操作和处理的算法。

上机实验是数据结构课程的重要组成部分,通过实践操作,能够更好地理解和掌握数据结构的基本概念、算法和应用。

在进行〈数据结构〉上机实验之前,首先需要准备实验环境。

通常情况下,我们会使用一种编程语言来实现数据结构的相关操作,比如C++、Java等。

根据自己的实际情况和实验要求,选择一种合适的编程语言,并确保在实验环境中已经正确安装了相应的编译器或解释器。

接下来,我们可以开始进行具体的上机实验了。

下面以链表为例,介绍一下〈数据结构〉上机实验的指导步骤和要求:1. 实验目的:掌握链表的基本概念、操作和应用,理解链表与数组的区别和联系。

2. 实验原理:链表是一种动态数据结构,它由一系列的节点组成,每个节点包含数据和指向下一个节点的指针。

链表的特点是插入和删除操作的时间复杂度为O(1),但是查找操作的时间复杂度为O(n)。

3. 实验步骤:3.1 创建链表:首先,我们需要定义一个链表的结构体,包含数据和指针两个成员变量。

然后,通过动态内存分配来创建链表的节点,并将节点之间通过指针连接起来,形成一个完整的链表。

3.2 插入节点:可以在链表的任意位置插入一个新的节点。

插入节点的操作包括:创建一个新的节点,将新节点的指针指向插入位置的下一个节点,将插入位置的前一个节点的指针指向新节点。

3.3 删除节点:可以删除链表中的任意一个节点。

删除节点的操作包括:将要删除的节点的前一个节点的指针指向要删除的节点的下一个节点,然后释放要删除的节点的内存空间。

3.4 遍历链表:可以通过遍历链表来访问链表中的每一个节点,并对节点进行相应的操作。

遍历链表的操作包括:从链表的头节点开始,依次访问每个节点,直到链表的尾节点。

3.5 查找节点:可以根据节点的值来查找链表中的某一个节点。

查找节点的操作包括:从链表的头节点开始,依次比较每个节点的值,直到找到目标节点或者链表结束。

数据结构一元多项式的运算

数据结构一元多项式的运算

数据结构一元多项式的运算数据结构一元多项式的运算1、引言1.1 研究背景1.2 研究目的2、一元多项式的定义2.1 一元多项式的概念2.2 一元多项式的表示方法2.3 一元多项式的次数和系数2.4 一元多项式的零多项式和常数项2.5 一元多项式的加法运算2.6 一元多项式的减法运算2.7 一元多项式的乘法运算3、一元多项式的特殊运算3.1 一元多项式的乘方运算3.2 一元多项式的取余运算3.3 一元多项式的求导运算3.4 一元多项式的积分运算3.5 一元多项式的复合运算4、一元多项式的应用4.1 一元多项式在数学中的应用4.2 一元多项式在计算机科学中的应用4.3 一元多项式在工程领域中的应用5、实例分析5.1 实例一:一元多项式的相加减5.2 实例二:一元多项式的乘法运算5.3 实例三:一元多项式的特殊运算应用6、结论附件:附件一:一元多项式的代码实现示例法律名词及注释:1.一元多项式: 指仅有一个未知数的多项式。

2.多项式的次数: 多项式中各项最高次幂的次数。

3.多项式的系数: 多项式中各项中未知数的系数。

4.零多项式: 所有系数均为0的多项式。

5.常数项: 多项式中次数为0的项,即常数项。

6.多项式的加法运算: 将两个多项式相同次项的系数相加。

7.多项式的减法运算: 将两个多项式相同次项的系数相减。

8.多项式的乘法运算: 将两个多项式的各项相乘,并根据指数相加合并同类项。

9.多项式的乘方运算: 将一个多项式自乘n次。

10.多项式的取余运算: 两个多项式相除后的余数部分。

11.多项式的求导运算: 对多项式中的每一项进行求导操作。

12.多项式的积分运算: 对多项式中的每一项进行积分操作。

13.多项式的复合运算: 将一个多项式代入另一个多项式中进行运算。

数据结构入门基础实验

数据结构入门基础实验

一、线性表——上机实验题1.实验目的:(1)掌握顺序表的基本操作的实现方法。

(2)应用顺序表的基本操作算法实现集合A=AUB算法。

(3)掌握链式线性表的基本操作的实现方法。

(4)利用链表的基本操作算法实现集合A=A∩B算法。

2.实验内容:2.1 编写一个程序algo1-1.cpp,实现顺序表的各种基本运算,并在此基础上设计一个主函数完成如下功能:(1)初始化顺序表L;(2)依次插入a,b,c,d,e元素;(3)输出顺序表L;(4)输出顺序表L长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第3个元素;(7)输出元素‘a’的位置;(8)在第4个元素位置上插入‘f’元素;(9)输出顺序表L;(10)删除L的第3个元素;(11)输出顺序表L;(12)释放顺序表L。

2.2编写一个程序algo1-2.cpp,可利用以上基本操作算法,实现A=AUB算法。

2.3编写一个程序algo1-3.cpp,实现单链表的各种基本运算,并在此基础上设计一个主程序exp1-2.cpp完成如下功能:(1)初始化单链表H;(2)依次插入a,b,c,d,e元素;(3)输出单链表H;(4)输出单链表H长度;(5)判断单链表H是否为空;(6)输出单链表H的第3个元素;(7)输出元素‘a’的位置;(8)在第4个元素位置上插入‘f’元素;(9)输出单链表H;(10)删除H的第3个元素;(11)输出单链表H;(12)释放单链表H。

2.4 编写一个程序algo1-4.cpp,可利用以上基本操作算法,实现递增有序的两个单链表A、B的交集运算A=A∩B。

二、栈和队列——上机实验题1.实验目的:(1)掌握顺序栈和链栈的各种基本运算(2)掌握循环队列的各种基本运算(3)利用栈先进后出的特点,解决一些实际问题。

2.实验内容:2.1编写一个程序algo2-1.cpp,实现顺序栈的各种基本运算,并在此基础上设计一个主函数完成如下功能:(1)初始化顺序栈S;(2)判断栈S是否非空;(3)依次进栈元素a,b,c,d,e;(4)判断栈S是否非空;(5)输出栈的长度;(6)输出从栈顶到栈底元素;(7)元素出栈,输出出栈序列;(8)判断栈S是否非空;(9)释放栈。

数据结构课程设计——一元多项式计算

数据结构课程设计——一元多项式计算

数据结构课程设计——一元多项式计算一、课程设计题目及要求二、设计思路和方法三、程序流程图四、程序代码及注释五、测试结果及分析六、结论七、参考文献本次课程设计的题目为“一元多项式计算”,要求设计一个程序,能够实现一元多项式的加、减、乘、求导和求值等操作。

在设计思路和方法上,我们采用了链表的数据结构来存储多项式,同时设计了相应的函数来实现各种操作。

程序的流程图如下所示:插入流程图)程序的代码及注释如下所示:插入代码及注释)在测试结果及分析方面,我们对程序进行了多组测试,并对其进行了详细的分析和比较。

结果表明,我们的程序能够正确地实现各种操作,并且具有较高的效率和稳定性。

综上所述,本次课程设计的目标已经得到了圆满地实现,我们对于所取得的成果感到非常满意。

同时,我们也希望能够通过这次课程设计,加深对于数据结构及其应用的理解和掌握,为今后的研究和工作打下坚实的基础。

设计目标:本课程设计旨在结合理论与实际应用,提高学生组织数据及编写大型程序的能力。

通过掌握数据组织、算法设计和算法性能分析的方法,培养学生良好的程序设计能力。

具体实现是利用单链表表示一元多项式,实现多项式的输入、建立、输出、相加、相减和相乘。

总体设计:2.1 数据结构描述与定义:一元多项式定义系数和指数结构如下:coef,expn和next。

定义多项式的结构为线性链表的存储结构,每个结点包含三个元素:系数coef,指数expn和指向下一个结点的指针*next。

多个单项式通过指针连接起来,形成一个多项式。

2.2 模块设计:从实现多项式运算过程的角度来分析,至少需要以下子功能模块:多项式创建、销毁、输出、相加、相减和相乘。

定义并调用的函数有:Insert、CreatePolyn、DestroyPolyn、PrintPolyn、AddPolyn、SubtractPolyn、XXX和main函数。

注:该文章中没有明显的格式错误和需要删除的段落,因此没有进行小幅度改写。

数据结构_用堆栈知识实现简单的多项式计算问题

数据结构_用堆栈知识实现简单的多项式计算问题
三程序源代码:
/*jisuanqi_head.h*/
/*2012年4月15日
made by liuhui*/
#define MAX 1000
struct save1
{
float n[MAX];
int top;
}stack1;
structsave2
{
char n[MAX];
int top;
}stack2;
说明几个函数:
bool stackempty(save1 s)用来判断操作数栈s是否为空。
void push(save1 &s,char e)若栈满则输出“栈已满”,否则将元素e入栈
void pop(save1 &s, char &e)若栈为空则输出“栈为空”,否则将栈顶元素赋给e
bool stackempty2(save2 s)用来判断运算符栈s是否为空。
{
cout<<"栈已满"<<endl;
return ;
}
s.top++;
s.n[s.top]=e;
}
void push2(save2 &s,char e)//将e入栈
{
if(s.top==MAX-1)
{
cout<<"栈已满"<<endl;
void pop(save1 &s,float &e);//将栈顶元素出栈,存到e中
void pop2(save2 &s,char &e);//将栈顶元素出栈,存到e中
int in(char e);//e在栈内的优先级别
int out(char e);//e在栈外的优先级别

数据结构一元多项式的运算

数据结构一元多项式的运算

数据结构一元多项式的运算第一章引言在计算机科学中,数据结构是研究非原子数据对象的组织、存储和管理的科学和技术。

一元多项式是代数中的基本概念之一,它在计算机科学中有着广泛的应用。

本文将介绍一元多项式的运算,包括多项式的表示、加法、减法、乘法等操作。

第二章多项式的表示1.稀疏数组表示法稀疏数组表示法是一种常用的多项式表示方法。

它通过一个数组来存储多项式中非零项的指数和系数。

数组的下标表示项的指数,数组元素表示项的系数。

对于没有出现的指数,数组元素为零。

2.链表表示法链表表示法是另一种常用的多项式表示方法。

每个节点包含项的指数和系数,并通过指针串接成链表。

链表的节点可以按照指数的升序或降序排列。

第三章多项式的加法多项式的加法是指将两个多项式相加得到一个新的多项式。

具体操作如下:1.根据多项式的表示方法,分别遍历两个多项式的非零项。

2.比较当前项的指数大小,如果两个指数相等,则将系数相加得到新的系数,并将结果加入结果多项式中。

3.如果一个多项式的指数大于另一个多项式的指数,则将该项加入结果多项式中。

4.重复以上操作,直到遍历完所有的非零项。

第四章多项式的减法多项式的减法是指将两个多项式相减得到一个新的多项式。

具体操作如下:1.根据多项式的表示方法,分别遍历被减数和减数的非零项。

2.比较当前项的指数大小,如果两个指数相等,则将被减数的系数减去减数的系数得到新的系数,并将结果加入结果多项式中。

3.如果被减数的指数大于减数的指数,则将该项加入结果多项式中,并将被减数的系数变为相反数。

4.重复以上操作,直到遍历完所有的非零项。

第五章多项式的乘法多项式的乘法是指将两个多项式相乘得到一个新的多项式。

具体操作如下:1.创建一个结果多项式,将其初始化为零多项式。

2.根据多项式的表示方法,分别遍历两个多项式的非零项。

3.将两个项的系数相乘得到新的系数,并将两个项的指数相加得到新的指数。

4.将新的系数和指数合并为一个项,并将该项加入结果多项式中。

多项式的四则运算

多项式的四则运算

摘要在算法程序的设计与编写过程中,根据对本题的要求分析,结合设计对象的特点,实现一元多项式的加、减、乘、除以及对多项式求导、求值的相关计算。

根据一元多项式的结构特点和运算规则。

本程序中采用了链表的存储与实现,采用链表可以很方便的对其中的结点进行插入、删除等操作。

通过链表的合并即可完成多项式的四则运算。

1 引言:1.1 待处理问题的问题背景:本题要求对从键盘上输入的任意两个一元多项式,能够分别对每个多项式进行降幂排序并输出,实现对这两个多项式的加、减、乘、除等相关运算。

在具体实现时,可采用链式存储结构将多项式中的每一项连接起来,从而表达出整个多项式,其中每一项是一个一元多项式,通过每一项系数与指数的输入设定,可以实现对整个多项式的设定,再通过建立单链表,结点来存储每一项的系数与指数,通过链表完成多项式的存储,对每个多项式分别建立一个链表,通过链表的加减乘除运算规则实现连标的合并,最终得到计算结果。

2需要完成的任务:根据题目要求,本程序需要实现对两个一元多项式的四则运算以及对多项式进行赋值求值运算、求导运算等相关计算,要求正确输出运算结果,对不满足输入要求的数据有一定的反应。

3设计:3.1核心算法的设计与说明:3.1.1 一元多项式的定义:有多个单项式的代数和就构成了多项式,一元多项式就是只含有一个变元的多项式。

所以由定义可知有n个单项式组成的一元多项式来说,它的运算是满足交换率的,所以可进行降幂排序,只需将它的所有指数相比较,然后将指数大的放前面,小的放后面即可完成排序。

3.1.2本题的核心算法:首先调用建表函数,CreatePolyn建立两个一元多项式,然后对两个一元多项式进行降幂排序,该过程的实现主要由insert()函数实现,然后调用相应的计算函数: 加(AddPolyn)、减(SubtractPolyn)、(MultiplyPolyn)、除(DevicePolyn)、导数(Derivative)、求值(ValuePolyn)。

数据结构 多项式的表示和实现方法

数据结构 多项式的表示和实现方法

数据结构多项式的表示和实现方法摘要:1.多项式的基本概念2.多项式的表示方法a.系数矩阵表示b.字符串表示c.列表表示3.多项式的基本操作a.加法b.减法c.乘法d.除法4.多项式的实现方法a.递归实现b.循环实现c.迭代实现5.多项式的应用场景a.数值计算b.符号计算c.算法设计分析6.多项式的优缺点分析7.总结与展望正文:一、多项式的基本概念多项式作为数学中的重要概念,广泛应用于各个领域。

它是由一系列项组成的代数式,其中每个项包含一个常数系数和一个或多个变量,这些变量之间的运算符为加法或减法。

多项式的项按照幂次从高到低排列,同一幂次的项按照系数从大到小排列。

二、多项式的表示方法1.系数矩阵表示:将多项式的系数组成一个矩阵,其中行表示多项式的次数,列表示多项式的项数。

例如,二次多项式f(x)=ax+bx+c可以表示为:| a b c || 0 1 0 |2.字符串表示:将多项式的各项用字符串表示,如f(x)=ax+bx+c可以表示为"a*x+b*x+c"。

3.列表表示:将多项式的各项用列表表示,如[a, b, c, 0]。

三、多项式的基本操作1.加法:将两个多项式对应的项相加,保持幂次不变,系数相加。

2.减法:将两个多项式对应的项相减,保持幂次不变,系数相减。

3.乘法:将两个多项式按照乘法法则相乘,得到一个新的多项式。

4.除法:将一个多项式除以另一个多项式,得到一个新的多项式。

四、多项式的实现方法1.递归实现:利用多项式的定义,将多项式分解为单项式,然后通过递归实现加法、减法、乘法和除法。

2.循环实现:利用循环结构,如for循环或while循环,遍历多项式的各项,实现加法、减法、乘法和除法。

3.迭代实现:利用迭代器,如ListIterator,遍历多项式的各项,实现加法、减法、乘法和除法。

五、多项式的应用场景1.数值计算:多项式在数值计算中具有重要作用,如求解线性方程组、非线性方程组和微分方程等。

数据结构上机实验指导书

数据结构上机实验指导书

计算机系第一部分数据结构课程实验概述一.实验目的《数据结构》是计算机专业的主干课程和必修课程之一,其目的是让大家学习、分析和研究数据对象特征,掌握数据组织方法和计算机的表示方法,以便选择合适的数据逻辑结构和存储结构,设计相应的运算操作,把现实世界中的问题转化为计算机内部的表示与处理的方法,要求掌握算法的时间、空间复杂度分析基本技术,培养良好的程序设计风格,掌握进行复杂程序设计的技能。

在计算机科学领域,尤其是在系统软件和应用软件的设计和应用中要用到各种数据结构,因此,掌握数据结构对提高软件设计和程序编制水平有很大的帮助。

二.实验要求2.1实验步骤设计步骤的规范不但可以培养学生科学的工作方法和作风,而且还能有效地减少错误,提高工作效率。

因此必须严格执行良好的实验步骤规范(包括上机操作规范)。

本课程实验的基本步骤是:2.1.1问题分析充分地分析和理解问题本身,明确问题要求做什么。

对问题的描述应避开算法和所涉及的数据类型,而是对所需完成的任务作出明确的回答。

例如;输入、输出数据的类型、值的范围以及形式等。

同时为调试程序准备好测试数据,包含合法的输入数据和非法形式输入的数据。

2.1.2设计和编码设计即是对问题描述中涉及的操作对象定义相应的数据类型,定义主程序模块和各抽象数据类型;定义相应的存储结构并写出各过程和函数的伪码算法。

在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试。

编码即把详细设计的结果进一步求精为程序设计语言程序,写出源程序。

对程序中的疑问应作出记号,以便上机时注意解决。

每个明确的功能模块程序一般不超过60行,程序的每一行不得超过60个字符,否则要进一步划分。

2.1.3上机前程序静态检查上机前程序静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。

静态检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑。

把程序中的明显错误事先排除。

数据结构多项式相加实验报告

数据结构多项式相加实验报告

试验一多项式相加一. 实验内容:多项式相加二.实验目的和要求:利用双向链表实现通讯录的建立、删除、检索和列表,并可保存至文件,可重新装入。

用链式存储结构实现一元多项式的相加运算。

三.算法思想描述:1. 以单链表为存储结构插入多项式: 多项式输入:多项式按幂从高到低,以“系数,幂”的格式输入,并以“0,0”结束。

printf("Please input coef:");scanf("%d",&i);printf("Please input exp: ");scanf("%d",&j);while(i!=0){q=(pnode)malloc(sizeof(struct node));q->coef=i;q->exp=j;p->link=q;p=q;printf("Please input coef:");scanf("%d",&i);printf("Please input exp: ");scanf("%d",&j);}p->link=NULL;2. 多项式相加单链表合并:由两个多项式对应的单链表头节点开始,依次扫描各节点。

(1)若两表的节点均非空:比较二者的幂,按幂大者先入表。

如果幂相等,则系数相加再入表。

具体由以下代码实现:while(p!=NULL && q!=NULL){if(p->exp==q->exp){x=p->coef+q->coef;if(x!=0){s=(pnode)malloc(sizeof(struct node));s->coef=x;s->exp=p->exp;r->link=s;r=s;}p=p->link;q=q->link;}else if(p->exp<q->exp){s=(pnode)malloc(sizeof(struct node));s->coef=q->coef;s->exp=q->exp;r->link=s;r=s;q=q->link;}else{s=(pnode)malloc(sizeof(struct node));s->coef=p->coef;s->exp=p->exp;r->link=s;r=s;p=p->link;}(2). 若有一链表已空,则将非空链表插入新表:while(p!=NULL){s=(pnode)malloc(sizeof(struct node));s->coef=p->coef;s->exp=p->exp;r->link=s;r=s;p=p->link;}while(q!=NULL){s=(pnode)malloc(sizeof(struct node));s->coef=q->coef;s->exp=q->exp;r->link=s;r=s;q=q->link;}3. 输出合并后的链表:while(head->link!=NULL){head=head->link;printf(" %d*x^%d",head->coef,head->exp);}4. 主函数调用,完成多项式相加。

数据结构--线性表的基本运算及多项式的算术运算

数据结构--线性表的基本运算及多项式的算术运算

数据结构:线性表的基本运算及多项式的算术运算一、实验目的和要求实现顺序表和单链表的基本运算,多项式的加法和乘法算术运算。

要求:能够正确演示线性表的查找、插入、删除运算。

实现多项式的加法和乘法运算操作。

二、实验环境(实验设备)X64架构计算机一台,Windows 7操作系统,IDE: Dev C++ 5.11编译器: gcc 4.9.2 64bit二、实验原理及内容程序一:实现顺序表和单链表的实现本程序包含了四个文件,分别是LinearListMain.cpp,linearlist.h,seqlist.h,singlelist.h。

分别是主程序,线性表抽象类,顺序储存线性表的实现,链表储存顺序表的实现。

文件之间的关系图:本程序一共包含了三个类:分别是LinearList(线性表抽象类),SeqList(顺序储存的线性表),SingleList(链表储存的线性表)。

类与类之间的关系图如下:其实,抽象类LinearList规定了公共接口。

分别派生了SeqList类和SingleList。

SingleList类与SingleList类分别实现了LinearList类中的所有接口。

程序代码以及分析:Linearlist类:#include <iostream>using namespace std;template <class T>class LinearList{protected:int n; //线性表的长度public:virtual bool IsEmpty() const=0; //判读是否是空线性表virtual int Length() const=0; //返回长度virtual bool Find(int i,T& x) const=0; //将下标为i的元素储存在x中,成功返回true,否则返回falsevirtual int Search(T x) const=0; //寻找值是x的元素,找到返回true,否则返回falsevirtual bool Insert(int i,T x)=0; //在下标为i的元素后面插入xvirtual bool Delete(int i)=0; //删除下标为i的元素virtual bool Update(int i,T x)=0;//将下标为i的元素更新为x virtual void Output(ostream& out)const=0; //将线性表送至输出流};包含了一个保护数据成员n,和8种运算,具体说明见注释。

数据结构上机考试(含答案)

数据结构上机考试(含答案)

《数据结构》上机练习题1、设有两个有序序列,利用归并排序将它们排成有序表,并输出。

2、设有一有序序列,从键盘输入一个数,判别是否在序列中,如果在输出“YSE”;否则,将它插入到序列中使它仍然有序,并输出排序后的序列。

3、设有一有序序列,从键盘输入一个数,判别是否在序列中,如果不在,则输出“NO”,否则,将它从序列中删除它,并输出删除后的序列。

4、从键盘输入一组任意数据,建立一个有序链表,并从链头开始输出该链,使输出结果是有序的。

5、从键盘输入一组任意数据,建立一个包含所有输入数据的单向循环链表,并从链表的任意开始,依次输出该链表中的所有结点。

10、设有一个链表,(自己建立,数据从键盘输入),再从键盘输入一个数,判别是否在链表中,如果不在,则输出“NO“,否则,将它从链表中删除,并输出删除后的链表。

11、设有一个链表,(自己建立,数据从键盘输入),再从键盘输入一个数,判别是否在链表中,如果在输出“YSE”,否则,将它从插入到链头,并输出插入后的链表。

12、设有一个链表,(自己建立,数据从键盘输入),再从键盘输入一个数,判别是否在链表中,如果在输出“YSE”,否则,将它从插入到链尾,并输出插入后的链表。

13、编写栈的压栈push、弹栈pop函数,从键盘输入一组数据,逐个元素压入堆栈,然后再逐个从栈中弹出它们并输出。

14、编写栈的压栈push、弹栈pop函数,用它判别()的匹配问题。

15、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树中序遍历的结果。

16、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树先序遍历的结果。

17、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树后序遍历的结果。

18、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树的总结点数。

19、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树叶子结点数。

数据结构 多项式乘法

数据结构 多项式乘法

数据结构多项式乘法数据结构之多项式乘法
⒈引言
⒉基本概念
⑴多项式及其表示
⑵多项式的系数与次数
⑶多项式相乘的定义
⒊多项式乘法算法
⑴暴力法
⑵ Karatsuba算法
⑶快速傅里叶变换法
⒋算法实现及优化
⑴暴力法的实现
⑵ Karatsuba算法的实现
⑶快速傅里叶变换法的实现
⑷优化方案
⒌实验及性能评估
⑴实验设计
⑵实验结果及分析
⑶算法性能比较
⒍应用场景与案例
⑴多项式求解问题
⑵数据压缩与编码
⑶计算机图形学中的应用⒎实际应用中的注意事项
⑴数据规模与性能的平衡
⑵浮点数运算的精度问题⒏结论与展望
⑴本文的主要贡献
⑵未来工作的方向
⒐附件
⑴代码实现
⑵实验数据
⑶相关论文
⒑法律名词及注释
⑴版权法
⑵计算机软件保护相关法规
⑶专利法和专利申请程序
⑷商标法
附件:
⒈代码实现:包括暴力法、Karatsuba算法和快速傅里叶变换法的多项式乘法实现代码。

⒉实验数据:包含了多种数据规模下的实验数据,用于验证算法的正确性和性能。

⒊相关论文:列出了本文涉及到的相关论文及其或引用信息。

法律名词及注释:
⒈版权法:指保护原创作品的法律法规,包括著作权和相关权益的保护。

⒉计算机软件保护相关法规:指保护计算机软件的法律法规,包括软件著作权法等。

⒊专利法和专利申请程序:指保护发明创造的专利法律法规,包括专利的申请、审查、授权和实施等。

⒋商标法:指保护商标的法律法规,包括商标的注册、使用和保护等。

数据结构多项式求和

数据结构多项式求和

数据结构多项式求和多项式求和是数据结构中的一个重要问题,其中给定一个多项式,我们需要计算它的和。

在本文中,我们将讨论多项式求和的算法和数据结构。

多项式是一个数学表达式,由一系列项组成,每个项由一个系数和一个指数组成。

例如,多项式3x^2 + 2x + 1由三个项组成,分别是3x^2、2x和1。

在多项式求和问题中,我们需要计算给定多项式的所有项的总和。

为了解决多项式求和问题,我们可以使用两种主要的数据结构:链表和数组。

这两种数据结构都可以用来表示多项式,并且具有不同的优势和劣势。

链表是一种动态数据结构,可以方便地插入和删除元素。

在链表中,每个节点包含一个项的系数和指数,并且通过指针连接到下一个节点。

通过遍历链表,我们可以计算多项式的总和。

链表的一个主要优点是它可以适应多项式的大小变化,但它的缺点是访问指定位置的项的效率较低。

数组是一种静态数据结构,具有固定大小。

在数组中,每个元素存储一个项的系数和指数。

通过遍历数组,我们可以计算多项式的总和。

数组的一个主要优点是它可以提供快速的随机访问,但它的缺点是它的大小是固定的,无法适应多项式的大小变化。

基于链表的多项式求和算法如下:1. 创建一个空链表来存储多项式的和。

2. 遍历第一个多项式的链表。

3. 将每个项的系数和指数与第二个多项式的链表中的对应项相加。

4. 将结果项插入和链表中。

5. 遍历第二个多项式的链表,将未处理的项插入和链表中。

6. 返回和链表。

基于数组的多项式求和算法如下:1. 创建一个空数组来存储多项式的和。

2. 遍历第一个多项式的数组。

3. 将每个项的系数和指数与第二个多项式的数组中的对应项相加。

4. 将结果项存储在和数组的对应位置。

5. 遍历第二个多项式的数组,将未处理的项存储在和数组的对应位置。

6. 返回和数组。

无论使用链表还是数组,多项式求和的时间复杂度都是O(n),其中n是多项式的项数。

但是,链表的空间复杂度是O(n),而数组的空间复杂度是O(k),其中k是多项式的最高指数。

数据结构多项式求和

数据结构多项式求和

数据结构多项式求和在计算机科学和数学领域中,数据结构的运用无处不在,而多项式求和就是一个典型的应用场景。

让我们一起来深入探讨一下这个有趣且重要的主题。

首先,我们需要明确什么是多项式。

简单来说,多项式就是由变量和系数组成的表达式。

比如,3x²+ 2x 1 就是一个多项式,其中 3 、2 、-1 是系数,x 是变量,²是指数。

那么为什么要对多项式进行求和呢?这在很多实际问题中都有应用。

比如在物理学中,描述某些运动规律时会用到多项式;在工程学中,对信号的处理和建模也可能涉及到多项式求和。

接下来,我们看看如何用数据结构来表示多项式。

常见的数据结构有数组和链表。

用数组来表示多项式时,我们可以将系数存储在数组中。

假设一个多项式的最高次幂为n ,那么我们可以创建一个长度为n +1 的数组,数组的下标对应多项式的幂次,数组元素的值就是对应的系数。

这种表示方法简单直观,但是如果多项式的次数很高,而很多项的系数为0 ,就会浪费很多存储空间。

相比之下,链表是一种更灵活的数据结构。

每个节点可以存储系数、指数和指向下一个节点的指针。

这样,只有非零项才会被存储,节省了存储空间。

有了表示多项式的数据结构,接下来就是实现求和的算法。

对于用数组表示的多项式求和,我们需要从最高次幂开始,将对应幂次的系数相加。

如果相加后的系数为 0 ,那么在最终的结果中可以省略这一项。

而对于链表表示的多项式求和,我们需要遍历两个链表,找到相同幂次的项进行系数相加。

如果一个链表遍历完了,而另一个链表还有剩余项,直接将剩余项添加到结果链表中。

在实际编程中,还需要考虑一些特殊情况。

比如,如果两个多项式的最高次幂不同,那么在求和时要注意补齐。

另外,算法的效率也是我们需要关注的重点。

在选择数据结构和算法时,要根据具体的应用场景和需求来权衡空间复杂度和时间复杂度。

例如,如果多项式的操作频繁,而对空间要求不是很严格,那么使用数组可能更合适;如果多项式的项数不固定,而且有很多零系数项,链表可能是更好的选择。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档