《数据结构与算法 C语言版》—— 2.4典型例题

简介:

本节书摘来自华章出版社《数据结构与算法 C语言版》一 书中的第2章,第2.4节,作者:徐凤生,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4典型例题

例1顺序表La和Lb的结点的数据元素是整数,La和Lb中的元素非递减有序,线性空间足够大。试编写一个高效算法,将Lb中的元素合并到La中,使新的La的元素仍非递减有序。高效是指最大限度地避免移动元素。
解顺序表的插入的时间复杂度为O(n),平均移动近一半的元素。顺序表La和Lb合并时,若从第一个元素开始,一定会造成元素后移,这不符合本题“高效算法”的要求。另外,题中“线性空间足够大”也暗示出另外的合并方式,即应从顺序表的最后一个元素开始比较,较大者放在最终位置。算法如下:

void unionsqlist(SqList La,SqList &Lb){
int m,n,k,i,j;
m=La.length;n=Lb.length;
k=m+n-1;//La中最后一个元素的位置
i=m-1;j=n-1;//i,j为工作指针
while(i>=0&&j>=0){
if(La.elem[i]>=Lb.elem[j])La.elem[k--]=La.elem[i--];
else La.elem[k--]=Lb.elem[j--];
}
while(j>=0)La.elem[k--]=Lb.elem[j--];
La.length=m+n;
}

例2设L为单链表的头结点指针,单链表的每个结点由一个整数域data和指针域next组成,整数在单链表中是无序的。设计算法,将链表中的结点分成一个奇数链和一个偶数链,分别由P、Q指向,每个链表中的数据按由小到大的顺序排列,算法中不得申请新的结点空间。
解本题要求将一个链表分解成两个链表,两个链表都要有序,两个链表的建立过程中不得申请新的空间,因此原链表无头结点,且新链表要利用原链表的空间,随着原链表的分解,新建链表随之排序。算法如下:

void discreate(LinkList &L,LinkList &P,LinkList &Q){//将链表L分解成两个有序链表P和Q
LNode p,q,s,r,*pre;
p=NULL;Q=NULL;
s=L;
while(s){
r=s->next;
if(s->data mod 2==0){
if(!P){P=s;P->next=NULL;}
else{
pre=P;
if(pre->data>s->data){s->next=pre;P=s;}
else{
while(pre->next){
if(pre->next->datadata)pre=pre->next;
s->next=pre->next;
pre-next=s;
}
}
}
else{
if(!Q){Q=s;Q->next=NULL;}
else{
pre=Q;
if(pre->data>s->data){s->next=pre;Q=s;}
else{
while(pre->next){
if(pre->next->datadata)pre=pre->next;
s->next=pre->next;
pre-next=s;
}
}
}
s=r;
}

例3假设有一个带有头结点的单循环链表,其结点含有三个域prior、data、next。其中data为数据域;prior为指针域,它的值为空指针;next为指针域,它指向后继结点。设计算法,将此表改成双循环链表。
解将具有两个指针域的单循环链表改造成双循环链表,关键是给每个结点均置上指向前驱的指针,而且每个结点的前驱指针置且仅置一次。算法如下:

void setdoublelinklist(LinkList &L){
while(L->next->pre==NULL){
L->next->pre=L;
L=L->next;
}
}
例4在一个递增有序的链表中,有数据相同的元素存在,编写算法删去数据相同的结点,使链表不再有重复的数据元素。
解在一个递增有序的链表中,删去数据相同的结点,要知道被删除结点的前驱结点。算法如下:

void deletesame(LinkList &L){
LNode pre,p,*q;
pre=L->next;//pre指向p所指结点的前驱结点
p=pre->next;//p是工作指针,设表中至少有一个结点
while(p)
if(p->data==pre->data){
q=p;
p=p->next;
delete q;
}
else{
pre->next=p;
pre=p;
p=p->next;
}
pre->next=p;
}

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
476 1
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
算法 C语言 计算机视觉
【数据结构与算法 经典例题】括号匹配问题
【数据结构与算法 经典例题】括号匹配问题
|
算法
【数据结构与算法 经典例题】随机链表的复制(图文详解)
【数据结构与算法 经典例题】随机链表的复制(图文详解)
|
算法 C语言
【数据结构与算法 经典例题】链表的回文结构(图文详解)
【数据结构与算法 经典例题】链表的回文结构(图文详解)
|
算法
【数据结构与算法 经典例题】反转链表(图文详解)
【数据结构与算法 经典例题】反转链表(图文详解)
|
6月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
583 0
|
6月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
374 2

热门文章

最新文章