顺序查找(C语言)
一.不带哨兵:
1. 线性表结构体
typedef struct List
{
int *data;//元素数组
int length;//可以写入多少元素
int num;//目前元素个数
}List;
2.初始化列表
List *initList(int length)
{/*参数length:有多少元素空位*/
List *list = (List*)malloc(sizeof(List));//为列表申请空间
list->length = length;//元素长度写入
list->data = (int*)malloc(sizeof(int)*length);//为列表内的数组申请空间
list->num = 0;//初始元素个数为0
return list; //返回列表
}
3.向列表内写入元素
void listAdd(List *list,int data)
{/*参数一:列表指针
参数二:要写入的元素*/
list->data[list->num] = data;//将元素按序写入
list->num += 1;//列表内元素数量加一
}
4.查找元素
int search(List *list,int key)
{/*参数一:列表指针
参数二:要查找的元素*/
int i;
for(i=0;i<list->num;i++)//循环遍历列表中的每一个元素直到与要查找的元素值相等
{
if(list->data[i]==key)
return key;
}
return -1;//没查到返回-1
}
5.遍历输出列表内的元素
void printList(List *list)
{/*参数list:列表指针*/
int i;
for(i=0;i<list->num;i++)//循环遍历,按序输出列表内data的值
printf("%d ",list->data[i]);
printf("\n");
}
6.主函数
int main()
{
List *list = initList(5);//初始化,列表长度设为5
int i,key,n;
for(i=0;i<5;i++)
listAdd(list,i);//往列表内写入元素
printf("列表内元素:");
printList(list);//遍历输出列表
printf("请输入要查找的元素:");
scanf("%d",&key);
n = search(list,key);//查找元素
if(n>=0)
printf("查找到该元素n:%d\n",n);
else
printf("未查找到该元素!\n");
return 0;
}
二.带哨兵
和不带哨兵的区别仅在初始化列表,查找元素,遍历输出列表内的元素,和主函数某几行代码不同.
1. 初始化列表
List *initList(int length)
{/*参数length:有多少元素空位*/
List *list = (List*)malloc(sizeof(List));//为列表申请空间
list->length = length;//元素长度写入
list->data = (int*)malloc(sizeof(int)*length);//为列表内的数组申请空间
list->num = 1;//初始元素个数为0,加上哨兵num为1
return list; //返回列表
}
2.查找元素
int search(List *list,int key)
{/*参数一:列表指针
参数二:要查找的元素*/
int i;
list->data[0] = key;//将要查找的元素写入哨兵位置
for(i=(list->num)-1;list->data[i]!=key;i--);//从后往前找,找到要查找的元素时就停止循环
return i;//返回元素下标
}
3.遍历输出列表内的元素
void printList(List *list)
{/*参数list:列表指针*/
int i;
for(i=1;i<list->num;i++)//循环遍历,按序输出列表内data的值
printf("%d ",list->data[i]);
printf("\n");
}
4.主函数
int main()
{
List *list = initList(5);//初始化,列表长度设为5
int i,key,n;
for(i=0;i<5;i++)
listAdd(list,i);//往列表内写入元素
printf("列表内元素:");
printList(list);//遍历输出列表
printf("请输入要查找的元素:");
scanf("%d",&key);
n = search(list,key);//查找元素
if(n!=0)//没有找到第0个位置,说明查找到了
printf("查找到该元素n:%d\n",list->data[n]);
else//查找到哨兵位置说明没有该元素
printf("未查找到该元素!\n");
return 0;
}
三. 完整代码
#include <stdio.h>
#include <stdlib.h>
/*线性表结构体*/
typedef struct List
{
int *data;//元素数组
int length;//可以写入多少元素
int num;//目前元素个数
}List;
/*初始化列表*/
List *initList(int length)
{/*参数length:有多少元素空位*/
List *list = (List*)malloc(sizeof(List));//为列表申请空间
list->length = length;//元素长度写入
list->data = (int*)malloc(sizeof(int)*length);//为列表内的数组申请空间
list->num = 0;//初始元素个数为0
return list; //返回列表
}
/*向列表内写入元素*/
void listAdd(List *list,int data)
{/*参数一:列表指针
参数二:要写入的元素*/
list->data[list->num] = data;//将元素按序写入
list->num += 1;//列表内元素数量加一
}
/*查找元素*/
int search(List *list,int key)
{/*参数一:列表指针
参数二:要查找的元素*/
int i;
for(i=0;i<list->num;i++)//循环遍历列表中的每一个元素直到与要查找的元素值相等
{
if(list->data[i]==key)
return key;
}
return -1;//没查到返回-1
}
/*遍历输出列表内的元素*/
void printList(List *list)
{/*参数list:列表指针*/
int i;
for(i=0;i<list->num;i++)//循环遍历,按序输出列表内data的值
printf("%d ",list->data[i]);
printf("\n");
}
int main()
{
List *list = initList(5);//初始化,列表长度设为5
int i,key,n;
for(i=0;i<5;i++)
listAdd(list,i);//往列表内写入元素
printf("列表内元素:");
printList(list);//遍历输出列表
printf("请输入要查找的元素:");
scanf("%d",&key);
n = search(list,key);//查找元素
if(n>=0)
printf("查找到该元素n:%d\n",n);
else
printf("未查找到该元素!\n");
return 0;
}
四.运行结果