数据结构线性表习题(二)

给定一带头结点的长度为n的线性单链表L,如何只遍历一次链表,就能删除其中第k小元素的结点


设计思想:创建一个长度为k的指针数组,保存前k小元素结点的前驱结点的指针。每遍历一个结点都需要查找指针数组,前k次直接插入不需要置换,以后需要用指针数组中所指结点的后继结点的最大值,和当前结点值比较,若当前结点值小,则置换并重新求出max。直到遍历结束,在单链表中删除指针数组中max指向的下一个结点。


代码:


void Delete_Kst(LinkList L,int k)
{
	LNode * index[]=(LNode**)malloc(k*sizeof(LNode *));
	LNode * pre= L;
	*p= L->link;
	int i;
	int max=0;
	
	while(p!=NULL)
	{
		if(index[k-1]==NULL)
		{
			for(i=0;index[i]!=NULL&&idata>index[max]->link->data)
			{
				max=i;
			}
			else if(p->datalink->data)
			{
				index[max]=pre;
				for(i=0;ilink->data>index[max]->link->data)
					{
						max=i;
					}
				}
			}
			pre=p;
			p=p->link;
		}
	}
	p=index[max]->link;
	index[max]->link=p->link;
	free(p);
}


你可能感兴趣的:(程序人生)