王道数据结构课后代码题p41 第22题请设计一个尽可能高效的算法,查找链表中倒数第 k个位置上的结点 (k为正整数)。若查找成功,算法输出该结点的 data域的值(c语言代码实现)

    定义两个指针变量p 和g,初始时均指向头结点的下一个结点(链表的第一个结点),p 指针沿链表移动:当p 指针移动到第  个结点时, 指针开始与p 指针同步移动:当p指针移动到最后一个结点时,g 指针所指示结点为倒数第 k 个结点。  

 本题代码如下

void find(linklist* L,int x)//找到倒数第k个的值
{
	lnode* p = (*L)->link, * q = (*L)->link;
	int count = 0;
	while (p != NULL)//遍历链表直到最后一个结点
	{
		if (count < x)//计数,若countlink;//之后让p、q同步遍历
		p = p->link;
	}
	if (count < x)
		printf("查找失败");
	else
		printf("%d", q->data);
}

完整测试代码如下

#include
#include
typedef struct lnode
{
	int data;
	struct lnode* link;
}lnode,*linklist;
int n = 5;
int a[5] = { 1,2,3,4,5 };
void buildlinklist(linklist* L)
{
	*L = (lnode*)malloc(sizeof(lnode));
	(*L)->link = NULL;
	lnode* s, * r = *L;
	int i = 0;
	for (i = 0; i < n; i++)
	{
		s = (lnode*)malloc(sizeof(lnode));
		s->data = a[i];
		s->link = r->link;
		r->link = s;
		r = s;
	}
	r->link = NULL;
}
void find(linklist* L,int x)//找到倒数第k个的值
{
	lnode* p = (*L)->link, * q = (*L)->link;
	int count = 0;
	while (p != NULL)//遍历链表直到最后一个结点
	{
		if (count < x)//计数,若countlink;//之后让p、q同步遍历
		p = p->link;
	}
	if (count < x)
		printf("查找失败");
	else
		printf("%d", q->data);
}
int main()
{
	linklist L;
	buildlinklist(&L);
	find(&L, 2);
	return 0;
}

2fab91e7c3804e059119890944291016.png

f68deb72e83b458aa2ee2a3481d13d6a.png

你可能感兴趣的:(王道课后习题单链表,数据结构,c语言,算法,链表)