本文目录导航:
求《数据结构 C言语版》 严蔚敏的电子书!!!
经测试,将下面地址复制到地址栏中,回车,会出现游戏广告界面,再尝试一次性即可。
发上来了。
明码可以依据双击紧缩文件后左边的揭示找到,是 假设你还想以紧缩文件模式保管的话,倡导应用明码解压后,删去原来的紧缩文件,再从新紧缩。
求数据结构C言语版严蔚敏吴伟民PDF版 紫色封面
《数据结构:C言语版》(严蔚敏)(选用个别下载即可!)
1、手机阅读器网页端登 陆 或 PC电脑端登陆,即可检查、下载;
2、文件有时效性,若文件失效或下载疑问,请留言;
清华大学严蔚敏数据结构题集完整答案(c言语版)
第一章 绪论 1.16 void print_descending(int x,int y,int z)//按从大到小顺序输入三个数 { scanf(%d,%d,%d,&x,&y,&z); if(x<y) x<->y; //<->为示意替换的双目运算符,以下同 if(y<z) y<->z; if(x<y) x<->y; //冒泡排序 printf(%d %d %d,x,y,z); }//print_descending 1.17 Status fib(int k,int m,int &f)//求k阶斐波那契序列的第m项的值f { int tempd; if(k<2||m<0) return ERROR; if(m<k-1) f=0; else if (m==k-1) f=1; else { for(i=0;i<=k-2;i++) temp[i]=0; temp[k-1]=1; //初始化 for(i=k;i<=m;i++) //求出序列第k至第m个元素的值 { sum=0; for(j=i-k;j<i;j++) sum+=temp[j]; temp[i]=sum; } f=temp[m]; } return OK; }//fib 剖析:经过保管曾经计算进去的结果,此方法的期间复杂度仅为O(m^2).假设驳回递归编程(大少数人都会首先想到递归方法),则期间复杂度将高达O(k^m). 1.18 typedef struct{ char *sport; enum{male,female} gender; char schoolname; //校名为A,B,C,D或E char *result; int score; } resulttype; typedef struct{ int malescore; int femalescore; int totalscore; } scoretype; void summary(resulttype result[ ])//求各校的男女总分和集团总分,假定结果曾经贮存在result[ ]数组中 { scoretype score ; i=0; while(result[i]!=NULL) { switch(result[i]) { case A: score[ 0 ]+=result[i]; if(result[i]==0) score[ 0 ]+=result[i]; else score[ 0 ]+=result[i]; break; case B: score +=result[i]; if(result[i]==0) score +=result[i]; else score +=result[i]; break; …… …… …… } i++; } for(i=0;i<5;i++) { printf(School %d:\n,i); printf(Total score of male:%d\n,score[i]); printf(Total score of female:%d\n,score[i]); printf(Total score of all:%d\n\n,score[i]); } }//summary 1.19 Status algo119(int a[ARRSIZE])//求i!*2^i序列的值且不超越maxint { last=1; for(i=1;i<=ARRSIZE;i++) { a[i-1]=last*2*i; if((a[i-1]/last)!=(2*i)) reurn OVERFLOW; last=a[i-1]; return OK; } }//algo119 剖析:当某一项的结果超越了maxint时,它除以前面一项的商会出现意外. 1.20 void polyvalue() { float ad; float *p=a; printf(Input number of terms:); scanf(%d,&n); printf(Input the %d coefficients from a0 to a%d:\n,n,n); for(i=0;i<=n;i++) scanf(%f,p++); printf(Input value of x:); scanf(%f,&x); p=a;xp=1;sum=0; //xp用于寄存x的i次方 for(i=0;i<=n;i++) { sum+=xp*(*p++); xp*=x; } printf(Value is:%f,sum); }//polyvalue第二章 线性表 2.10 Status DeleteK(SqList &a,int i,int k)//删除线性表a中第i个元素起的k个元素{if(i<1||k<0||i+k-1>) return INFEASIBLE;for(count=1;i+count-1<=-k;count++) //留意循环完结的条件[i+count-1]=[i+count+k-1];-=k;return OK;}//DeleteK 2.11Status Insert_SqList(SqList &va,int x)//把x拔出递增有序表va中{if(+1>) return ERROR;++;for(i=-1;[i]>x&&i>=0;i--)[i+1]=[i];[i+1]=x;return OK;}//Insert_SqList 2.12 int ListComp(SqList A,SqList B)//比拟字符表A和B,并用前往值示意结果,值为正,示意A>B;值为负,示意A<B;值为零,示意A=B{for(i=1;[i]||[i];i++)if([i]!=[i]) return [i][i];return 0;}//ListComp 2.13 LNode* Locate(linkList L,int x)//链表上的元素查找,前往指针{for(p=l->next;p&&p->data!=x;p=p->next);return p;}//Locate 2.14 int Length(linkList L)//求链表的长度{for(k=0,p=L;p->next;p=p->next,k++);return k;}//Length 2.15 void ListConcat(linkList ha,linkList hb,linkList &hc)//把链表hb接在ha前面构成链表hc{hc=ha;p=ha;while(p->next) p=p->next;p->next=hb;}//ListConcat 2.16 见书后答案. 2.17 Status Insert(linkList &L,int i,int b)//在无头结点链表L的第i个元素之前拔出元素b{p=L;q=(linkList*)malloc(sizeof(LNode));=b;if(i==1){=p;L=q; //拔出在链表头部}else{while(--i>1) p=p->next;q->next=p->next;p->next=q; //拔出在第i个元素的位置}}//Insert 2.18 Status Delete(linkList &L,int i)//在无头结点链表L中删除第i个元素{if(i==1) L=L->next; //删除第一个元素else{p=L;while(--i>1) p=p->next;p->next=p->next->next; //删除第i个元素}}//Delete 2.19 Status Delete_Between(linklist &L,int mink,int maxk)//删除元素递增陈列的链表L中值大于mink且小于maxk的一切元素{p=L;while(p->next->data<=mink) p=p->next; //p是最后一个不大于mink的元素if(p->next)//假设还有比mink更大的元素{q=p->next;while(q->data<maxk) q=q->next; //q是第一个不小于maxk的元素p->next=q;}}//Delete_Between 2.20 Status Delete_Equal(linklist &L)//删除元素递增陈列的链表L中一切值相反的元素{p=L->next;q=p->next; //p,q指向相邻两元素while(p->next){if(p->data!=q->data){p=p->next;q=p->next; //当相邻两元素不相等时,p,q都向后推一步}else{while(q->data==p->data) { free(q); q=q->next; }p->next=q;p=q;q=p->next; //当相邻元素相等时删除多余元素}//else}//while}//Delete_Equal 2.21 void reverse(SqList &A)//顺序表的就地逆置{for(i=1,j=;i<j;i++,j--)[i]<->[j];}//reverse 2.22 void linkList_reverse(linklist &L)//链表的就地逆置;为简化算法,假定表长大于2{p=L->next;q=p->next;s=q->next;p->next=NULL;while(s->next){q->next=p;p=q;q=s;s=s->next; //把L的元素一一拔出新表表头}q->next=p;s->next=q;L->next=s;}//linkList_reverse剖析:本算法的思维是,一一地把L的以后元素q拔出新的链表头部,p为新表表头. 2.23 void merge1(linkList &A,linkList &B,linkList &C)//把链表A和B兼并为C,A和B的元素距离陈列,且经常使用原存储空间{p=A->next;q=B->next;C=A;while(p&&q){s=p->next;p->next=q; //将B的元素拔出if(s){t=q->next;q->next=s; //如A非空,将A的元素拔出}p=s;q=t;}//while}//merge1 2.24 void reverse_merge(linkList &A,linkList &B,linkList &C)//把元素递增陈列的链表A和B兼并为C,且C中元素递减陈列,经常使用原空间{pa=A->next;pb=B->next;pre=NULL; //pa和pb区分指向A,B的以后元素while(pa||pb){if(pa->data<pb->data||!pb){pc=pa;q=pa->next;pa->next=pre;pa=q; //将A的元素拔出新表}else{pc=pb;q=pb->next;pb->next=pre;pb=q; //将B的元素拔出新表}pre=pc;}C=A;A->next=pc; //结构新表头}//reverse_merge剖析:本算法的思维是,按从小到大的顺序依次把A和B的元素拔出新表的头部pc处,最后解决A或B的残余元素. 2.25 void SqList_Intersect(SqList A,SqList B,SqList &C)//求元素递增陈列的线性表A和B的元素的交加并存入C中{i=1;j=1;k=0;while([i]&&[j]){if([i]<[j]) i++;if([i]>[j]) j++;if([i]==[j]){[++k]=[i]; //当发现了一个在A,B中都存在的元素,i++;j++; //就减少到C中}}//while}//SqList_Intersect 2.26 void linkList_Intersect(linkList A,linkList B,linkList &C)//在链表结构上重做上题{p=A->next;q=B->next;pc=(LNode*)malloc(sizeof(LNode));while(p&&q){if(p->data<q->data) p=p->next;else if(p->data>q->data) q=q->next;else{s=(LNode*)malloc(sizeof(LNode));s->data=p->data;pc->next=s;pc=s;p=p->next;q=q->next;}}//whileC=pc;}//linkList_Intersect 2.27 void SqList_Intersect_True(SqList &A,SqList B)//求元素递增陈列的线性表A和B的元素的交加并存回A中{i=1;j=1;k=0;while([i]&&[j]){if([i]<[j]) i++;else if([i]>[j]) j++;else if([i]!=[k]){[++k]=[i]; //当发现了一个在A,B中都存在的元素i++;j++; //且C中没有,就减少到C中}}//whilewhile([k]) [k++]=0;}//SqList_Intersect_True 2.28 void linkList_Intersect_True(linkList &A,linkList B)//在链表结构上重做上题{p=A->next;q=B->next;pc=A;while(p&&q){if(p->data<q->data) p=p->next;else if(p->data>q->data) q=q->next;else if(p->data!=pc->data){pc=pc->next;pc->data=p->data;p=p->next;q=q->next;}}//while}//linkList_Intersect_True 2.29 void SqList_Intersect_Delete(SqList &A,SqList B,SqList C) {i=0;j=0;k=0;m=0; //i批示A中元素原来的位置,m为移动后的位置while(i<&&j<&& k<) {if([j]<[k]) j++;else if([j]>[k]) k++;else{same=[j]; //找到了相反元素samewhile([j]==same) j++;while([k]==same) k++; //j,k后移到新的元素while(i<&&[i]<same) [m++]=[i++];//需保管的元素移动到新位置while(i<&&[i]==same) i++; //跳过相反的元素}}//whilewhile(i<) [m++]=[i++]; //A的残余元素从新存储。=m; }// SqList_Intersect_Delete剖析:先从B和C中找出共有元素,记为same,再在A中从以后位置开局, 凡小于same的元素均保管(存到新的位置),等于same的就跳过,到大于same时就再找下一个same. 2.30 void linkList_Intersect_Delete(linkList &A,linkList B,linkList C)//在链表结构上重做上题{p=B->next;q=C->next;r=A-next;while(p&&q&&r){if(p->data<q->data) p=p->next;else if(p->data>q->data) q=q->next;else{u=p->data; //确定待删除元素uwhile(r->next->data<u) r=r->next; //确定最后一个小于u的元素指针rif(r->next->data==u){s=r->next;while(s->data==u){t=s;s=s->next;free(t); //确定第一个大于u的元素指针s}//whiler->next=s; //删除r和s之间的元素}//ifwhile(p->data=u) p=p->next;while(q->data=u) q=q->next;}//else}//while}//linkList_Intersect_Delete 2.31 Status Delete_Pre(CiLNode *s)//删除单循环链表中结点s的间接前驱{p=s;while(p->next->next!=s) p=p->next; //找到s的前驱的前驱pp->next=s;return OK;}//Delete_Pre 2.32 Status DuLNode_Pre(DulinkList &L)//实现双向循环链表结点的pre域{for(p=L;!p->next->pre;p=p->next) p->next->pre=p;return OK;}//DuLNode_Pre 2.33 Status linkList_Divide(linkList &L,CiList &A,CiList &B,CiList &C)//把单链表L的元素按类型分为三个循环链表为带头结点的单循环链表类型.{s=L->next;A=(CiList*)malloc(sizeof(CiLNode));p=A;B=(CiList*)malloc(sizeof(CiLNode));q=B;C=(CiList*)malloc(sizeof(CiLNode));r=C; //建设头结点while(s){if(isalphabet(s->data)){p->next=s;p=s;}else if(isdigit(s->data)){q->next=s;q=s;}else{r->next=s;r=s;}}//whilep->next=A;q->next=B;r->next=C; //实现循环链表}//linkList_Divide 2.34 void Print_XorlinkedList(XorlinkedList L)//从左向右输入异或链表的元素值{p=;pre=NULL;while(p){printf(%d,p->data);q=XorP(p->LRPtr,pre);pre=p;p=q; //任何一个结点的LRPtr域值与其左结点指针启动异或运算即获取其右结点指针}}//Print_XorlinkedList 2.35 Status Insert_XorlinkedList(XorlinkedList &L,int x,int i)//在异或链表L的第i个元素前拔出元素x{p=;pre=NULL;r=(XorNode*)malloc(sizeof(XorNode));r->data=x;if(i==1) //当拔出点在最左边的状况{p->LRPtr=XorP(,r);r->LRPtr=p;=r;return OK;}j=1;q=p->LRPtr; //当拔出点在两边的状况while(++j<i&&q){q=XorP(p->LRPtr,pre);pre=p;p=q;}//while //在p,q两结点之间拔出if(!q) return INFEASIBLE; //i无法以超越表长p->LRPtr=XorP(XorP(p->LRPtr,q),r);q->LRPtr=XorP(XorP(q->LRPtr,p),r);r->LRPtr=XorP(p,q); //修正指针return OK;}//Insert_XorlinkedList 2.36 Status Delete_XorlinkedList(XorlinkedList &L,int i)//删除异或链表L的第i个元素{p=;pre=NULL;if(i==1) //删除最左结点的状况{q=p->LRPtr;q->LRPtr=XorP(q->LRPtr,p);=q;free(p);return OK;}j=1;q=p->LRPtr;while(++j<i&&q){q=XorP(p->LRPtr,pre);pre=p;p=q;}//while //找到待删结点qif(!q) return INFEASIBLE; //i无法以超越表长if(==q) //q为最右结点的状况{p->LRPtr=XorP(p->LRPtr,q);=p;free(q);return OK;}r=XorP(q->LRPtr,p); //q为两边结点的状况,此时p,r区分为其左右结点p->LRPtr=XorP(XorP(p->LRPtr,q),r);r->LRPtr=XorP(XorP(r->LRPtr,q),p); //修正指针free(q);return OK;}//Delete_XorlinkedList 2.37 void OEReform(DulinkedList &L)//按1,3,5,...4,2的顺序重排双向循环链表L中的一切结点{p=;while(p->next!=L&&p->next->next!=L){p->next=p->next->next;p=p->next;} //此时p指向最后一个奇数结点if(p->next==L) p->next=L->pre->pre;else p->next=l->pre;p=p->next; //此时p指向最后一个偶数结点while(p->pre->pre!=L){p->next=p->pre->pre;p=p->next;}p->next=L; //按标题要求调整了next链的结构,此时pre链仍为原状for(p=L;p->next!=L;p=p->next) p->next->pre=p;L->pre=p; //调整pre链的结构,同2.32方法}//OEReform剖析:next链和pre链的调整只能离开启动.似乎时启动调整的话,必定经常使用堆栈保管偶数结点的指针,否则将会破坏链表结构,形成结点失落. 2.38 DuLNode * Locate_DuList(DulinkedList &L,int x)//带freq域的双向循环链表上的查找{p=;while(!=x&&p!=L) p=p->next;if(p==L) return NULL; //没找到p->freq++;q=p->pre;while(q->freq<=p->freq) q=q->pre; //查找插上天位if(q!=p->pre){p->pre->next=p->next;p->next->pre=p->pre;q->next->pre=p;p->next=q->next;q->next=p;p->pre=q; //调整位置}return p;}//Locate_DuList 2.39 float GetValue_SqPoly(SqPoly P,int x0)//求升幂顺序存储的稠密多项式的值{PolyTerm *q;xp=1;q=;sum=0;ex=0;while(q->coef){while(ex<q->exp) xp*=x0;sum+=q->coef*xp;q++;}return sum;}//GetValue_SqPoly 2.40 void Subtract_SqPoly(SqPoly P1,SqPoly P2,SqPoly &P3)//求稠密多项式P1减P2的差式P3{PolyTerm *p,*q,*r;Create_SqPoly(P3); //建设空多项式P3p=;q=;r=;while(p->coef&&q->coef){if(p->exp<q->exp){r->coef=p->coef;r->exp=p->exp;p++;r++;}else if(p->exp<q->exp){r->coef=-q->coef;r->exp=q->exp;q++;r++;}else{if((p->coef-q->coef)!=0) //只要同次项相减不为零时才须要存入P3中{r->coef=p->coef-q->coef;r->exp=p->exp;r++;}//ifp++;q++;}//else}//whilewhile(p->coef) //解决P1或P2的残余项{r->coef=p->coef;r->exp=p->exp;p++;r++;}while(q->coef){r->coef=-q->coef;r->exp=q->exp;q++;r++;}}//Subtract_SqPoly 2.41 void QiuDao_linkedPoly(linkedPoly &L)//对有头结点循环链表结构存储的稠密多项式L求导{p=L->next;if(!p->){L->next=p->next;p=p->next; //跳过常数项}while(p!=L){p->*=p->--;//对每一项求导p=p->next;}}//QiuDao_linkedPoly 2.42 void Divide_linkedPoly(linkedPoly &L,&A,&B)//把循环链表存储的稠密多项式L拆成只含奇次项的A和只含偶次项的B{p=L->next;A=(PolyNode*)malloc(sizeof(PolyNode));B=(PolyNode*)malloc(sizeof(PolyNode));pa=A;pb=B;while(p!=L){if(p->!=2*(p->/2)){pa->next=p;pa=p;}else{pb->next=p;pb=p;}p=p->next;}//whilepa->next=A;pb->next=B; }//Divide_linkedPoly