
算法思想
第一种(普通算法):遍历链表,输出链表的长度,比较链表长度与k的关系,若长度小于k则失败,返回数值0。如果长度大于k,将指针移动到第倒数第k个位置,输出data的值,返回1即可。
typedef int Elemtype;//链表数据结构类型定义
typedef struct LNode{//链表结构体定义
Elemtype data;
struct LNode *link;
}LNode,*LinkList;
int sertcg(LinkList list ,int k){
LNode *p=list->link;//指针p指向第一个结点
int i=0,j=0;
while(p!=NULL){//遍历链表确定链表长度
p=p->next;
i++;
}
if(i else{ p=list->link;//指针重新开始遍历 if(j j++; p=p->link; } printf(“%d”,p->data);//返回数据元素的值 return 1;//查找成功 } 第二种(优秀算法):定义两个指针变量p和q,初始时均指向头结点的下一个结点,p指针先移动,q指针不变,如果此时p移动到第k个位置时,p,q同步移动,当p移动到最后一个结点时q所指向的结点为倒数第k个结点。 typedef int Elemtype;//链表数据结构类型定义 typedef struct LNode{//链表结构体定义 Elemtype data; struct LNode *link; }LNode,*LinkList; int serch_t(LinkList list){ LNode *p=list->link,*q=list->link;//p,q指针分别指向链表第一个结点 int count=0; while(p!=NULL){//如果此时P不为空 if(count else q=q->link;//p,q同步移动 p=p->link; } if(count else { printf(“%d”,q->data);//查找成功输出值,返回1。 return 1; } }