问答题 针对带表头结点的单链表,试编写下列函数:
问答题 定位函数Locate:在单链表中寻找第i个结点。若找到,则函数返回第i个结点的地址;若找不到,则函数返回NULL。
【正确答案】
【答案解析】实现定位函数的算法
LinkedNode*Locate(LinkList L,int i){
//取得单链表中第i个结点地址,i从0开始计数,i=0定位于表头结点
if(i<0)return NULL; //位置i在表中不存在
LinkedNode *p=L;Int k=0; //从表头结点开始检测
while(p!=NULL&&k<i) //p==NULL表示链短,无第i个结点
{p=p->link;k++;}
return p; //否则k==i,返回第i个结点地址
}
问答题 求最大值函数:Max:通过一趟遍历在单链表中确定值最大的结点。
【正确答案】
【答案解析】实现求最大值的函数
LinkedNode * Max(LinkList L){
//在单链表中进行一趟检测,找出具有最大值的结点地址,如果表空,返回指针NULL
if(L->link==NULL)return NULL; //空表,返回指针NULL
LinkedNode * pmax=L->link,p=L->link->link;
//假定头结点中数据值最大
while(p!=NULL){ //循环,下一个结点存在
if(p->data>pmax->data)pmax=p;
//pmax记忆找到的具有最大值结点
p=p->link; //检测下一个结点
}
return pmax;
}
问答题 统计函数Count:统计单链表中具有给定值x的所有元素。
【正确答案】
【答案解析】实现统计单链表中具有给定值x的所有元素的函数
int Count(LinkList L,DataType x){
//在单链表中进行一趟检测,统计具有给定值x的结点,如果表空,返回0
int n=0;
LinkedNode * p=L->link; //从第一个结点开始检测
while(p!=NULL){ //循环,想结点存在
if(p->data==x)n++; //找到一个,计数器加1
p=p->link; //检测下一个结点
}
return n;
}
问答题 建立函数Create:根据一维数组a[n]建立一个单链表,使单链表中各元素的次序与a[n]中各元素的次序相同,要求该程序的时间复杂度为O(n)。
【正确答案】
【答案解析】实现从一维数组a[n]建立单链表的函数
void Create(LinkList&L,DtatType a[ ],int n){
//根据书中a[n]建立一个单链表,单链表中各元素次序与a[n]中各元素次序相同
LinkedNode * rear;
L=rear=new LinkedNode; //创建表头结点
for(int i=0;i<n;i++){
rear->link=new LinkedNode; //链入一个新结点,值为a[i]
rear=rear->link; //rear指向链中尾结点
rear->data=A[i];
}
rear->link=NULL;
}
采用递归方法实现时,需要通过引用参数将已建立的单链表各个结点链接起来。为此,在递归地扫描数组a[n]的过程中,先建立单链表的各个结点,在推出递归时将结点的p(被调用层的形参)带回上一层(调用层)的实参p->link。
void Create(DataType a[ ],int n,int i,LinkedNode * &p){
if(i==n)p=NULL;
else{
p=new LinkedNode;
p->data=A[i];p->link=NULL; //建立链表的新结点
createList(A,n,i+1,p->link);
//递归返回时通过p->link链接
}
}
外部调用递归过程的语句为:
L=new LinkedNode; //建立表头结点
Create(a,n,0,L->link); //递归建立单链表
问答题 整理函数Tidyup:在非递减有序的单链表中删除值相同的多余结点。
【正确答案】
【答案解析】实现在非递减有序的单链表中删除值相同的多余结点的函数
void Tidyup(LinkList L){
LinkedNode * p=L->link,temp; //检测指针p指向首元结点
while(p!=NULL&&p->link!=NULL) //循环检测链表
if(p->data==p->link->data){
temp=p->link:p->link=temp->link;
delete temp;
}
else p=p->link; //指针p进到链表下一个结点
} [解析] 针对带表头结点的单链表,试编写下列函数: