数据结构与算法-2-链表的基本操作-查找(c语言)
本文是单链表的C语言实现方法,包括单链表的创建、插入、删除、修改、查找等基本操作。
- 链表结点的类型定义
/*链式存储结构的头结点*/
typedef int ElemType;/*类型定义,不懂可以看前面文章,欢迎提问!*/
typedef struct Node{
Elemtype *elem;
struct Node *next;
}Node,*Ptr;
typedef Ptr *SqListPtr;
/*顺序存储结构的头结点*/
typedef struct SqList {
ElemType* elem;
int length;
int list_size;
}SqList, * Ptr, * SqListPtr;
2.相关的头文件
/*下面的头文件为Sqlist.h*/
#pragma once /*表示该文件只会编译一次*/
#define bool int/*c语言无bool类型*/
typedef ElemType int;
typedef enum Status{
success,fail,fatal,range_error
}Status;/*通过枚举来定义状态参数,用于表示相关函数是否运行成功*/
void Test_Size(SqListPtr list);
Status Test_CreateList(SqListPtr list, ElemType date[], int n);
Status Test_ClearList(SqListPtr list);
Status List_Locate(SqlistPtr L,ElemType elem,int *pos);/*通过元素值查找它在单链表中的位置,通过位置指针pos返回*/
Status List_Retrival(SqListPtr L,int pos,ElemType *elem);/*查找特定位置上的数据元素,并且通过数据元素指针返回*/
/*下面头文件为*/
#pragma once
#include"SqList.h"
Status Test_CreateList(SqListPtr list, ElemType date[], int n);
Status Test_ClearList(SqListPtr list);
Status Test_RetrivalPriorNext(SqListPtr list, int pos);
Status Test_Locate(SqListPtr list, ElemType e);
void Test_Size(SqListPtr list);
Status List_Locate(SqListPtr L, ElemType elem, int* pos);
3.按值查找数据元素(通过顺序存储结构实现)
函数头
Status List_Locate(SqlistPtr L,ElemType elem,int *pos);
/通过元素值查找它在单链表中的位置,通过位置指针pos返回/
Status List_Locate(SqlistPtr L,ElemType elem,int *pos)
{
Status s=range_error;/*初始化状态参量,默认该元素不在链表内*/
int i=1;
if(L)/*如果线性表存在就进行查找*/
{
for(i=1;i<L->length;i++)
{
if(L->elem[i]==elem)
{
*pos=i;
s=success;
break;
}
}
}
return s;
}
- 按值查找数据元素(通过链式存储结构实现)
函数头
Status List_Locate(SqlistPtr L,ElemType elem,int *pos);
/通过元素值查找它在单链表中的位置,通过位置指针pos返回/
Status List_Locate(SqListPtr L, ElemType elem, int* pos)
{
Status s = fail;
Ptr p = (*L)->next;/*定义一个指向结构体变量的指针,用于指向每一个待查找的结点*/
int i = 1;
while (p)
{
if (p->elem == elem)
{
s = success;
*pos = i;/*通过位置指针返回位置*/
break;
}
++i;
p = p->next;/*查找完,使该指针指向下一个结点*/
}
return s;
}
4.下面用main函数进行测试
#include"TestSqList.h"
#include"SqList.h"
#include<stdio.h>
#include<stdlib.h>
int main()
{
int opt = 1, i;
SqListPtr list = NULL;
int pos, size;
ElemType e, * data;
Status s;
while (opt != 4)
{
printf("请输入选项:\n");
printf("1:测试建立线性表\n");
printf("2:测试清除线性表\n");
printf("3:测试查询某元素的位置\n");
printf("结束程序\n");
scanf_s("%d", &opt);
switch (opt)
{
case 1:
printf("线性表长度\n");
scanf_s("%d", &size);
data = (ElemType*)malloc((size) * sizeof(ElemType));
if (data == NULL)break;
printf("线性表元素:\n");
for (i = 1; i <= size; i++)
{
scanf_s("%d", &data[i]);
}
s = Test_CreateList(&list, data, size);
if (s != success)
printf("建立线性表失败\n");
break;
case 2:
printf("线性表长度\n");
scanf_s("%d", &size);
data = (ElemType*)malloc((size) * sizeof(ElemType));
if (data == NULL)break;
printf("线性表元素:\n");
for (i = 1; i <= size; i++)
{
scanf_s("%d", &data[i]);
}
s = Test_CreateList(&list, data, size);
if (s == success)
{
if (!List_Empty(&list))
{
List_Clear(&list);
if (List_Empty(&list))
{
printf("已经清空线性表了\n");
}
}
}
break;
case 3:
printf("线性表长度\n");
scanf_s("%d", &size);
data = (ElemType*)malloc((size) * sizeof(ElemType));
if (data == NULL)break;
printf("线性表元素:\n");
for (i = 1; i <= size; i++)
{
scanf_s("%d", &data[i]);
}
s = Test_CreateList(&list, data, size);
if (s == success)
{
printf("输入待查询的元素值:\n");
scanf_s("%d", &e);
Test_Locate(&list, e);
}
break;
default:
break;
}
}
return 0;
}
5.欢迎关注!!!感谢戴波老师。