大家好,今天小编来为大家解答以下的问题,关于数据结构c语言版严蔚敏电子版,数据结构严蔚敏 数据结构c语言版pdf这个很多人还不知道,现在让我们一起来看看吧!
一、《数据结构(C语言版)》pdf下载在线阅读,求百度网盘云资源
《数据结构(C语言版)》(严蔚敏)电子书网盘下载免费在线阅读
链接:密码:5dfz
《数据结构》(C语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。
本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。
本书概念表述严谨,逻辑推理严密,语言精炼,用词达意,并有配套出版的《数据结构题集》(C语言版),便于教学,又便于自学。
本书后附有光盘。光盘内容可在DOS环境下运行的以类C语言描述的“数据结构算法动态模拟辅助教学软件,以及在Windows环境下运行的以类PASCAL或类C两种语言描述的“数据结构算法动态模拟辅助教学软件”。
本书可作为计算机类专业或信息类相关专业的本科或专科教材,也可供从事计算机工程与应用工作的科技工作者参考。
严蔚敏清华大学计算机系教授,长期从事数据结构教学和教材建设,和吴伟民合作编著的《数据结构》曾获“第二届普通高等学校优秀教材全国特等奖”和“1996年度国家科学技术进步奖三等奖”。
吴伟民广东工业大学计算机学院副教授,硕士生导师。广东省计算机学会图像图形分会秘书长。长期从事数据结构教学和系列教材建设。主要研究领域:数据结构和算法、可是计算、编译和虚拟机技术、智能系统等。和严蔚敏合作编著的《数据结构》曾获“第二届普通高等学校优秀教材全国特等奖”和“1996年度国家科学技术进步奖三等奖”。
二、求数据结构C语言版严蔚敏(第四版)pdf 图上这本
展开所有强烈建议购买外国版本。数据结构(c语言版本)由霍洛维茨等人翻译出版社:中国机器出版社传统的内容和组织这类教材。层次分明,代码质量高。作者的教学经历,可以从该书的总体叙述中看出来。虽然有一定的难度,但作者从头到尾,都是从相关的基础知识,一步一步来的。(例如,c的数据存储?),这是远远好于严伟民的。最重要的是,与严的教科书相比,书中的证明非常简洁。严的教科书是一场噩梦(例如,严的关于模式匹配的书)。
三、清华大学严蔚敏数据结构题集完整答案(c语言版)
void print_descending(int x,int y,int z)//按从大到小顺序输出三个数
if(x<y) x<->y;//<->为表示交换的双目运算符,以下同
if(x<y) x<->y;//冒泡排序
Status fib(int k,int m,int&f)//求k阶斐波那契序列的第m项的值f
if(k<2||m<0) return ERROR;
for(i=0;i<=k-2;i++) temp[i]=0;
for(i=k;i<=m;i++)//求出序列第k至第m个元素的值
for(j=i-k;j<i;j++) sum+=temp[j];
分析:通过保存已经计算出来的结果,此方法的时间复杂度仅为O(m^2).如果采用递归编程(大多数人都会首先想到递归方法),则时间复杂度将高达O(k^m).
char schoolname;//校名为'A','B','C','D'或'E'
void summary(resulttype result[ ])//求各校的男女总分和团体总分,假设结果已经储存在result[ ]数组中
score[ 0 ].totalscore+=result[i].score;
if(result[i].gender==0) score[ 0 ].malescore+=result[i].score;
else score[ 0 ].femalescore+=result[i].score;
score.totalscore+=result[i].score;
if(result[i].gender==0) score.malescore+=result[i].score;
else score.femalescore+=result[i].score;
printf("Total score of male:%d\n",score[i].malescore);
printf("Total score of female:%d\n",score[i].femalescore);
printf("Total score of all:%d\n\n",score[i].totalscore);
Status algo119(int a[ARRSIZE])//求i!*2^i序列的值且不超过maxint
if((a[i-1]/last)!=(2*i)) reurn OVERFLOW;
分析:当某一项的结果超过了maxint时,它除以前面一项的商会发生异常.
printf("Input number of terms:");
printf("Input the%d coefficients from a0 to a%d:\n",n,n);
for(i=0;i<=n;i++) scanf("%f",p++);
p=a;xp=1;sum=0;//xp用于存放x的i次方
Status DeleteK(SqList&a,int i,int k)//删除线性表a中第i个元素起的k个元素
if(i<1||k<0||i+k-1>a.length) return INFEASIBLE;
for(count=1;i+count-1<=a.length-k;count++)//注意循环结束的条件
a.elem[i+count-1]=a.elem[i+count+k-1];
Status Insert_SqList(SqList&va,int x)//把x插入递增有序表va中
if(va.length+1>va.listsize) return ERROR;
for(i=va.length-1;va.elem[i]>x&&i>=0;i--)
int ListComp(SqList A,SqList B)//比较字符表A和B,并用返回值表示结果,值为正,表示A>B;值为负,表示A<B;值为零,表示A=B
for(i=1;A.elem[i]||B.elem[i];i++)
if(A.elem[i]!=B.elem[i]) return A.elem[i]-B.elem[i];
LNode* Locate(LinkList L,int x)//链表上的元素查找,返回指针
for(p=l->next;p&&p->data!=x;p=p->next);
int Length(LinkList L)//求链表的长度
for(k=0,p=L;p->next;p=p->next,k++);
void ListConcat(LinkList ha,LinkList hb,LinkList&hc)//把链表hb接在ha后面形成链表hc
while(p->next) p=p->next;
Status Insert(LinkList&L,int i,int b)//在无头结点链表L的第i个元素之前插入元素b
p=L;q=(LinkList*)malloc(sizeof(LNode));
q.next=p;L=q;//插入在链表头部
while(--i>1) p=p->next;
q->next=p->next;p->next=q;//插入在第i个元素的位置
Status Delete(LinkList&L,int i)//在无头结点链表L中删除第i个元素
if(i==1) L=L->next;//删除第一个元素
while(--i>1) p=p->next;
p->next=p->next->next;//删除第i个元素
Status Delete_Between(Linklist&L,int mink,int maxk)//删除元素递增排列的链表L中值大于mink且小于maxk的所有元素
while(p->next->data<=mink) p=p->next;//p是最后一个不大于mink的元素
if(p->next)//如果还有比mink更大的元素
while(q->data<maxk) q=q->next;//q是第一个不小于maxk的元素
Status Delete_Equal(Linklist&L)//删除元素递增排列的链表L中所有值相同的元素
p=L->next;q=p->next;//p,q指向相邻两元素
p=p->next;q=p->next;//当相邻两元素不相等时,p,q都向后推一步
while(q->data==p->data)
p->next=q;p=q;q=p->next;//当相邻元素相等时删除多余元素
void reverse(SqList&A)//顺序表的就地逆置
for(i=1,j=A.length;i<j;i++,j--)
void LinkList_reverse(Linklist&L)//链表的就地逆置;为简化算法,假设表长大于2
p=L->next;q=p->next;s=q->next;p->next=NULL;
q=s;s=s->next;//把L的元素逐个插入新表表头
q->next=p;s->next=q;L->next=s;
分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.
void merge1(LinkList&A,LinkList&B,LinkList&C)//把链表A和B合并为C,A和B的元素间隔排列,且使用原存储空间
p=A->next;q=B->next;C=A;
s=p->next;p->next=q;//将B的元素插入
t=q->next;q->next=s;//如A非空,将A的元素插入
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的当前元素
if(pa->data<pb->data||!pb)
pc=pa;q=pa->next;pa->next=pre;pa=q;//将A的元素插入新表
pc=pb;q=pb->next;pb->next=pre;pb=q;//将B的元素插入新表
C=A;A->next=pc;//构造新表头
分析:本算法的思想是,按从小到大的顺序依次把A和B的元素插入新表的头部pc处,最后处理A或B的剩余元素.
void SqList_Intersect(SqList A,SqList B,SqList&C)//求元素递增排列的线性表A和B的元素的交集并存入C中
if(A.elem[i]<B.elem[j]) i++;
if(A.elem[i]>B.elem[j]) j++;
C.elem[++k]=A.elem[i];//当发现了一个在A,B中都存在的元素,
void LinkList_Intersect(LinkList A,LinkList B,LinkList&C)//在链表结构上重做上题
pc=(LNode*)malloc(sizeof(LNode));
if(p->data<q->data) p=p->next;
else if(p->data>q->data) q=q->next;
s=(LNode*)malloc(sizeof(LNode));
void SqList_Intersect_True(SqList&A,SqList B)//求元素递增排列的线性表A和B的元素的交集并存回A中
if(A.elem[i]<B.elem[j]) i++;
else if(A.elem[i]>B.elem[j]) j++;
else if(A.elem[i]!=A.elem[k])
A.elem[++k]=A.elem[i];//当发现了一个在A,B中都存在的元素
i++;j++;//且C中没有,就添加到C中
while(A.elem[k]) A.elem[k++]=0;
void LinkList_Intersect_True(LinkList&A,LinkList B)//在链表结构上重做上题
p=A->next;q=B->next;pc=A;
if(p->data<q->data) p=p->next;
else if(p->data>q->data) q=q->next;
else if(p->data!=pc->data)
void SqList_Intersect_Delete(SqList&A,SqList B,SqList C)
i=0;j=0;k=0;m=0;//i指示A中元素原来的位置,m为移动后的位置
while(i<A.length&&j<B.length&& k<C.length)
if(B.elem[j]<C.elem[k]) j++;
else if(B.elem[j]>C.elem[k]) k++;
same=B.elem[j];//找到了相同元素same
while(C.elem[k]==same) k++;//j,k后移到新的元素
while(i<A.length&&A.elem[i]<same)
A.elem[m++]=A.elem[i++];//需保留的元素移动到新位置
while(i<A.length&&A.elem[i]==same) i++;//跳过相同的元素
A.elem[m++]=A.elem[i++];//A的剩余元素重新存储。
分析:先从B和C中找出共有元素,记为same,再在A中从当前位置开始,凡小于same的
元素均保留(存到新的位置),等于same的就跳过,到大于same时就再找下一个same.
void LinkList_Intersect_Delete(LinkList&A,LinkList B,LinkList C)//在链表结构上重做上题
p=B->next;q=C->next;r=A-next;
if(p->data<q->data) p=p->next;
else if(p->data>q->data) q=q->next;
u=p->data;//确定待删除元素u
while(r->next->data<u) r=r->next;//确定最后一个小于u的元素指针r
t=s;s=s->next;free(t);//确定第一个大于u的元素指针s
r->next=s;//删除r和s之间的元素
while(p->data=u) p=p->next;
while(q->data=u) q=q->next;
Status Delete_Pre(CiLNode*s)//删除单循环链表中结点s的直接前驱
while(p->next->next!=s) p=p->next;//找到s的前驱的前驱p
Status DuLNode_Pre(DuLinkList&L)//完成双向循环链表结点的pre域
for(p=L;!p->next->pre;p=p->next) p->next->pre=p;
Status LinkList_Divide(LinkList&L,CiList&A,CiList&B,CiList&C)//把单链表L的元素按类型分为三个循环链表.CiList为带头结点的单循环链表类型.
A=(CiList*)malloc(sizeof(CiLNode));p=A;
B=(CiList*)malloc(sizeof(CiLNode));q=B;
C=(CiList*)malloc(sizeof(CiLNode));r=C;//建立头结点
p->next=A;q->next=B;r->next=C;//完成循环链表
void Print_XorLinkedList(XorLinkedList L)//从左向右输出异或链表的元素值
pre=p;p=q;//任何一个结点的LRPtr域值与其左结点指针进行异或运算即得到其右结点指针
Status Insert_XorLinkedList(XorLinkedList&L,int x,int i)//在异或链表L的第i个元素前插入元素x
r=(XorNode*)malloc(sizeof(XorNode));
if(i==1)//当插入点在最左边的情况
j=1;q=p->LRPtr;//当插入点在中间的情况
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);//修改指针
Status Delete_XorLinkedList(XorlinkedList&L,int i)//删除异或链表L的第i个元素
q->LRPtr=XorP(q->LRPtr,p);
if(!q) return INFEASIBLE;//i不可以超过表长
if(L.right==q)//q为最右结点的情况
p->LRPtr=XorP(p->LRPtr,q);
r=XorP(q->LRPtr,p);//q为中间结点的情况,此时p,r分别为其左右结点
p->LRPtr=XorP(XorP(p->LRPtr,q),r);
r->LRPtr=XorP(XorP(r->LRPtr,q),p);//修改指针
void OEReform(DuLinkedList&L)//按1,3,5,...4,2的顺序重排双向循环链表L中的所有结点
while(p->next!=L&&p->next->next!=L)
p->next=p->next->next;
if(p->next==L) p->next=L->pre->pre;
p=p->next;//此时p指向最后一个偶数结点
p->next=p->pre->pre;
p->next=L;//按题目要求调整了next链的结构,此时pre链仍为原状
for(p=L;p->next!=L;p=p->next) p->next->pre=p;
L->pre=p;//调整pre链的结构,同2.32方法
分析:next链和pre链的调整只能分开进行.如同时进行调整的话,必须使用堆栈保存偶数结点的指针,否则将会破坏链表结构,造成结点丢失.
DuLNode* Locate_DuList(DuLinkedList&L,int x)//带freq域的双向循环链表上的查找
while(p.data!=x&&p!=L) p=p->next;
if(p==L) return NULL;//没找到
while(q->freq<=p->freq) q=q->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;//调整位置
float GetValue_SqPoly(SqPoly P,int x0)//求升幂顺序存储的稀疏多项式的值
while(ex<q->exp) xp*=x0;
void Subtract_SqPoly(SqPoly P1,SqPoly P2,SqPoly&P3)//求稀疏多项式P1减P2的差式P3
Create_SqPoly(P3);//建立空多项式P3
p=P1.data;q=P2.data;r=P3.data;
while(p->coef&&q->coef)
else if(p->exp<q->exp)
if((p->coef-q->coef)!=0)//只有同次项相减不为零时才需要存入P3中
r->coef=p->coef-q->coef;
while(p->coef)//处理P1或P2的剩余项
void QiuDao_LinkedPoly(LinkedPoly&L)//对有头结点循环链表结构存储的稀疏多项式L求导
L->next=p->next;p=p->next;//跳过常数项
p->data.coef*=p->data.exp--;//对每一项求导
void Divide_LinkedPoly(LinkedPoly&L,&A,&B)//把循环链表存储的稀疏多项式L拆成只含奇次项的A和只含偶次项的B
A=(PolyNode*)malloc(sizeof(PolyNode));
B=(PolyNode*)malloc(sizeof(PolyNode));
if(p->data.exp!=2*(p->data.exp/2))
文章到此结束,如果本次分享的数据结构c语言版严蔚敏电子版和数据结构严蔚敏 数据结构c语言版pdf的问题解决了您的问题,那么我们由衷的感到高兴!