数据结构 实验报告 线性表及其应用(多项式相加、相乘)等

数据结构 实验报告 线性表及其应用(多项式相加、相乘)等
数据结构 实验报告 线性表及其应用(多项式相加、相乘)等

实验一线性表及其应用

一、实验目的和要求

1、掌握线性表的插入、删除、查找等基本操作设计与实现

2、学习利用线性表提供的接口去求解实际问题

3、熟悉线性表的的存储方法

二、实验内容和原理

1、实验内容:设计一个一元多项式的简单计算器,其基本功能有①输入并建立多项式;②输出多项式;③多项式相加。可利用单链表或单循环链表实现之。

2、实验原理:以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式中某一项的系数和指数,建立单链表时指数高的结点列于指数低的结点之后,即线性表的元素按指数递增有序排列。

三、实验环境

Visual C++ 6.0 及PC机

四、算法描述及实验步骤

思想算法:

以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式中某一项的系数和指数,建立单链表时指数高的结点列于指数低的结点之后,即线性表的元素按指数递增有序排列。

例如构造两个多项式ha: 5X3+4X2+3X+2

hb: X2+X+1

多项式加法:定义指针p,q分别指向ha,hb

i.p->exp==q->exp ,r->coef=p->coef+q->coef,pa,pb下移;

ii.p->expexp ,r->coef=q->coef;r->exp=q->exp;,q下移

iii.pa->exp>pb->exp, r->exp=p->exp;r->coef=p->coef;,p下移

iv.p!=NULL,pb==NULL.相当于iii.

V.q==NULL,pb!=NULL.相当于ii.

其流程图如下:

多项式乘法:定义指针fp,gp分别指向f,g

1.将两多项式最大指数相加并赋于maxp,并置g

2.用for循环求指数等于maxp时相乘的系数

3. (fp!=NULL)&&(gp!=NULL), p=fp->exp+gp->exp

1.p>maxp, fp=fp->next;

2. pnext;

3.p=maxp, x+=fp->coef*gp->coef; fp=fp->next;gp=gp->next;

五、实验结果

1.分别输入两个多项式: 5X3+4X2+3X+2 和X2+X+1,然后输出结果如下:

2.分别输入两个多项式:6X4+4X2+2和5X+6,然后输出结果如下:

六、总结

此次上机实验应用了线性表实现了一次实际操作,完成了一个一元多项式的简单计算器,不仅对此次编译程序的算法思想有了新的认识,还让我深刻的体会到了线性表的重要性以及其应用的方便,并且对指针加深了映象,应用了书本中的算法思想,对我以后的编译以及完成新的程序有很大的帮助。

附录:

1.建立多项式列表代码如下:

mulpoly *creatpoly()/*建立多项式列表*/

{mulpoly *head,*r,*s;/*设中间变量*/

int m,n;

head=(mulpoly *)malloc(sizeof(mulpoly));/*头结点申请空间*/

printf("\ninput coef and exp:\n");

scanf("%d%d",&n,&m);/*输入多项式系数和指数*/

r=head;/*尾指针指向头指针*/

while(n!=0)/*将输入的多项式存放在S中*/

{s=(mulpoly*)malloc(sizeof(mulpoly));

s->coef=n;

s->exp=m;

r->next=s;

r=s;

/*printf("input coef and exp:\n");*/

scanf("%d%d",&n,&m);/*再次输入多项式系数和指数*/

}

r->next=NULL;/*将尾指针置空*/

head=head->next;/*将head哑结点向前跑一个结点,使其不为空*/ return (head);/*返回多项式*/

}

2.两个多项式相加代码如下:

mulpoly *polyadd(mulpoly *ha,mulpoly *hb)/*两个多项式相加*/

{mulpoly *hc,*p,*q,*s,*r;/*声明结构体型*/

int x;

p=ha;

q=hb;

hc=(mulpoly *)malloc(sizeof(mulpoly));/*申请结点空间*/

s=hc;

while((p!=NULL)&&(q!=NULL))/*两多项式不为空*/

if(p->exp==q->exp)/*指数相等*/

{x=p->coef+q->coef;/*系数相加*/

if(x!=0)/*系数不为零*/

{r=(mulpoly*)malloc(sizeof(mulpoly));/*结果放r中存放*/

r->exp=q->exp;

r->coef=x;

s->next=r;

s=r;

}

p=p->next;/*多项式前进一项*/

q=q->next;/*多项式前进一项*/

}

else if(p->expexp)/*比较指数大小*/

{r=(mulpoly *)malloc(sizeof(mulpoly));

r->coef=q->coef;

r->exp=q->exp;

s->next=r;

s=r;

q=q->next;

}

else

{r=(mulpoly *)malloc(sizeof(mulpoly));

r->exp=p->exp;

r->coef=p->coef;

s->next=r;

s=r;

p=p->next;

}

while(p!=NULL)/*当多项式p中不为空时照抄*/

{r=(mulpoly *)malloc(sizeof(mulpoly));

r->exp=p->exp;

r->coef=p->coef;

s->next=r;

s=r;

p=p->next;

}

while(q!=NULL)/*当多项式q中不为空时照抄*/

{r=(mulpoly *)malloc(sizeof(mulpoly));

r->exp=q->exp;

r->coef=q->coef;

s->next=r;

s=r;

q=q->next;/*将最终尾指针置空*/

}

s->next=NULL;

r=hc;

hc=hc->next;

free(r);/*释放r*/

return(hc);/*返回结果*/

}

3.两个多项式相乘代码如下:

mulpoly*polymulti(mulpoly *f,mulpoly *g) /*两个多项式相乘*/

