您的位置:首页 > 理论基础 > 数据结构算法

3.单链表内元素的查找

2010-05-02 09:32 120 查看
多的不说,对于这些概念等在严蔚敏老师的书中都讲的很详细,这里是给大家分享一些实例。让大家加深数据结构的学习。
希望大家多多支持:
C++奋斗乐园|C++论坛|算法学习|ACM/ICPC :http://www.cppleyuan.com/

豆瓣小组:http://www.douban.com/group/217679/

②群:23840480

/********************************              单链表的查找                 ********************************/

//算法功能:按序号或按值查找单链表中的元素
//算法思路:由于单链表是非顺序存储结构,元素之间通过指针来描述逻辑结构,因而无法实现随机存取,查找过程只能是
//顺链扫描。若查找单链表中第i个元素,则要从单链表的第一个结点开始,用p做标记指针,j做计数器,顺序扫描链表。
//当p不为空,而且 j=i 时,指针p所指结点元素即为所要找的第i个元素,用e返回该元素的值。按值查找则是从单链表
//头结点开始,用p做标记指针,i做计数器,当p不为空,p所指的当前结点元素与e比较,若相等则返回该结点在链表中
//的位置i,否则返回0,表示查找失败。

#include <stdio.h>
#include <malloc.h>

typedef int Status;
#define OK 1;
#define ERROR 0;

//定义链表数据存储结构
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *Linklist;

//打印链表元素
void print_list(Linklist L)
{
Linklist p;
printf("建立的单链表为:/n");
p = L->next;
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("/n");
}

//逆序输入数据元素,建立带头结点的单链表
void creat_list(Linklist &L)
{
Linklist p;
L = (LNode*) malloc (sizeof(LNode));   //建立链表头结点
L->next = NULL;
printf("请逆序输入链表数据元素Ctrl+Z结束,建立带头结点的链表:/n");
p = (LNode*) malloc (sizeof(LNode));
while((scanf("%d", &(p->data))) != EOF)   // 按Ctrl+Z组合键结束输入
{
p->next = L->next;
L->next = p;
p = (LNode*) malloc (sizeof(LNode));
}
}

//L是带头结点的链表的头指针,以 e 返回第 i 个元素
Status Getelem(LNode *L, int i, int &e)
{
int j = 1;
Linklist p;
p = L->next;
while(p && j < i)
{
p = p->next;
j++;
}
if(!p || j>i)
{
printf("没有这个数/n");
return ERROR;
}
e = p->data;
return OK;
}

//L是带头结点的链表,若L中有元素e,返回第一个匹配元素的位置
int LocateElem(Linklist L, int e)
{
Linklist p;
int i = 0;
p = L->next;
while(p)
{
i++;
if(p->data == e)
return i;
p = p->next;
}
return 0;
}

int main()
{
Linklist L;
int e, i;
creat_list(L);
print_list(L);
printf("请输入你要查找的元素的位置i:");
scanf("%d", &i);
if(Getelem(L, i, e))
printf("第%d个元素的值是:%d/n", i, e);
printf("/n请输入你要查找的元素e:");
scanf("%d", &e);
if(LocateElem(L, e))
printf("元素%d在单链表中是第%d个元素/n", e, LocateElem(L, e));
else
printf("没有这个元素!/n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