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

📄 xtjd2.htm

📁 严蔚民版的数据结构的完整课件
💻 HTM
📖 第 1 页 / 共 4 页
字号:
&nbsp;&nbsp;&nbsp; }<br>    
&nbsp;&nbsp;&nbsp; else {<br>     
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qn=q->next; q->next=c->next;<br>     
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c->next=q; q=qn;<br>     
&nbsp;&nbsp;&nbsp; }<br>    
&nbsp; while (p) {pn=p->next; p->next=c->next; c->next=p; p=pn;}&nbsp;<br>    
&nbsp; while (q) {qn=q->next; q->next=c->next; c->next=q; q=qn;}<br>     
&nbsp; free(b);<br>    
}//MergeList<br>    
<br>    
2.33<br>    
void CutApart-LinkList(LinkList &amp;l, LinkList la, LinkList lb, LinkList lc){<br>    
&nbsp; //单链表l中的元素含有三类字符:字母、数字和其它字符<br>    
&nbsp; //本算法将l分割为la、lb和lc三个循环链表,它们分别只含字母、数字和其它字符<br>    
&nbsp; la=(LinkList)malloc(sizeof(LNode)); la->next=la;<br>     
&nbsp; lb=(LinkList)malloc(sizeof(LNode)); lb->next=lb;<br>     
&nbsp; lc=(LinkList)malloc(sizeof(LNode)); lc->next=lc;<br>     
&nbsp; pn=l->next;<br>    
&nbsp; while (pn){<br>     
&nbsp;&nbsp;&nbsp; p=pn; pn=pn->next;<br>     
&nbsp;&nbsp;&nbsp; switch {<br>     
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ('a'&lt;=p->data &amp;&amp; p->data&lt;='z')<br>     
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||('A'&lt;=p->data &amp;&amp; p->data&lt;='Z') : p->next=la->next; la->next=p; break;&nbsp;<br>    
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ('0'&lt;=p->data &amp;&amp; p->data&lt;='9') : p->next=lb->next; lb->next=p; break;<br>     
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default : p->next=lc->next; lc->next=p;<br>     
&nbsp;&nbsp;&nbsp; }//switch<br>    
&nbsp; }//while<br>    
&nbsp; free(l);<br>    
}//CutApart-LinkList<br>    
<br>    
2.39<br>    
typedef struct {<br>     
&nbsp; float  coef;<br>     
&nbsp; int    expn;<br>     
}*Poly, ElemType;<br>     
<br>     
float Polynomial(Poly &amp;p, int m, float x0){<br>     
&nbsp; //多项式p的顺序存储结构中依次存放有c<sub>1</sub>,e<sub>1</sub>,c<sub>2</sub>,e<sub>2</sub>,...,c<sub>m</sub>,e<sub>m</sub><br>   
&nbsp; //x<sub>0</sub>为给定值,本算法计算p<sub>n</sub>(x<sub>0</sub>)的值<br>   
&nbsp; x=x0^p[0].expn;<br>    
&nbsp; pn=p[0].coef*x;<br>    
&nbsp; for (i=1; i&lt;=m; ++i){<br>     
&nbsp;&nbsp;&nbsp;&nbsp; x=x*x0^(p[i].expn-p[i-1].expn);<br>    
&nbsp;&nbsp;&nbsp;&nbsp; pn=pn+p[i].coef*x;<br>    
&nbsp; }<br>    
&nbsp; retrun pn;<br>    
}//Polynomial</font></p>    
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0" align="left"> </p> 
<font color="#0000FF">(以下内容来自http://bbs.kaoyan.com)</font>
<p> 
第二章 线性表</p> 
<p>2.10 
<p>Status DeleteK(SqList &amp;a,int i,int k)//删除线性表a中第i个元素起的k个元素<br> 
{<br> 
&nbsp;&nbsp;if(i&lt;1||k&lt;0||i+k-1&gt;a.length) return INFEASIBLE;<br> 
&nbsp;&nbsp;for(count=1;i+count-1&lt;=a.length-k;count++) //注意循环结束的条件<br> 
&nbsp;&nbsp;&nbsp;&nbsp;a.elem[i+count-1]=a.elem[i+count+k-1];<br> 
&nbsp;&nbsp;a.length-=k;<br> 
&nbsp;&nbsp;return OK;<br> 
}//DeleteK 
<p>2.11 
<p>Status Insert_SqList(SqList &amp;va,int x)//把x插入递增有序表va中<br> 
{<br> 
&nbsp;&nbsp;if(va.length+1&gt;va.listsize) return ERROR;<br> 
&nbsp;&nbsp;va.length++;<br> 
&nbsp;&nbsp;for(i=va.length-1;va.elem[i]&gt;x&amp;&amp;i&gt;=0;i--)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;va.elem[i+1]=va.elem[i];<br> 
&nbsp;&nbsp;va.elem[i+1]=x;<br> 
&nbsp;&nbsp;return OK;<br> 
}//Insert_SqList 
<p>2.12 
<p>int ListComp(SqList A,SqList B)//比较字符表A和B,并用返回值表示结果,值为正,表示A&gt;B;值为负,表示A&lt;B;值为零,表示A=B<br> 
{<br> 
&nbsp;&nbsp;for(i=1;A.elem[i]||B.elem[i];i++)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(A.elem[i]!=B.elem[i]) return A.elem[i]-B.elem[i];<br> 
&nbsp;&nbsp;return 0;<br> 
}//ListComp 
<p>2.13 
<p>LNode* Locate(LinkList L,int x)//链表上的元素查找,返回指针<br> 
{<br> 
&nbsp;&nbsp;for(p=l-&gt;next;p&amp;&amp;p-&gt;data!=x;p=p-&gt;next);<br> 
&nbsp;&nbsp;return p;<br> 
}//Locate 
<p>2.14 
<p>int Length(LinkList L)//求链表的长度<br> 
{<br> 
&nbsp;&nbsp;for(k=0,p=L;p-&gt;next;p=p-&gt;next,k++);<br> 
&nbsp;&nbsp;return k;<br> 
}//Length 
<p>2.15 
<p>void ListConcat(LinkList ha,LinkList hb,LinkList &amp;hc)//把链表hb接在ha后面形成链表hc<br> 
{<br> 
&nbsp;&nbsp;hc=ha;p=ha;<br> 
&nbsp;&nbsp;while(p-&gt;next) p=p-&gt;next;<br> 
&nbsp;&nbsp;p-&gt;next=hb;<br> 
}//ListConcat 
<p>2.16 
<p>见书后答案. 
<p>2.17 
<p>Status Insert(LinkList &amp;L,int i,int b)//在无头结点链表L的第i个元素之前插入元素b<br> 
{<br> 
&nbsp;&nbsp;p=L;q=(LinkList*)malloc(sizeof(LNode));<br> 
&nbsp;&nbsp;q.data=b;<br> 
&nbsp;&nbsp;if(i==1)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;q.next=p;L=q; //插入在链表头部<br> 
&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;else<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;while(--i&gt;1) p=p-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;q-&gt;next=p-&gt;next;p-&gt;next=q; //插入在第i个元素的位置<br> 
&nbsp;&nbsp;}<br> 
}//Insert 
<p>2.18 
<p>Status Delete(LinkList &amp;L,int i)//在无头结点链表L中删除第i个元素<br> 
{<br> 
&nbsp;&nbsp;if(i==1) L=L-&gt;next; //删除第一个元素<br> 
&nbsp;&nbsp;else<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;p=L;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;while(--i&gt;1) p=p-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;next=p-&gt;next-&gt;next; //删除第i个元素<br> 
&nbsp;&nbsp;}<br> 
}//Delete 
<p>2.19 
<p>Status Delete_Between(Linklist &amp;L,int mink,int maxk)//删除元素递增排列的链表L中值大于mink且小于maxk的所有元素<br> 
{<br> 
&nbsp;&nbsp;p=L;<br> 
&nbsp;&nbsp;while(p-&gt;next-&gt;data&lt;=mink) p=p-&gt;next; //p是最后一个不大于mink的元素<br> 
&nbsp;&nbsp;if(p-&gt;next)&nbsp;&nbsp;&nbsp;&nbsp;//如果还有比mink更大的元素<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;q=p-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;while(q-&gt;data&lt;maxk) q=q-&gt;next; //q是第一个不小于maxk的元素<br> 
&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;next=q;<br> 
&nbsp;&nbsp;}<br> 
}//Delete_Between 
<p>2.20 
<p>Status Delete_Equal(Linklist &amp;L)//删除元素递增排列的链表L中所有值相同的元素<br> 
{<br> 
&nbsp;&nbsp;p=L-&gt;next;q=p-&gt;next; //p,q指向相邻两元素<br> 
&nbsp;&nbsp;while(p-&gt;next)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(p-&gt;data!=q-&gt;data)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=p-&gt;next;q=p-&gt;next; //当相邻两元素不相等时,p,q都向后推一步<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;&nbsp;&nbsp;else<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(q-&gt;data==p-&gt;data) q=q-&gt;next;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;next=q;p=q;q=p-&gt;next; //当相邻元素相等时删除多余元素<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;}//while<br> 
}//Delete_Equal 
<p>2.21 
<p>void reverse(SqList &amp;A)//顺序表的就地逆置<br> 
{<br> 
&nbsp;&nbsp;for(i=1,j=A.length;i&lt;j;i++,j--)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;A.elem[i]&lt;-&gt;A.elem[j];<br> 
}//reverse 
<p>2.22 
<p>void LinkList_reverse(Linklist &amp;L)//链表的就地逆置;为简化算法,假设表长大于2<br> 
{<br> 
&nbsp;&nbsp;p=L-&gt;next;q=p-&gt;next;s=q-&gt;next;p-&gt;next=NULL;<br> 
&nbsp;&nbsp;while(s-&gt;next)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;q-&gt;next=p;p=q;<br> 
&nbsp;&nbsp;&nbsp;&nbsp;q=s;s=s-&gt;next; //把L的元素逐个插入新表表头<br> 
&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;q-&gt;next=p;s-&gt;next=q;A-&gt;next=s;<br> 
}//LinkList_reverse<br> 
分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头. 
<p>2.23 
<p>void merge1(LinkList &amp;A,LinkList &amp;B,LinkList &amp;C)//把链表A和B合并为C,A和B的元素间隔排列,且使用原存储空间<br> 
{<br> 
&nbsp;&nbsp;p=A-&gt;next;q=B-&gt;next;C=A;<br> 
&nbsp;&nbsp;while(p&amp;&amp;q)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;s=p-&gt;next;p-&gt;next=q; //将B的元素插入<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(s)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=q-&gt;next;q-&gt;next=s; //如A非空,将A的元素插入<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 
&nbsp;&nbsp;&nbsp;&nbsp;p=s;q=t;<br> 
&nbsp;&nbsp;}//while<br> 
}//merge1 
<p>2.24 
<p>void reverse_merge(LinkList &amp;A,LinkList &amp;B,LinkList &amp;C)//把元素递增排列的链表A和B合并为C,且C中元素递减排列,使用原空间<br> 
{<br> 
&nbsp;&nbsp;pa=A-&gt;next;pb=B-&gt;next;pre=NULL; //pa和pb分别指向A,B的当前元素<br> 
&nbsp;&nbsp;while(pa&amp;&amp;pb)<br> 
&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;if(pa-&gt;data&lt;pb-&gt;data)<br> 
&nbsp;&nbsp;&nbsp;&nbsp;{<br> 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc=pa;q=pa-&gt;next;pa-&gt;next=pre;pa=q; //将A的元素插入新表<br> 
&nbsp;&nbsp;&nbsp;&nbsp;}<br> 

⌨️ 快捷键说明

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