设L为带头结点的单链表, 编写算法实现从尾到头反向输出每个结点的值
void Print(LinkList L)
{
if(L->next!=NULL)
{
Print(L->next);
}
printf("%d ",L->data);
}
试编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的).
LinkList Delete(LinkList &L)
{
LNode *pre=L,p=L->next,*r;
LNode *minpre=pre,*minp=L->next;//保存最小值和他的前驱
while(p!=NULL)
{
if(p->data < minp->data) //第一次不成立
{
minp=p;
minpre=pre;
}
pre=p; //扫描下一个结点
p=p->next;
}
minpre->next=minp->next; //删除最小值的结点
free(minp);
return L;
}
试编写算法将带头结点的单链表就地逆置(所谓“就地” 是指辅助空间复杂度为O(1))
方法1
LinkList Reserve(LinkList &L)
{
LNode *p=L,*r=L->next;
L->next=NULL;
while(r!=NULL)
{
r=r->next;
p=p->next;
p->next=L;
L=p;
}
}
方法2
LinkList Reserve(LinkList L)
{
LNode *pre,*p=L->next,*r=p->next;//r是防止丢掉p后的链,
p->next=NULL;//先不处理头结点
while(r!=NULL)
{
pre=p;
p=r;
r=r->next;
p->next=pre; //指针翻转
}
L->next=p; //将头结点接上
return L;
}
有一个带头结点的单链表L,设计一个算法使其元素递增有序。(这个没怎么懂)
void Sort(LinkList &L)
{
LNode *p=L->next,pre;
LNode *r=p->next;
p->next = NULL;
p=r;
while(p!=NULL)
{
r=p->next;
pre=L;
while(pre->next != NULL && pre->next->data < P->data)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=r;
}
}
设在一个带表头结点的单链表中 所有元素结点的数据值无序,试编写一个函数
删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素(若存在).
LinkList Delete(LinkList L,ElemType x,ElemType y)
{
LNode *pre=L,*p=L->next;
while (p!=NULL)
{
if(p->data > x && p->data < y)
{
pre->next=p->next;
free§;
}
else
{
pre=p;
p=p->next;
}
}
}