{mulpoly *fp,*gp,*hp,*q,*h;

int maxp,p,r,x;

mulpoly *reverse(mulpoly *q);/*函数声明*/

maxp=f->exp+g->exp;/*将两多项式最大指数相加并赋于maxp*/

h=(mulpoly *)malloc(sizeof(mulpoly));

hp=h;

g=reverse(g);/*逆置g*/

for(r=maxp;r>=0;r--)/*循环求指数等于r时相乘的系数*/

{x=0;/*设x初始值为0*/

fp=f;

gp=g;

while((fp!=NULL)&&(gp!=NULL))/*循环求相乘之后指数为r时的系数*/ {p=fp->exp+gp->exp;/*f的指数加上g逆置后的指数并给p*/

if(p>r)/*比较p,r*/

fp=fp->next;/*p大,fp到下一个结点,以确保p等于r*/

else

if(p

gp=gp->next;/*p小,gp到下一个结点,以确保p等于r*/

else/*p等于r*/

{x+=fp->coef*gp->coef;/*将相乘之后指数为r时的系数给x*/ fp=fp->next;

gp=gp->next;

}

}

if(abs(x)>1e-6)/*条件限制,使得所求多项式系数绝对值不能太小*/

{q=(mulpoly *)malloc(sizeof(mulpoly));

q->exp=r;

q->coef=x;

q->next=NULL;

hp->next=q;

hp=q;

}/*将所求结果给hp,h*/

}

hp=h;

h=h->next;/*将h的哑结点前进,使不为空*/

free(hp);/*释放hp*/

return h;/*返回结果*/

}

4.定义链表逆置函数

mulpoly *reverse(mulpoly *q)/*定义链表逆置函数*/

{mulpoly *p1,*p2;

if(q!=NULL)/*确保所要逆置多项式不为空*/

{p1=q->next;/*使p1指向下一个结点*/

q->next=NULL;/*将q->next为空*/

while(p1!=NULL)/*循环使相邻两个结点逆置,直到最后一个逆置为头结点*/

{p2=p1->next;

p1->next=q;

q=p1;

p1=p2;

}

}

return q;/*返回逆置结果*/

}

5.输出多项式代码如下:

void polyout(mulpoly *head) /*输出多项式*/

{mulpoly *q,*p;

/*p=head->next;*/

p=head;

while(p!=NULL)/*循环输出多项式的系数和指数*/

{printf("%dx%d ",p->coef,p->exp);

p=p->next;

}

printf("\n");

}

实验二哈弗曼树及哈弗曼编码译码的实现

一、实验目的和要求

1、掌握树的有关图相关操作算法;

2、熟悉树的基本存储方法;

3、学习利用树求解实际问题。

二、实验内容和原理

1、实验内容:(1)构造哈弗曼树;(2)对单个结点编码;(3)输出树;(4)编码;(5)译码。

2、实验原理:通过树的有关图的相关操作算法,以及树的基本存储方法,利用树来构造哈夫曼树及哈夫曼编码,输出哈夫曼树及哈夫曼编码,完成编码与译码的算法。

三、实验环境

Visual C++ 6.0 及PC机

四、算法描述及实验步骤

思想算法:

一棵有n个叶子结点的哈夫曼树有2n-1个结点,所以可用大小为2n-1个元素的数组构造静态链表来存储哈夫曼树,一个数组元素中存放一个结点。结点的结构可以这样来考虑,由于每个叶子结点都有一个权重,构造哈夫曼树的过程中每个分枝结点的权重等于两个孩子结点权重的和,所以应该有一个权重域和指向左右孩子的两个指针域;另外在建成哈夫曼树之后,为了求得每个叶子结点的哈夫曼编码,需要走一条从叶子结点到根结点的路径,而译码的过程是从根结点出发到叶子结点的不断匹配的过程,所以既需要知道孩子结点的信息,也需要知道双亲结点的信息,应该再有一个指向双亲结点的指针域。由此可知,每个结点至少应该有一个权重域weight和3个指针域parent,lchild和rchild,也是就是说,要用静态三叉链表来表示哈夫曼树。

由于在实际构造哈夫曼树时,是由叶子结点的权重逐级构造最后生成树根,且在构造过程中公与叶子结点的权重有关而与叶子结点的数据域外无关,所以构造算法的实现中可以不考虑叶子结点的数据域,并且在静态三叉链表中从叶子结点开始存放,然后不断地反两棵权重最小的子树合并成为一棵权值为其和的较大的子树,逐步生成各内部结点直到树根。

在建立哈夫曼树的算法描述中,有效地利用了每个结点的双亲域parent的值是否为了-1来区分该结点是否是哈夫曼森林中一棵树的根结点,每次是在根结点中找出两个权重值weight最小的树作为左右子树构造一棵更大的树。

求哈夫曼编码的方法是,在已建好的哈夫曼树中从每个叶子结点开始沿双亲链域回退到根结点,每回退一步走过哈夫曼树的一个分枝得到一位哈夫曼编码值,由于每个叶子结点的哈夫曼编码是从根结点到相应叶子结点的路径上各代码所组成的0,1序列,所以先得到的代码为所求编码的低位码而后得到的为高位码。对于每个叶子结点的哈夫曼编码可以考虑用一个一维数组bit从后向前依次保存所求得的各位编码值,并用start记住编码在数组bit中的开始位置。

如下面例子,有4个数2,4,5,8。将其构造成哈夫曼树。

算法设计分析

select(int t,int *s1,int *s2)函数用来实现选取最小和次最小的权重的下标,其流程图如下:

create_ht_hc()函数用来构造树和码,其流程图如下:

showtree(int root,int tab)为用凹入法显示树,其流程图如下:

showcode(int n)用来显示01代码,其流程图如下:

code2char(char t[],char s[])函数用来译码。

char2code(char s[],char t[])函数用来编码,其流程图如下:

五、实验结果

输入5个叶子结点a,s,d,f,g。其权重分别为7,13,16,4,10。得出结果如下:

六、总结

本次实验让我更加了解了哈夫曼树的构造和生成方法,以及如何用顺序存储结构来存储哈夫曼树及构树过程的信息,如何进行编码、译码。也感知到模块程序设计在大程序设计使用中的普遍性,该实验是最好的证明,通过模块程序设计,能够使得程序可度可写性明显加强。

通过本次实验,使我初步掌握了二叉树的结构特性以及各种存储的结构的特点及适用范围,掌握了哈夫曼树的定义和思想,以及哈夫曼编码的代码实现,初步掌握了用凹入法显示树。不过程序仍有树的显示部分不够完善的缺点,在今后的学习中会注意改变。

附录:

选择最小和次最小的权重函数如下:

void select(int t,int *s1,int *s2) /*在1……t之间选取w最小的下标s1,次最小的下标为s2*/

{ int i,w1,w2; /*最小的权重为w1,次最小的权重为w2*/

w1=w2=32767; /*初始化为无穷大*/

for(i=1;i<=t;i++)

if(ht[i].parent==0) /*选取最小的和次最小的*/

{ if(ht[i].w

{ w2=w1;*s2=*s1;w1=ht[i].w;*s1=i; }

else if(ht[i].w

w2,并记住其下标*/

{ w2=ht[i].w;*s2=i;}}}

构造哈夫曼树的代码如下:

void create_ht_hc() /*构造树和码*/

{ int i,s1,s2,child,parent,w;

char ch; cout<<"Please enter n: "; /*输入叶子数*/ cin>>n; m=2*n-1; /*总结点数*/

for(i=1;i<=n;i++) /*输入数据*/

{ cout<<"Please enter string: ";

fflush(stdin); /*清空键盘缓冲区*/

cin>>ch>>w; ht[i].w=w; /*把初始的数据送入存储空间*/

hc[i].ch=ch;}

for(i=n+1;i<=m;i++) /*建树*/

{ select(i-1,&s1,&s2); /*选取最小的和次最小的权重*/

ht[s1].parent=ht[s2].parent=i; /*把最小的和次最小的权连成树*/

ht[i].lch=s1; /*左孩子为最小的,右孩子为次最小的*/

ht[i].rch=s2;

ht[i].w=ht[s1].w+ht[s2].w; /*parent的权为孩子之和*/}

for(i=1;i<=n;i++) /*建码*/

{ child=i;

hc[i].start=0; /*初始化开始位置*/

while(child!=m) /*对叶子结点逐一求哈夫曼编码*/

{ parent=ht[child].parent;

if(child==ht[parent].rch) /*左0右1*/

hc[i].code[hc[i].start]=1;

else

hc[i].code[hc[i].start]=0;

hc[i].start++;

child=parent; /*从下往上编*/}}}

用凹入法显示树的代码如下:

void showtree(int root,int tab) /*凹入法显示树,tab为凹入的字符数*/ {if(root) /*如果树非空*/

{ int i;

for(i=1;i<=tab;i++) /*输出空格*/

cout<<" "; cout<

if(ht[root].lch==0) /*如果为叶子结点,则输出叶子结点*/

cout<<”(”<

//cout<

showtree(ht[root].lch,tab+3); showtree(ht[root].rch,tab+3);}} 显示各字母的代码:

void showcode(int n) /*显示01代码,从start-1开始输出*/

{ int i,j;

for(i=1;i<=n;i++)

{ cout<

for(j=hc[i].start-1;j>=0;j--)

cout<

对输入的字符进行编码:

void char2code(char s[],char t[]) /*编码,若s="abcd",则t="000110101"*/ { int i,j,k,x=0;

for(i=0;i

{ for(j=1;j<=n;j++) /*开始编码,把对应的字符变成相应的代码*/

if(s[i]==hc[j].ch)

for(k=hc[j].start-1;k>=0;k--)

t[x++]=hc[j].code[k]+48; /*把整型转换为字符型*/

} t[x]='\0'; /*字符串结束标志*/ }

对输入的数码进行译码:

void code2char(char t[],char s[]) /*译码,若t="000110101",则s="abcd"*/ /*用指针扫描t,从根m开始向下遇0向左,遇1向右,直到找到叶子结点,并输出再返回根,从头开始循环*/

{ int i=0,j=0,parent=m;//child;

while(s[i])

{ if(s[i]=='1') parent=ht[parent].rch;

else parent=ht[parent].lch;

if(ht[parent].lch==0)

{ t[j++]=hc[parent].ch;

parent=m; } i++; } t[j]='\0'; /*字符串结束标志*/ }

实验三Dijkstra最短路径或Prim最小生成树(二选一)

一、实验目的和要求

1、掌握图的有关图相关操作算法。

2、熟悉图的基本存储方法。

3、了解掌握图的基本术语。

二、实验内容和原理

实验内容:①通过输入起点、终点和权重构造一个图;②通过输入,将一个节点作为起点;③找到从起点到各个节点的最短路径;④输出图与及到各个节点的最短短径;

三、实验环境

Visual C++ 6.0 及PC机

四、算法描述及实验步骤

Prim算法是人连通网中的某一个顶点开始,以此作为生成树的初始状态,然后不断地网中的其他顶点添加到生成树上,直到最后一个顶点添加到生成树上

时得到最小生成树。

(1)从网中任一顶点开始,把该顶点包含生成树中,此时树只有一个顶点。

(2)找出一个端点在生成树中另一个端点在生成树外的所有边,并把权值最小的边连同它所关联的另一个顶点添加到生成树中;当有两条及以上具有相同最小权值的边可供选择时,选择其中任意一条都可以。

(3)反复执行(2),直到所有顶点都包含在生成树中时止。算法中由函数prim定义最小生成树。由函数creat_graph建立无向连通网。算法过程如下图:

建立无向连通网的流程图如下:定义最小生成树的代码如下:

五、实验结果

实验结果如下

六、总结

1). 通过这次实验,使我掌握了用prim算法构造最小生成树的思想。掌握了邻接矩阵的构造思想及其应用。

3).掌握图与网的基本概念和基本存储方法。

4). 掌握有向及无向连通图的概念及其应用。

5). 对编程有了更深的理解与掌握。

附录:

void creat_graph(graph *p) /*建立无向连通网*/

{int i,j,n ;

int v1,v2,w;/*定义两端点及其权值为整型*/

printf("vertex number of the graph:"); /*输入无向网的端点数*/

scanf("%d",&n);

p->vnum=n; for(i=1;i<=n;i++) /*初始化结构体中的元素*/ for(j=1;j<=n;j++)

if(i==j) /*对角线上的元素的权值为0*/

p->arcs[i][j]=0;

else /*非对角线上的元素的权值为MAX即99*/

p->arcs[i][j]=MAX;

do /*执行循环语句*/

{printf("edge(vertex1,vertex2,weight):"); /*输入两个端点及其权值*/ scanf("%d,%d,%d",&v1,&v2,&w);

if(v1>=1&&v1<=n&&v2>=1&&v2<=n)

{p->arcs[v1][v2]=w;

p->arcs[v2][v1]=w;

}

}while(!(v1==8||v2==8)); /*当v1,v2其中一个为8时循环终止*/ } int prim(graph G,int v, int tree[][8]) /*定义最小生成树*/

{int i,j,k,p,min,c; /*定义局部变量*/

int lowcost[m],closest[m];

for(i=1;i<=G.vnum;i++)

{closest[i]=v; /*填边在生成树一端的顶点序号*/

lowcost[i]=G.arcs[v][i];/*填边的权值*/ }

c=1; p=1;/*从v1开始构造最小生成树*/

for(i=1;i

for(j=1;j<=G.vnum;j++) /*选最小权值及对应顶点*/

if(lowcost[j]!=0&&lowcost[j]

{min=lowcost[j]; /*最小权值记在min中*/

k=j; /*把与边关联的生成树外的顶点序号记在k中*/

}

tree[p][1]=closest[k]; /*将所得值存入出发端点*/

tree[p][2]=k; /*将k存入另一个端点*/

tree[p][3]=min; /*存储两个端点的最小权值*/

p++; c+=min;

lowcost[k]=0;/*将顶点k加入生成树中*/

for(j=1;j<=G.vnum;j++)

if(G.arcs[k][j]!=0&&G.arcs[k][j]

{lowcost[j]=G.arcs[k][j]; /*修改权值域*/

closest[j]=k; } } return c; }

实验四(快速、堆、归并)排序算法的设计(三选一)

一、实验目的和要求

1、掌握常用的排序方法和各种排序方法的特点。

2、熟悉排序的基本概念。

二、实验内容和原理

1、输入一个数组长度随机的数组。

2、对数组中的各个元素进行排序。

三、实验环境

Visual C++6.0及PC机

四、算法描述及实验步骤

思想算法:

快速排序的算法思想是:有一组待排序的数组如{76,31,76,79,25,29,12,78},把每组第一个元素的排序码为基准进行分组,并采用从两端往中间收缩的方式为该基准元素找插入位置。以第一次分组为例,首先,将元素R[1]存人变量R[0]中,引人变量i(初始值为1)和j(初始值为n),然后,比较R[0]和R[j]的排序码,若R[j]]的排序码较大,则j减l,继续比较R[0]和R[j];若R[0]的排序码较小,则将R[j]存人R[i]中,在i加l后,转而比较R[0]和R[i]的排序码;若R[i]的排序码较小,则i加1,继续比较R[0]和R[i];若R[i]的排序码较大,则将R[i]存人R[j]中,在j减l后,转而比较R[0]和R[j]。如此交替进行下去,直至i=j 时,将R[0]存人R[j]中,一次分组过程便告结束。

图8,7所示的是对8个元素进行一次分组的过程,其中花括号指出待分组的区间。

R[0] R[1] R[2] R[3] R[4] R[5] R[6] R[7] R[8]

{76,31,76,79,25,29,12,78}

76 {口,31,76,79,25,29,12,78}

i j

{口,31,76,79,25,29,12,78}

i j

{12,31,76,79,25,29,口,78}

i j

{12,31,76,79,25,29,口,78}

C语言数据结构线性表的基本操作实验报告

实验一线性表的基本操作 一、实验目的与基本要求 1.掌握数据结构中的一些基本概念。数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。 2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。 3.掌握顺序表和链表的基本操作:插入、删除、查找以及表的合并等运算。4.掌握运用C语言上机调试线性表的基本方法。 二、实验条件 1.硬件:一台微机 2.软件:操作系统和C语言系统 三、实验方法 确定存储结构后,上机调试实现线性表的基本运算。 四、实验内容 1.建立顺序表,基本操作包括:初始化,建立一个顺序存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。 2.建立单链表,基本操作包括:初始化,建立一个链式存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。 3.假设有两个按数据元素值非递减有序排列的线性表A和B,均以顺序表作为存储结构。编写算法将A表和B表归并成一个按元素值非递增有序(允许值相同)排列的线性表C。(可以利用将B中元素插入A中,或新建C表)4.假设有两个按数据元素值非递减有序排列的线性表A和B,均以单链表作为存储结构。编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C。 五、附源程序及算法程序流程图 1.源程序 (1)源程序(实验要求1和3) #include #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct arr {

数据结构实验多项式加法

数据结构实验报告 实验名称:多项式加减法 学号:1200310419 姓名:林强 实验日期:2015.5.05 一、实验目的 通过实现多项式的加减法,对链表有更深入的了解 二、实验具体内容 1、实验题目1: (1)题目设计一个一元稀疏多项式简单的加减法计算器 实现要求: 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式: 85 17 A+ x + x =; + 3 9 x 7 ) (x 79 8 x B- + = x 22 8 x ) (x (2)输出多项式 (3)多项式A和B相加,建立多项式C=A+B,并输出相加的结果多项式C (4)选作:多项式A和B相减,建立多项式C=A-B,并输出相加的结果多项式D (2)分析 1:本程序的任务是实现两个多项式的加法其中多项式的系数为浮点型, 指数为整数,输出的结果也为系数和指数。 (1)输入的形式和输入值的范围: 输入多项式的系数a和未知数X的指数b,当a和b都为零时,输入结束。输入值的范围:a为实数,b为整数。 (2)输出形式:输出多项式的系数和多项式未知数X的指数即(a,b)形式。 (3)程序所能达到的功能,实现两个多项式的加法,并输出最后的结果 2: 整个程序运行期间实行动态创建节点,一边输入数据, 一边创建节点当将全部数据输入到单链表中后再调用多项式加法这 个函数,并一边实现多项式的相加,一边释放节点,有效防止了 在程序反复运行过程中可能出现系统空间不够分配的现象 (3)实验代码 typedef int Status; #define OVERFLOW -1 #define null 0 typedef struct Lnode{

数据结构试题及答案

数据结构试题 一、单选题 1、在数据结构的讨论中把数据结构从逻辑上分为(C ) A 内部结构与外部结构 B 静态结构与动态结构 C 线性结构与非线性结构 D 紧凑结构与非紧凑结构。 2、采用线性链表表示一个向量时,要求占用的存储空间地址(D ) A 必须是连续的 B 部分地址必须是连续的 C 一定是不连续的 D 可连续可不连续 3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为( D )。 A n B n/2 C (n-1)/2 D (n+1)/2 4、在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点s,则执行( D )。 A s→link = p→link;p→link = s; B p→link = s; s→link = q; C p→link = s→link;s→link = p; D q→link = s;s→link = p; 5、如果想在4092个数据中只需要选择其中最小的5个,采用( C )方法最好。 A 起泡排序 B 堆排序 C 锦标赛排序 D 快速排序 6、设有两个串t和p,求p在t中首次出现的位置的运算叫做( B )。 A 求子串 B 模式匹配 C 串替换 D 串连接 7、在数组A中,每一个数组元素A[i][j]占用3个存储字,行下标i从1到8,列下标j从1到10。所有数组元素相继存放于一个连续的存储空间中,则存放

该数组至少需要的存储字数是( C )。 A 80 B 100 C 240 D 270 8、将一个递归算法改为对应的非递归算法时,通常需要使用( A )。 A 栈 B 队列 C 循环队列 D 优先队列 9、一个队列的进队列顺序是1, 2, 3, 4,则出队列顺序为( C )。 10、在循环队列中用数组A[0..m-1] 存放队列元素,其队头和队尾指针分别为front和rear,则当前队列中的元素个数是( D )。 A ( front - rear + 1) % m B ( rear - front + 1) % m C ( front - rear + m) % m D ( rear - front + m) % m 11、一个数组元素a[i]与( A )的表示等价。 A *(a+i) B a+i C *a+i D &a+i 12、若需要利用形参直接访问实参,则应把形参变量说明为( B )参数。 A 指针 B 引用 C 值 D 变量 13、下面程序段的时间复杂度为( C ) for (int i=0;i

数据结构_实验1_线性表的基本操作

实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题

要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE;

数据结构线性表2答案

习题二 一、选择题 1.在一个长度为n的顺序表中删除第i个元素(0<i

数据结构-多项式相加

数据结构课程设计 2012年12月 班级:XXX 学号:XXX 姓名: XXX 指导教师:XXX

一元稀疏多项式计算器 【问题描述】 设计一个一元稀疏多项式简单计算器 【基本要求】 一元多项式简单计算器的基本功能是: 1,输入并建立多项式; 2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 3,多项式a和b相加,建立多项式a+b; 4,多项式a和b相减,建立多项式a-b. 【算法设计思想】 ①一般情况下的一元n次多项式可写成pn(x)=p1xe1+p2xe2+……+pmxem 其中,p1是指数为ei的项的非零系数,且满足0≦e1

【实现提示】 用带表头结点的单链表存储多项式。 【程序代码】 #include #include typedef struct node { float coef; int expn; struct node *next; }Lnode, *polynmial; void create(polynmial &L); //输入并建立多项式L void display(polynmial L); //显示,输出多项式L void sort(polynmial &L); //多项式L按指数排序 void reverse(polynmial &L); //逆置 void select(); //用户选择加减操作 void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式La,Lb相加void subtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式La减去Lb,结果给Ld void create(polynmial &L) //输入并建立多项式L { int i, n; static struct node *p; scanf("%d", &n); L = (struct node *)malloc (sizeof(struct node)); L->next = NULL; for(i = 0; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%f %d", &p->coef, &p->expn); p->next = L->next; L->next = p; } } void display(polynmial L)//显示,输出多项式L { struct node *p, *q; int flag = 0; int k = 0; q = L->next; while(q)

数据结构实验一题目一线性表实验报告

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 带头结点的单链表

2.2 关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中b、代码实现: Linklist::Linklist(int a[],int n)//头插法 {front=new Node; front->next=NULL; for(int i=n-1;i>=0;i--) {Node*s=new Node; s->data=a[i]; s->next=front->next; front->next=s; } } 2、尾插法

a、伪代码实现:a.在堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)//尾插法 {front=new Node; Node*r=front; for(int i=0;idata=a[i]; r->next=s; r=s; } r->next=NULL; } 时间复杂度:O(n) 3、按位查找 a、伪代码实现: 初始化工作指针p和计数器j,p指向第一个结点,j=1 循环以下操作,直到p为空或者j等于1 b1:p指向下一个结点 b2:j加1 若p为空,说明第i个元素不存在,抛出异常 否则,说明p指向的元素就是所查找的元素,返回元素地址 b、代码实现 Node* Linklist::Get(int i)//得到指向第i个数的指针 {Node*p=front->next; int j=1; while(p&&j!=i)//p非空且j不等于i,指针后移 {p=p->next; j++;

数据结构实验一一元多项式相加

数据结构实验报告实验一:一元多项式相加 姓名:周成 学号: 专业:软件工程 任课教师:马慧珠 2013年12 月01 日

1.实验名称: 一元多项式相加 2.实验目的: 如何使用C语言实现链表的说明、创建以及结点的插入和删除等操作。 3.实验要求: 对一元多项式能实现输入、输出,以及两个一元多项式相加及结果显示。 4.实验内容: 一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。 核心算法PolyAdd是把分别由pa和pb所指的两个多项式相加,结果为pa所指的多项式。运算规则如下:相加时,首先设两个指针变量qa和qb分别从多项式的首项开始扫描,比较qa和qb所指结点指数域的值,可能出现下列三种情况之一:

(1)qa->exp大于qb->exp,则qa继续向后扫描。 (2)qa->exp等于qb->exp,则将其系数相加。若相加结果不为零,将结果放入qa->coef中,并删除qb所指结点,否则同时删除qa和qb所指结点。 然后qa、qb继续向后扫描。 (3)qa->exp小于qb->exp,则将qb所指结点插入qa所指结点之前,然后qa、qb继续向后扫描。 扫描过程一直进行到qa或qb有一个为空为止,然后将有剩余结点的链表接在结果表上。所得pa指向的链表即为两个多项式之和。 5.实验程序代码及运行结果: #include"" #include<> #include<> #include<> #include<> #define NULL 0 typedef struct NODE {

数据结构课后习题及答案

填空题(10 * 1’ = 10’) 一、概念题 .当对一个线性表经常进行的是插入和删除操作时,采用链式存储结构为宜。 .当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用顺序存储结构。 .带头结点的单链表L中只有一个元素结点的条件是L->Next->Next==Null。 .循环队列的引入,目的是为了克服假溢出。 .长度为0的字符串称为空串。 .组成串的数据元素只能是字符。 .设T和P是两个给定的串,在T中寻找等于P的子串的过程称为模式匹配,又称P为模式。 .为了实现图的广度优先搜索,除一个标志数组标志已访问的图的结点外,还需要队列存放被访问的结点实现遍历。 .广义表的深度是广义表中括号的重数 .有向图G可拓扑排序的判别条件是有无回路。 .若要求一个稠密图的最小生成树,最好用Prim算法求解。 . 直接定址法法构造的哈希函数肯定不会发生冲突。 .排序算法所花费的时间,通常用在数据的比较和交换两大操作。 .通常从正确性﹑可读性﹑健壮性﹑时空效率等几个方面评价算法的(包括程序)的质量。 .对于给定的n元素,可以构造出的逻辑结构有集合关系﹑线性关系树形关系﹑图状关系四种。 .存储结构主要有顺序存储﹑链式存储﹑索引存储﹑散列存储四种。 .抽象数据类型的定义仅取决于它的一组逻辑特性,而与存储结构无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部使用。 .一个算法具有五大特性:有穷性﹑确定性﹑可行性,有零个或多个输入﹑有一个或多个输入。 .在双向链表结构中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句:s->prior= p->prior; s->next= p; p->prior- next= s; p->prior= s;。 .在单链表中设置头结点的作用是不管单链表是否为空表,头结点的指针均不空,并使得对单链表的操作(如插入和删除)在各种情况下统一。 .队列是限制在表的一端进行插入和在另一端进行删除的线性表,其运算遵循先进先出原则。 .栈是限定尽在表位进行插入或删除操作的线性表。 .在链式队列中,判定只有一个结点的条件是(Q->rear==Q->front)&&(Q->rear!=NULL)。 .已知链队列的头尾指针分别是f和r,则将x入队的操作序列是node *p=(node *)malloc(node); p->next=x; p->next=NULL; if(r) {r->next=p; r=p;} else {r=p; f=p;}。 .循环队列的满与空的条件是(rear+1)%MAXSIZE==fornt和(front=-1&&rear+1==MAXSIZE)。 .串是一种特殊的线性表,其特殊性表现在数据元素都是由字符组成。 .字符串存储密度是串值所占存储位和实际分配位的比值,在字符串的链式存储结构中其结点大小是可变的。 .所谓稀疏矩阵指的是矩阵中非零元素远远小于元素总数,则称该矩阵为矩阵中非零元素远远小于元素总数,则称该矩阵为稀疏矩阵。 .一维数组的逻辑结构是线性结构,存储结构是顺序存储结构;对二维或多维数组,分别按行优先和列优先两种不同的存储方式。 .在有向图的邻接矩阵表示中,计算第i个顶点入度的方法是求邻接矩阵中第i列非0元素的个数。 网中,结点表示活动,边表示活动之间的优先关系,AOE网中,结点表示事件,边表示活动。 .按排序过程中依据不同原则对内部排序方法进行分类,主要有选择排序﹑交换排序﹑插入排序归并排序等4类。 .在堆排序、快速排序和归并排序中若只从排序结果的稳定性考虑,则应选择归并排序方法;若只从平均情况下排序最快考虑,则应选择快速排序方法;若只从最坏情况下排序最快且要节省类存考虑,则应选择堆排序方法。 .直接插入排序用监视哨的作用是存当前要的插入记录,可又省去查找插入位置时对是否出界的判断。 .设表中元素的初始状态是按键值递增的,则直接插入排序最省时间,快速排序最费时间。 .下列程序判断字符串s是否对称,对称则返回1,否则返回0;如?(“abba”)返回1,?(”abab”)返回0. Int f (char*s) { Int i=0,j=0; 求串长*/

多项式加法(C语言实现)

多项式加法 #include #include #define Max_Size 100 typedef struct node { float coef; int expn; struct node *next; }PolyNode; int CreCoeStr(float C[]) { char flag; int i=0; do { scanf("%f",&C[i++]); scanf("%c",&flag); } while (flag!='#'); return(i); } void CreExpStr(int E[]) { int i=0; char flag; do { scanf("%d",&E[i++]); scanf("%c",&flag); } while (flag!='#'); } void InitPolyList(PolyNode **sq) { if((*sq=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1); (*sq)->next=NULL; }

void CreatPolyList(PolyNode **sq,float C[],int E[],int num) { int i; PolyNode *s,*r=*sq; for(i=0;icoef=C[i]; s->expn=E[i]; r->next=s; r=s; } r->next=NULL; } void InsertSortPoly(PolyNode **sq) { PolyNode *p,*q,*r,*u; p=(*sq)->next; (*sq)->next=NULL; while (p) { r=*sq; q=(*sq)->next; while (q&&q->expn<=p->expn) { r=q; q=q->next; } u=p->next; p->next=r->next; r->next=p; p=u; } } void DispList(PolyNode *sq) { PolyNode *p=sq->next; while(p) { printf("(%7.2f,%d)",p->coef,p->expn); p=p->next; }

数据结构线性表实验报告

《数据结构》实验报告 专业: 学号: 姓名: 实验二线性表 【实验目的】 1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。 2.通过编程、上机调试,进一步理解线性表的基本概念,东运用C语言实现线性表基本操作。 3.熟练掌握线性表的综合应用问题。 【实验内容】 1、一个线性表有n个元素(n-MAXSIZE.MAXSIZE指线性表的最大长度),且递增有。现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。设计程序实现。要求:采用顺序存储表示实现;采用链式存储表示方法实现:比较两种方法的优劣。 2.从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。 要求: ①指定的值x由键盘输入; ②程序能处理空链表的情况。 3.设有头结点的单链表,编程对表中的任意值只保留一个结点,删除其余值相同的结点。 要求: ①该算法用函数(非主函数)实现; ②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。LinkedList Exchange(LinkedList HEAD,p) //HEAD是单链表头结点的指针,p是链表中的一个结点。本算法将p所指结点与其后 继结点交换。 (q=head->next;//q是工作指针,指向链表中当前待处理结点。 pre=head;//pre是前驱结点指针,指向q的前驱。 while(q'=null &&q1=p)(pre=q;q=q->next;]/未到p结点,后移指针。 if(p->next==null)printf(“p无后继结点\n”);/p是链表中最后一个结点,无后继。 else/处理p和后继结点交换 (q=p->next;//暂存p的后继。 pre->next=q://p前驱结点的后继指向p的后继。 p->next=q->next;//p的后继指向原p后继的后继。 q->next=p://原p后继的后继指针指向p。} }//算法结束。 4.已知非空单链表第一个结点由head指出,请写一算法,交换p所指结点与其下一个结点在链表中的位置。 要求:

数据结构试题答案

第一章概论 一、选择题 1、研究数据结构就是研究(D )。 A. 数据的逻辑结构 B. 数据的存储结构 C. 数据的逻辑结构和存储结构 D. 数据的逻辑结构、存储结构及其基本操作(研究非数值计算的程序设计问题中,计算机操作对象以及他们之间的关系和操作) 2、算法分析的两个主要方面是( A )。 A. 空间复杂度和时间复杂度 B. 正确性和简单性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 3、具有线性结构的数据结构是( D )。(线性结构就是:在非空有限集合中,存在为一个被称为第一个的数据元素和最后一个元素,有除了第一个元素,集合中每一个元素均只有一个前驱,除了最后一个元素有唯一后继)(链表、栈、队列、数组、串) A. 图 B. 树 C. 广义表(线性表的推广) D. 栈 4、计算机中的算法指的是解决某一个问题的有限运算序列,它必须具备输入、输出、(B )等5个特性。 A. 可执行性、可移植性和可扩充性 B. 可执行性、有穷性和确定性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和确定性 5、下面程序段的时间复杂度是( C )。 for(i=0;i

6、算法是(D )。为了解决某一问题而规定的一个有限长的操作序列 A. 计算机程序 B. 解决问题的计算方法 C. 排序算法 D. 解决问题的有限运算序列 7、某算法的语句执行频度为(3n+nlog2n+n2+8),其时间复杂度表示(C )。 A. O(n) B. O(nlog2n) C. O(n2) D. O(log2n) 8、下面程序段的时间复杂度为( C )。 i=1; while(i<=n) i=i*3; A. O(n) B. O(3n) C. O(log3n) D. O(n3) 9、数据结构是一门研究非数值计算的程序设计问题中计算机的数据元素以及它们之间的(B )和运算等的学科。(关系和操作) A. 结构 B. 关系 C. 运算 D. 算法 10、下面程序段的时间复杂度是( A )。 i=s=0; while(s

链表实现多项式相加实验报告

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间:2012年10月17日

1、实验目的和要求 1)掌握链表的运用方法; 2)学习链表的初始化并建立一个新的链表; 3)知道如何实现链表的插入结点与删除结点操作; 4)了解链表的基本操作并灵活运用 2、实验内容 1)建立两个链表存储一元多项式; 2)实现两个一元多项式的相加; 3)输出两个多项式相加后得到的一元多项式。 3、算法基本思想 数降序存入两个链表中,将大小较大的链表作为相加后的链表寄存处。定义两个临时链表节点指针p,q,分别指向两个链表头结点。然后将另一个链表中从头结点开始依次与第一个链表比较,如果其指数比第一个小,则p向后移动一个单位,如相等,则将两节点的系数相加作为第一个链表当前节点的系数,如果为0,则将此节点栓掉。若果较大,则在p前插入q,q向后移动一个,直到两个链表做完为止。 4、算法描述 用链表实现多项式相加的程序如下: #include #include #include struct node{ int exp; float coef; struct node*next; };

void add_node(struct node*h1,struct node*h2); void print_node(struct node*h); struct node*init_node() { struct node*h=(struct node*)malloc(sizeof(struct node)),*p,*q; int exp; float coef=1.0; h->next=NULL; printf("请依次输入多项式的系数和指数(如:\"2 3\";输入\"0 0\"时结束):\n"); p=(struct node*)malloc(sizeof(struct node)); q=(struct node*)malloc(sizeof(struct node)); for(;fabs(coef-0.0)>1.0e-6;) { scanf("%f %d",&coef,&exp); if(fabs(coef-0.0)>1.0e-6) { q->next=p; p->coef=coef; p->exp=exp; p->next=NULL; add_node(h,q); } } free(p); free(q); return(h); } void add_node(struct node*h1,struct node*h2) { struct node*y1=h1,*y2=h2; struct node*p,*q; y1=y1->next; y2=y2->next; for(;y1||y2;) if(y1) { if(y2) { if(y1->expexp) y1=y1->next; else if(y1->exp==y2->exp) { y1->coef+=y2->coef; if(y1->coef==0)

《数据结构》实验一 线性表及其应用

实验一线性表及其应用 一、实验目的 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、实现提示 1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。 在此,我们利用C语言的结构体类型定义顺序表: #define MAXSIZE 1024 typedef int elemtype; /* 线性表中存放整型元素*/ typedef struct { elemtype vec[MAXSIZE]; int len; /* 顺序表的长度*/ }sequenlist; 将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。 2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。 3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下: typedef int elemtype; typedef struct node

数据结构习题与答案

第 1 章绪论 课后习题讲解 1. 填空 ⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 【解答】数据元素 ⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。 【解答】数据项,数据元素 【分析】数据结构指的是数据元素以及数据元素之间的关系。 ⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。 【解答】集合,线性结构,树结构,图结构 ⑷数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。 【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系 ⑸算法具有五个特性,分别是()、()、()、()、()。 【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性 ⑹算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。 【解答】自然语言,程序设计语言,流程图,伪代码,伪代码 ⑺在一般情况下,一个算法的时间复杂度是()的函数。 【解答】问题规模 ⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。 【解答】Ο(1),Ο(nlog2n) 【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。 2. 选择题 ⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。 A 线性结构 B 非线性结构 C 存储位置 D 指针 【解答】C,D 【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。

多项式求和

数据结构课程设计 题目:多项式运算 学生姓名:熊奉标 学号:10115011046 专业:计算机科学与技术 班级:10级(1)班 指导教师姓名及职称:陈正铭讲师 起止时间:2012 年2 月——2012 年4 月 1 需求分析

1.1 课题背景及意义 本课程设计主要解决一元多项式的运算问题,通过链表的使用,实现对一元多项式的构建、录入、存储、打印、以及之间的运算。在本课程设计中,程序设计语言为C++语言,程序运行平台为Windows/98/2000/XP,程序采用了链表存储方法以及结构化和模块化的设计方法,通过调试运行,可以进行多项式的加、减、乘运算,勉强实现了设计目标,并且经过适当完善后,将可应用到实际中解决某些问题。 一元多项式的运算,虽然无法直接在除数学外的其他领域作出贡献,但是在数学上,它可以为人们解决一些自己动笔动手很难解决的问题,比如说那些很长很长的多项式,用笔算可能要算半天,但是用该程序,只需短短的几秒钟,所以它给人们带来了不少方便,同时相信它也能间接地为其他领域做出贡献。 1.2 课题要求 (1)掌握线性表的创建、插入、删除等基本运算。 (2)掌握线性表的顺序存储结构和链式存储结构 (3)掌握线性表的典型应用—多项式运算(加、减、乘)。 该程序的主要任务是将用户输入的多项式用线性表存储,然后通过对线性表的基本操作,而实现多项式之间的三则运算,把正确结果输出给用户。 1.3 软件格式规定 输入格式:有两类编辑框可供输入,系数编辑框、指数编辑框,在系数编辑框中允许输入浮点型数据,在指数编辑框中只允许输入整型数据。 正确的输入: f(x)=8X^6+4X^5-2X^4-12X^3-1X^1+10X^0 g(x)=2X^3-5X^2+1X^1 正确的输出结果: f(x)+g(x):结果= 8.00X^6 +4.00X^5 -2.00X^4 -121.00X^3 -5.00X^2 +10.00 f(x)-g(x):结果= 8.00X^6 +4.00X^5 -2.00X^4 -125.00X^3 +5.00X^2 -2.00X

数据结构作业及答案

第一章绪论 一、选择题 1.数据结构是一门研究非数值计算的程序设计问题中计算机的1以及它们之间的2和运算等的学科。1 A.数据元素 B.计算方法 C.逻辑存储 D.数据映像 2 A.结构 B.关系 C.运算 D.算法 2.数据结构被形式地定义为(K, R),其中K是1的有限集,R是K上的2有限集。 1 A.算法 B.数据元素 C.数据操作 D.逻辑结构 2 A.操作 B.映像 C.存储 D.关系 3.在数据结构中,从逻辑上可以把数据结构分成。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4.线性结构的顺序存储结构是一种1的存储结构,线性表的链式存储结构是一种2的存储结构。A.随机存取 B.顺序存取 C.索引存取 D.散列存取 5.算法分析的目的是1,算法分析的两个主要方面其一是指2,其二是指正确性和简单性。1 A.找出数据结构的合理性 B.研究算法中的输入和输出的关系 C.分析算法的效率以求改进 D.分析算法的易懂性和文档性 2 A.空间复杂度和时间复杂度 B.研究算法中的输入和输出的关系 C.可读性和文档性 D.数据复杂性和程序复杂性k 6.计算机算法指的是1,它必须具备输入、输出和2等5个特性。 1 A.计算方法 B.排序方法 C.解决问题的有限运算序列 D.调度方法 2 A.可执行性、可移植性和可扩充性 B.可行性、确定性和有穷性 C.确定性、有穷性和稳定性 D.易读性、稳定性和安全性 7.线性表的逻辑顺序与存储顺序总是一致的,这种说法。A.正确 B.不正确 8线性表若采用链式存储结构时,要求内存中可用存储单元的地址。 A.必须连续的 B.部分地址必须连续的 C.一定是不续的D连续不连续都可以 9.以下的叙述中,正确的是。A.线性表的存储结构优于链式存储结构 B.二维数组是其数据元素为线性表的线性表C.栈的操作方式是先进先出D.队列的操作方式是先进后出10.每种数据结构都具备三个基本运算:插入、删除和查找,这种说法。A.正确B.不正确 二、填空题1.数据逻辑结构包括三种类型、和,树形结构和图形结构合称为。2.在线性结构中,第一个结点前驱结点,其余每个结点有且只有个前驱结点;最后一个结点后续结点,其余每个结点有且只有个后续结点。3.算法的五个重要特性是、、、、。 4.下面程序段的时间复杂度是。 for( i = 0; i < n; i++) for( j = 0; j < m; j++) A[i][j] = 0; 5.下面程序段的时间复杂度是。 i = s = 0; while ( s < n) { i ++; /* i = i +1*/ s += i; /* s = s + i*/ } 6.下面程序段的时间复杂度是。 s = 0; for( i = 0; i < n; i++) for( j = 0; j < n; j++) s += B[i][j]; sum = s; 7.下面程序段的时间复杂度是。 i = 1; while ( i <= n ) i = i * 3;

相关文档
最新文档