⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtjd2.htm

📁 严蔚民版的数据结构的完整课件
💻 HTM
📖 第 1 页 / 共 4 页
字号:
&nbsp;&nbsp;&nbsp;&nbsp;else<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc=pb;q=pb-&gt;next;pb-&gt;next=pre;pb=q; //将B的元素插入新表<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;&nbsp;&nbsp;pre=pc;<br> 
&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;while(pa)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;q=pa-&gt;next;pa-&gt;next=pc;pc=pa;pa=q; //插入A中余下的元素<br> 
&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;while(pb)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;q=pb-&gt;next;pb-&gt;next=pc;pc=pb;pb=q; //插入B中余下的元素<br> 
&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;C=A;A-&gt;next=pc; //构造新表头<br> 
}//reverse_merge<br> 
分析:本算法的思想是,按从小到大的顺序依次把A和B的元素插入新表的头部pc处,最后处理A或B的剩余元素. 
<p>2.25 
<p>void SqList_Intersect(SqList A,SqList B,SqList &amp;C)//求元素递增排列的线性表A和B的元素的交集并存入C中<br> 
{<br> 
&nbsp;&nbsp;i=1;j=1;k=0;<br> 
&nbsp;&nbsp;while(A.elem[i]&amp;&amp;B.elem[j])<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(A.elem[i]&lt;B.elem[j]) i++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(A.elem[i]&gt;B.elem[j]) j++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(A.elem[i]==B.elem[j])<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C.elem[++k]=A.elem[i]; //当发现了一个在A,B中都存在的元素,<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;j++; //就添加到C中<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;}//while<br> 
}//SqList_Intersect 
<p>2.26 
<p>void LinkList_Intersect(LinkList A,LinkList B,LinkList &amp;C)//在链表结构上重做上题<br> 
{<br> 
&nbsp;&nbsp;p=A-&gt;next;q=B-&gt;next;<br> 
&nbsp;&nbsp;pc=(LNode*)malloc(sizeof(LNode));<br> 
&nbsp;&nbsp;while(p&amp;&amp;q)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=(LNode*)malloc(sizeof(LNode));<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s-&gt;data=p-&gt;data;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc-&gt;next=s;pc=s;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=p-&gt;next;q=q-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;}//while<br> 
&nbsp;&nbsp;C=pc;<br> 
}//LinkList_Intersect 
<p>2.27 
<p>void SqList_Intersect_True(SqList &amp;A,SqList B)//求元素递增排列的线性表A和B的元素的交集并存回A中<br> 
{<br> 
&nbsp;&nbsp;i=1;j=1;k=0;<br> 
&nbsp;&nbsp;while(A.elem[i]&amp;&amp;B.elem[j])<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(A.elem[i]&lt;B.elem[j]) i++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else if(A.elem[i]&gt;B.elem[j]) j++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else if(A.elem[i]!=A.elem[k])<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.elem[++k]=A.elem[i]; //当发现了一个在A,B中都存在的元素<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;j++; //且C中没有,就添加到C中<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;}//while<br> 
&nbsp;&nbsp;while(A.elem[k]) A.elem[k++]=0;<br> 
}//SqList_Intersect_True 
<p>2.28 
<p>void LinkList_Intersect_True(LinkList &amp;A,LinkList B)//在链表结构上重做上题<br> 
{<br> 
&nbsp;&nbsp;p=A-&gt;next;q=B-&gt;next;pc=A;<br> 
&nbsp;&nbsp;while(p&amp;&amp;q)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else if(p-&gt;data!=pc-&gt;data)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc=pc-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc-&gt;data=p-&gt;data;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=p-&gt;next;q=q-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;}//while<br> 
}//LinkList_Intersect_True 
<p>2.29 
<p>void SqList_Intersect_delete(SqList &amp;A,SqList B,SqList C)//从有序顺序表A中删除那些在B和C中都出现的元素<br> 
{<br> 
&nbsp;&nbsp;i=1;j=1;k=1;<br> 
&nbsp;&nbsp;while(B.elem[i]&amp;&amp;C.elem[j])<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(B.elem[i]&lt;C.elem[j]) i++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else if(B.elem[i]&gt;C.elem[j]) j++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else //找到了需要从A中删除的元素<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u=B.elem[i];<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(A.elem[k]&lt;u) k++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(;A.elem[k]==u;k++)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A.elem[k]=INFINITY; //把A中待删除元素置换为特殊记号<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(B.elem[i]==u) i++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(C.elem[j]==u) j++;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}//else<br> 
&nbsp;&nbsp;}//while<br> 
&nbsp;&nbsp;for(i=1,j=1;j&lt;=A.length;i++) //第二遍扫描A,删除特殊记号<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;while(A.elem[j]==INFINITY)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j++;A.length--;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(i&lt;j) A.elem[i]=A.elem[j];//执行&quot;紧缩&quot;操作<br> 
&nbsp;&nbsp;&nbsp;&nbsp;j++;<br> 
&nbsp;&nbsp;}//for<br> 
}//SqList_Intersect_delete<br> 
分析:本算法的时间复杂度为O(m),m为表长.思考:你自己的算法时间复杂度是多少?实际上也可以只用一遍扫描就完成整个操作,且时间复杂度也为O(m),但非常复杂,你能写出来吗? 
<p>2.30 
<p>void LinkList_Intersect_delete(LinkList &amp;A,LinkList B,LinkList C)//在链表结构上重做上题<br> 
{<br> 
&nbsp;&nbsp;p=B-&gt;next;q=C-&gt;next;r=A-next;<br> 
&nbsp;&nbsp;while(p&amp;&amp;q&amp;&amp;r)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(p-&gt;data&lt;q-&gt;data) p=p-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else if(p-&gt;data&gt;q-&gt;data) q=q-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u=p-&gt;data; //确定待删除元素u<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(r-&gt;next-&gt;data&lt;u)  
r=r-&gt;next; //确定最后一个小于u的元素指针r<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(r-&gt;next-&gt;data==u)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=r-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(s-&gt;data==u)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=s;s=s-&gt;next;free(t);  
//确定第一个大于u的元素指针s<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//while<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r-&gt;next=s; //删除r和s之间的元素<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//if<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(p-&gt;data=u) p=p-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(q-&gt;data=u) q=q-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}//else<br> 
&nbsp;&nbsp;}//while<br> 
}//LinkList_Intersect_delete 
<p>2.31 
<p>Status Delete_Pre(CiLNode *s)//删除单循环链表中结点s的直接前驱<br> 
{<br> 
&nbsp;&nbsp;p=s;<br> 
&nbsp;&nbsp;while(p-&gt;next-&gt;next!=s) p=p-&gt;next; //找到s的前驱的前驱p<br> 
&nbsp;&nbsp;p-&gt;next=s;<br> 
&nbsp;&nbsp;return OK;<br> 
}//Delete_pre 
<p>2.32 
<p>Status DuLNode_pre(DuLinkList &amp;L)//完成双向循环链表结点的pre域<br> 
{<br> 
&nbsp;&nbsp;for(p=L;!p-&gt;next-&gt;pre;p=p-&gt;next) p-&gt;next-&gt;pre=p;<br> 
&nbsp;&nbsp;return OK;<br> 
}//DuLNode_pre 
<p>2.33 
<p>Status LinkList_divide(LinkList &amp;L,CiList &amp;A,CiList &amp;B,CiList  
&amp;C)//把单链表L的元素按类型分为三个循环链表.CiList为带头结点的单循环链表类型.<br> 
{<br> 
&nbsp;&nbsp;s=L-&gt;next;<br> 
&nbsp;&nbsp;A=(CiList*)malloc(sizeof(CiLNode));p=A;<br> 
&nbsp;&nbsp;B=(CiList*)malloc(sizeof(CiLNode));q=B;<br> 
&nbsp;&nbsp;C=(CiList*)malloc(sizeof(CiLNode));r=C; //建立头结点<br> 
&nbsp;&nbsp;while(s)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(isalphabet(s-&gt;data))<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;next=s;p=s;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else if(isdigit(s-&gt;data))<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q-&gt;next=s;q=s;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r-&gt;next=s;r=s;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;}//while<br> 
&nbsp;&nbsp;p-&gt;next=A;q-&gt;next=B;r-&gt;next=C; //完成循环链表<br> 
}//LinkList_divide 
<p>2.34 
<p>void Print_XorLinkedList(XorLinkedList L)//从左向右输出异或链表的元素值<br> 
{<br> 
&nbsp;&nbsp;p=L.left;pre=NULL;<br> 
&nbsp;&nbsp;while(p)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%d&quot;,p-&gt;data);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;q=XorP(p-&gt;LRPtr,pre);<br> 
&nbsp;&nbsp;&nbsp;&nbsp;pre=p;p=q; //任何一个结点的LRPtr域值与其左结点指针进行异或运算即得到其右结点指针<br> 
&nbsp;&nbsp;}<br> 
}//Print_XorLinkedList 
<p>2.35 
<p>Status Insert_XorLinkedList(XorLinkedList &amp;L,int x,int i)//在异或链表L的第i个元素前插入元素x<br> 
{<br> 
&nbsp;&nbsp;p=L.left;pre=NULL;<br> 
&nbsp;&nbsp;r=(XorNode*)malloc(sizeof(XorNode));<br> 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -