算法设计思想:设置两个LNode*的指针p、q初始指向Seqlist L 的头节点的下一个位置(带头结点的单链表),先移动p节点,q不动,设置count记录与p的相对位置,当count<k是只移动p,直到count==k时,下一次及以后p与q一起后移,直到p指向NULL时循环停止,此时q所指向的结点即为所求,打印输出该节点的data域。
算法详细步骤:
①count=0;p和q指向链表头节点的下一个结点
②若count<k&&p!=NULL,则count++;p指向p的下一个结点,q不动
③若count==k&&p!=NULL则p和q一起向前
④若count<k&&p指向NULL说明查找失败返回false
⑤若count==k且p指向NULL说明查找成功,输出q的data域
给出算法实现:
(考试写的代码片段)://注意写在main的外面
typedef int Elemtype;
typedef struct LNode
{
Elemtype data;
struct LNode* link;
}LNode, * LinkList;
bool search_k(LinkList L, int k)
{
LNode* p = L->link, * q = L->link;
int count = 0;
while (p != NULL)
{
if (count < k)
{
count++;
p = p->link;
}
else
{
p = p->link;
q = q->link;
}
}
if (count < k)return false;
else
{
cout << q->data;
return true;
}
}
(可以执行的完整代码):
"linklist.hpp"文件(核心代码在此):
#pragma once
#include<string>
#include <ctime>
#include <iostream>
using namespace std;
typedef struct LNode//链式实现的线性表的节点Node定义
{
int data;
LNode* next;
}LNode,*Linklist;
class Seqlist//链式实现的线性表
{
public:
void Initlist(int len);
void printlist();
bool search_rek_elem(int k);//查找倒数第k个节点
private:
LNode* first;//链表头指针,带头结点
};
void Seqlist::Initlist(int len)
{
this->first = new LNode;
this->first->data = len;//链表长度
this->first->next = NULL;//指向头节点
for (int i = 0; i < len; i++)
{
LNode* n = new LNode;
n->data = rand() % 61;
n->next = this->first->next;
this->first->next = n;
}
}
void Seqlist::printlist()
{
LNode* p = this->first->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
bool Seqlist::search_rek_elem(int k)//查找倒数第k个节点
{
LNode* p = this->first->next;//线性表的首元素为头节点的next指向节点
LNode* q = this->first->next;
int count = 0;
while (p != NULL)//没到表尾则循环遍历
{
if (count < k)
{
p = p->next;
count++;
}
else
{
p = p->next;
q = q->next;
}
}
if (count < k)return false;
else
{
cout << "链表倒数第k个节点为:" << q->data << endl;
return true;
}
}
源文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdbool.h>
#include "seqlist.hpp"
int main()
{
srand((unsigned)time(NULL));
Seqlist L;
int len,k;
cout << "请输入您要创建的链接表长度:";
cin >> len;
L.Initlist(len);
L.printlist();
cout << "\n请输入您要查询的倒数第k个节点k=";
cin >> k;
L.search_rek_elem(k);
system("pause");
return 0;
}