单链表的按值查找(输入结点数据域输出结点的位置)数据结构C语言
代码段基本上每句都有注释,如有困惑,欢迎留言。博主看到就会回复
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
//定义结点结构体类型
typedef struct LNode{
int data; //定义数据域
struct LNode * next; //定义指针域
}LNode,*LinkList;
//声明函数
LinkList InitList(LinkList &L);
LinkList GreatList(LinkList &L,int n);
void DisplayList(LinkList L,int n);
int LocateElem_L(LinkList L,int e);
int main(){
LinkList L;
int i,n,e;
//给线性表初始化
L = InitList(L);
printf("请输入单链表的长度:");
scanf("%d",&n);
//创建线性表
L = GreatList(L,n);
printf("\n创建的");
//打印出线性表
DisplayList(L,n);
printf("\n请输入要查找的元素的值");
scanf("%d",&e);
i = LocateElem_L(L,e);
if(i==-1){
printf("\n单链表中未找到您输入的值(T-T)");
}else{
printf("\n你要找的值在单链表中的第%d位。",i);
}
return 0;
}
//给线性表初始化
LinkList InitList(LinkList &L){
//创建头结点,为头结点分配内存
L=(LinkList)malloc(sizeof(LNode));
//使头结点的指针域为空
L->next = NULL;
return L;
}
//创建线性表
LinkList GreatList(LinkList &L,int n){
//这里使用的是头插法
//这里也可以进行初始化,具体原因本博主在前面一片已经讲解过了,如有需要,请自行前往查看
//定义一个指针
LinkList p;
int i;
for(i=n;i>0;i--){
//给要插入链表的结点分配空间
p = (LinkList)malloc(sizeof(LNode));
printf("\n请输入元素值:");
scanf("%d",&p->data);
//使要插入结点的指针域等于头结点的指针域,使得要插入的结点位于头结点后,处于第一个位置
p->next = L->next;
//让头结点的指针域指向刚刚插入结点的,使得头结点和第一个结点相连接
L->next = p;
}
}
//打印单链表
void DisplayList(LinkList L,int n){
LinkList p;
int i;
//使结点指向首元结点
p = L->next;
printf("单链表为:");
for(i=0;i<n;i++){
printf("%d",p->data);
//得到结点值后,使指针向后移动
p = p->next;
}
}
//查找元素
int LocateElem_L(LinkList L,int e){
//声明一个指针
LinkList p;
//将指针指向首元结点
p = L->next;
//计数器
int j = 1;
//当指针指向的结点不为空,并且指针指向的结点的数据域与要查找的值不相等
while(p && p->data != e){
//p指向下一个结点
p = p->next;
//计数器加一
j++;
}
//如果指针指向的结点不为空,则输出计数器的内容,也即是结点数据域的位置
if(p){
return j;
}else{
//如果指针为空,则表明未找到该数据
return -1;
}
}
运行成功结果
运行错误结果