单链表 简单算法设计题1

设计一个算法删除单链表L中第一个值为x的结点

int del_x(LinkNode * &L,ElemType x)
{
	LinkNode *pre = L,*p = pre->next;
	while((p!=NULL)&&(p->data!=x))
	{
		pre=p;p=p->next;
	}
	if(p!=NULL)
	{
		pre->next = p->next;
		free(p);
		return 1;
	}
	else
		return -1;
}

设计一个算法删除单链表L(含两个或两个以上的数据结点)中第一个值为x的结点的前驱结点

这里需要考虑第一个结点若为x,则没有前驱结点

int del_pre_x(LinkNode * &L,ElemType x)
{
	LinkNode *prepre = L,*pre = prepre->next,*p;
	if(pre->data == x)
		return -1;//第一个节点为x,则说明没有能删除的前驱结点
	p = pre->next;
	while((p!=NULL)&&(p->data!=x))
	{
		prepre=pre;
		pre = p;
		p=p->next;
	}
	if(p!=NULL)
	{
		prepre->next = p;
		free(pre);
		return 1;
	}
	else
		return -1;
}

设计一个算法判定单链表L是否是递增有序

int increase(LinkNode *L)
{
	LinkNode *pre = L->next,*p;
	p = pre->next;
	while(p!=NULL)
	{
		if(p->data>pre->data)
		{
			pre = p;
	一个		p=p->next;
		}
		else
			return -1;
	}
	return 1;
}

设计一个在删除带头结点的单链表L中删除第一个最小值结点的算法

设置4个指针


void delminnode(LinkNode * &L)
{
	LinkNode *pre = L,*p = pre->next,*minpre = L,*minp = minpre->next;
	while(p!=NULL)
	{
		if(p->data < minp->data)
		{
			minp = p;
			minpre = pre;
		}
        	pre = p;
			p=p->next;
	}
		minpre = minp->next;
		free(minp);
		return 0;
}

有一个线性表(a1,a2,…,an),n>=2,采用带头结点的单链表L存储,设计一个算法将其就地逆置。所谓就地,指辅助空间为O(1).

void Reverse2(LinkNode * &L)
{
	LinkNode *pre = L->next,*p,*post;
	p=pre->next;
	pre->next =  NULL;
	while(p!=NULL)
	{
		post = p->next;
		p->next = pre;
		pre = p;
		p = post;
	}
	L->next = pre;
}

你可能感兴趣的:(数据结构)