没有合适的资源?快使用搜索试试~ 我知道了~
首页数据结构习题详解:代码示例与时间复杂度优化
数据结构习题详解:代码示例与时间复杂度优化
需积分: 9 3 下载量 48 浏览量
更新于2024-08-01
收藏 652KB DOC 举报
在严蔚敏的数据结构习题集中,提供了一些实用的编程实例来帮助初学者理解和掌握抽象的数据结构概念。本部分主要涉及三个示例,展示了如何通过代码实现特定功能: 1. 函数print_descending():这个函数用于按从大到小的顺序输出三个整数。它采用了冒泡排序算法,通过比较x、y和z的值,进行交换操作,直到找到正确的降序排列。这种算法简单直观,适用于教学目的,有助于学生理解基础排序算法的工作原理。 2. 斐波那契数列函数fib():此函数计算k阶斐波那契数列的第m项。通过迭代而非递归,它利用了空间优化,将时间复杂度降低到O(m^2),避免了递归可能导致的指数级时间消耗。通过预计算中间值,函数有效地减少了重复计算,提高了效率。 3. 数据结构定义与summary()函数:定义了一个名为resulttype的结构体,包含了运动员的运动项目、性别、学校名称、成绩以及分数等信息。另一个嵌套结构体scoretype用于存储各学校的男女人数得分和总分。summary()函数接收一个result数组,根据学校名称累加每个学校的男女总分和团体总分,体现了数据结构在处理数据汇总时的实用性。 通过这些实际代码示例,严蔚敏的数据结构习题集不仅包含了理论知识,还提供了可执行的代码,便于读者将理论与实践相结合,更好地理解和掌握数据结构中的关键概念,如排序算法和动态规划技巧。这对于提高编程技能,尤其是对于刚接触数据结构的初学者来说,是非常宝贵的资源。
资源详情
资源推荐
p->LRPtr=XorP(p.LRPtr,r);
r->LRPtr=p;
L.left=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=L.left;pre=NULL;
if(i==1) //删除最左结点的情况
{
q=p->LRPtr;
q->LRPtr=XorP(q->LRPtr,p);
L.left=q;free(p);
return OK;
}
j=1;q=p->LRPtr;
while(++j<i&&q)
{
q=XorP(p->LRPtr,pre);
pre=p;p=q;
}//while //找到待删结点 q
if(!q) return INFEASIBLE; //i 不可以超过表长
if(L.right==q) //q 为最右结点的情况
{
p->LRPtr=XorP(p->LRPtr,q);
L.right=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
2.37
void OEReform(DuLinkedList &L)//按 1,3,5,...4,2 的顺序重排双向循环链表 L 中的所有
结点
{
p=L.next;
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=L.next;
while(p.data!=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;
PolyTerm *q;
xp=1;q=P.data;
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); //建立空多项式 P3
p=P1.data;q=P2.data;r=P3.data;
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++;
}//if
p++;q++;
}//else
}//while
while(p->coef) //处理 P1 或 P2 的剩余项
{
r->coef=p->coef;
r->coef=p->coef;
r->exp=p->exp;
p++;r++;
}
剩余63页未读,继续阅读
avaterS
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 最优条件下三次B样条小波边缘检测算子研究
- 深入解析:wav文件格式结构
- JIRA系统配置指南:代理与SSL设置
- 入门必备:电阻电容识别全解析
- U盘制作启动盘:详细教程解决无光驱装系统难题
- Eclipse快捷键大全:提升开发效率的必备秘籍
- C++ Primer Plus中文版:深入学习C++编程必备
- Eclipse常用快捷键汇总与操作指南
- JavaScript作用域解析与面向对象基础
- 软通动力Java笔试题解析
- 自定义标签配置与使用指南
- Android Intent深度解析:组件通信与广播机制
- 增强MyEclipse代码提示功能设置教程
- x86下VMware环境中Openwrt编译与LuCI集成指南
- S3C2440A嵌入式终端电源管理系统设计探讨
- Intel DTCP-IP技术在数字家庭中的内容保护
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功