当前位置:文档之家› 复旦大学数据结构教程课后习题答案第一章

复旦大学数据结构教程课后习题答案第一章


ch='y'; for(i=0;ch=='y'||ch=='Y';i++) {q=(NODE*)malloc(sizeof(NODE)); if(p==NULL) root=q; else p->next=q; printf("\nPlease input the DATA of node %d:\n",i); scanf("%d",&(q->data)); getchar(); printf("Please input the EXP of node %d:\n",i); scanf("%d",&(q->exp)); getchar(); printf("Do you want to continue(Y/N)?\n"); scanf("%c",&ch); getchar(); p=q; } p->next=NULL; return(root); } void print(NODE *root) {int i=0; if(!root) printf("\n0"); while(i++,root!=NULL) {printf("\nNODE %d:\tDATA:%d\tEXP:%d",i,root->data,root->exp); root=roo一个求解给定多项式在 X=Xo(Xo 为指定的某个值)时的值的 C 函数。 存储法:定义结构数组 struct node { int exp; float coef; }; typedef struct node TERM #define max 100
NODE a[max]; 算法步骤:1 令 sum=0, i=0 2 算出第 i 项的值,并与 sum 相加。 3 若 i<n, 则转 2,否则 return(sum) 程序: float cal ( float x, TERM a[ ], int n ) { float sum; int i, j, k; for ( i=0; i<n; i++ ) { for ( k=1, j=1; j<= a[i ]. Exp; j++) k=k*x; sum+= a[i ].coef*k; } return(sum); } 测试用例: 令 x=2; 多项式为 3x6+8x4+5x2+9 结果为 349。
print(b); c=multi(a,b); printf("\n\n\nC:\n"); print(c); } 五:测试数据: 输入: A:5X^6+3X^4+2X B:7X^3+3X^2+5 输出: C:35X^9+15X^8+21X^7+34X^6+29X^4+6X^3+10X 输入: A:0 B:5X^3+2X^2 输出:0 输入: A:3X^2+5X^1 B:3X^1-5 C:0
NODE *multi(NODE *a,NODE *b) {NODE *pa,*pb,*pc,*qc,*p,*c=NULL; int exp,data,flag; for(pa=a;pa!=NULL;pa=pa->next) for(pb=b;pb!=NULL;pb=pb->next) {exp=pa->exp+pb->exp;data=pa->data*pb->data; if(data) {flag=search(exp,c,&pc,&qc); if(flag) if(!(data+qc->data)) {pc->next=qc->next;free(qc);} else (qc->data)+=data; else {p=(NODE *)malloc(sizeof(NODE)); p->data=data;p->exp=exp; if(!pc) c=p; else pc->next=p; p->next=qc; } } } return(c); }
1.1:比较 2 个线性链表的 C 函数
1. 存储法:用两个数组存放线性表。 2. 存储结构:一般的顺序存储方式。 3. 源程序: int comp(int a[],int as,int b[],int bs) { int tmp=as>bs?as:bs; int i; for(i=0;i<tmp;i++) { if(a[i]>b[i]) return 1; if(a[i]<b[i]) return -1; } if(as>bs) return 1; if(bs>as) return -1; return 0; } 4.测试用例: 1. A[3]={1,2,3} B[3]={1,2,3} output : 0; 2. A[3]={1.2.3} B[3]={1,1,3} output: 1; 3. A[3]={1,2,3} B[3]={1,2,4} output: -1 4. A[3]={1,2,3} B[4]={1,2,3,0} output: -1; 5. A[4]={1,2,3,0} B[3]={1,2,3} output: 1; 6. A[4]={1,2,3,0} B[3]={1,3,2} output:-1;
NODE* creat() {NODE *root,*p,*q; char ch; int i; printf("Do you want to creat a null one(Y/N)?\n"); scanf("%c",&ch); getchar(); if(ch=='y'||ch=='Y') return(NULL); p=NULL;
main() { char ch; NODE *a,*b,*c; clrscr(); printf("Now please input A:\n"); a=creat(); printf("Now please input B:\n"); b=creat(); printf("\nA:\n"); print(a); printf("\nB:\n");
int search(int exp,NODE *c,NODE **pc,NODE **qc) { *pc=NULL; *qc=c; if(c==NULL) return(0); while((*qc)->exp>exp) {*pc=*qc;*qc=(*qc)->next;} if((*qc)->exp==exp) return(1); return(0); }
1.2
写一个倒置顺序存贮的线性表的 C 函数。要求用最少的附加存贮空间来完成。 分析:假设用数组 a 存贮一组 int 类型的数据,每次将 a[0]取出,其余数依次前移,然后 将 a[0]放到 尚未倒置的数据元素的最后,直至整个数组完成倒置。 (1)取 t=a[0],余下的 a[1],a[2],...a[n-1]依次前移一个位置; (2)a[n-1]=t; 算法: (3)对由 a[0],a[1]...a[n-2]组成的数组重复上述步骤。 程序: # include<stdio.h> # define N 10 void reverse(a,n) int a[]; int n; {int t,i,j=0; while(j<n-1) {t=a[0]; for(i=0;i<n-j-1;i++) a[i]=a[i+1];
a[i]=t; j++; } } void main( ) {int a[N]; int i; printf("Input the array:\n"); for(i=0;i<N;i++) scanf("%d", &a[i]); reverse(a,N); printf("The reversed array:\n"); for(i=0;i<N;i++); printf("%d ",a[i]); printf("\n"); } Sample: Input the array: 0123456789 The reversed array: 9876543210
1.5
实现多项式乘法 一:存储结构: 多项式以线性链表存储,以增加其插入删除的效率。结果多项式与所给多项式采取 相同的存储结构,以方便实现多项式的连乘。 二:分析 多项式的加法书上有源程序,而乘法与加法相似,只是由于乘法的规则与加法 不同,因此我用了一个双重循环来实现(详见源程序) ,得到一个结果项之后,查找结 果链表,若已有,则看是否相加之后为 0,若为 0,则将该项删去,否则,就直接改系 数,若没有,则直接链上。 原本想用数组加链表的索引法来实现,但据分析后,认为并不能显著提高效率, 显得得不偿失,因此,我就使用了最原始的方法,请老师同学多多指教。 三:输入/输出 输入:先输入 A、B 多项式(根据提示) 输出:A、B、C(A×B) 四:源程序 #include<stdio.h> struct node{ int exp; int data; struct node *next; }; typedef struct node NODE;
1.3
在具有 n 个结点的顺序存贮的线性表中,对值相同的结点只保留一个,把多余的结点删 除掉,使线性表中没有值相同的结点。试编写一个实现上述操作的 C 函数,并分析该程序的 执行时间。 解答: 首先应对线性表中每一个结点进行搜索, 找到和他值相同的结点就把其删除, 同时改变 原结点的个数。主要运用两层循环:最外层对线性表中的第 0 到第 n-2 个元素进行扫描,第 二层是对于第一层的每一个元素从其后面一个元素开始扫描, 检查是否有和该元素值相同的 元素若有则删除该元素,若无则循环关键值+1 进行下一个元素比较,直到线性表最后一个 元素,然后在回到上层循环。如此继续,直到跳出所有循环时,所得线性表即为题目要求的 线性表。 下面给出实现的函数。Sq_delete()为删除一个结点的函数,i 表示所要删除的结点的 下标,del()为删除线性表中所有相同结点的函数。其中 list[]为进行操作的线性表,*p_m 和*p_n 在两个函数中都表示线性表中结点个数。 #include<stdio.h> #define M 100 int sq_delete(int list[],int *p_m,int i) { int j; if(i<0||i>=*p_m) return(1); for(j=i+1;j<*p_m;j++)
相关主题