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

 22.[2009统考真题]已知一个带有表头结点的单链表,结点结构为
data  link
假设该链表只给出了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第 k个位置上的结点 (k为正整数)。若查找成功,算法输出该结点的 data域的值,并返回1;否则,只返回0。

本题代码如下

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;
}

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