单链表的查找算法
- 查找元素X的序号
- 查找序号是X的元素的值
注:创建单链表的时候使用一个数组初始化,避免不停的手动输入(太麻烦)
注:查找算法的错误处理什么的不健全,大家根据需要修改
代码
#include <iostream>
using namespace std;
typedef int elemtype;
typedef struct LNode
{
elemtype data;
LNode *next;
}LNode,*LinkList;
LinkList CreListTail() //LinkList表示函数最后返回指针
{
//head表示头结点指针,s表示建立新节点的指针,r始终表示队尾指针
LinkList head,s,r; //等价于 LNode * head,*s,*r ;
head=new LNode;
head->data=0; //这里计划用头结点的数据域存储链表长度
head->next=NULL;
r=head;
elemtype testdata[]={11,22,33,44,55,66};
for (int x=0;x<6;x++)
{
s=new LNode;
s->data=testdata[x];
//r->next=s->next; //意思是把原来队尾节点的指针域(空指针NULL)赋给新队尾节点的指针域。
//后来发现上面这一句根本就不需要,在最后加上r->next=NULL即可(这样还提高了性能)
r->next=s;
r=s;
head->data++; //头结点数据域存储 除了头结点的链表长度
}
r->next=NULL;
return head;
}
//查找元素X的序号
elemtype LocateX(LinkList head,elemtype x) //根据元素查找他得序号
{
LinkList p=head->next;
int length_id=1;
while(p!=NULL&&p->data!=x)
{
p=p->next;
++length_id;
}
//return p;
return length_id;
}
//查找第X的元素的值
LinkList FindX(LinkList head,elemtype x) //根据序号查找元素
{
LinkList p=head;
if (x==0)
return head;
else if(0<x<=head->data)
{
for (int i=0;i<x;i++)
{
p=p->next;
}
return p;
}
else
{
cout<<"error"<<endl;
}
}
int DisplayList(LinkList head)
{
//下面这个while循环输出整个链表,不包含头结点
while (head->next!=NULL)
{
head=head->next;
cout<<head->data<<" ";
}
cout<<endl;
}
int main()
{
LinkList head=CreListTail();
int elem=55;
cout<<"Ordinary of the "<<elem<<" is : "<<LocateX(head,elem)<<endl;
cout<<"The length of linked list is : "<<head->data<<endl;
int ordi=6;
LinkList p=FindX(head,ordi);
cout<<"The value with ordinary "<<ordi<<" is : "<<p->data<<endl;
}