首先写一个定长的顺序表的程序吧(其实有点像小项目那样)
(1)定义结构体
typedef struct SQList
{
int elem[10];//用于存储数据,定长的呦
int length;//有效数据长度 ,有可能十个格子 就放了5个数
} SQLIst,*PSQList;//C语言结构体方面的知识 typedef用了之后相当于把这个结构体重新叫了一个名字 之后用它定义会方便很多
(2)顺序表需要的功能
//初始化
void InitSqList(PSQList ps);//相当于赋初值 就像 int a=10;
//判满 *** 作
static bool IsFul(PSQList ps);
//插入数据,在ps顺序表的pos位置插入val;
bool Insert(PSQList ps, int pos, int val);//pos是地址 val是数值
//判空
bool IsEmpty(PSQList ps);
//在ps中查找第一个key值,找到了返回下标,没有找到返回-1;
int Search(PSQList ps, int key);//key是数值
//删除pos位置的值
bool DelPos(PSQList ps, int pos);//同样pos是地址 要根据地址删除数值
//删除第一个val的值
bool DelVal(PSQList ps, int val);//根据数值进行删除
//返回key的前驱下标,如果不存在返回-1;
int GetPrio(PSQList ps, int key);//key是数值 前驱指的是key之前的那个数及地址
//返回key的后继下标,如果不存在返回-1;
int GetNext(PSQList ps, int key);//参考上一个,
//输出
void Show(PSQList ps);//把表的数值展现出来
//清空数据
void Clear(PSQList ps);//将表内的东西全部清除
(3)建立list.cpp源文件
#include "SQList.h"
#include
#include //头文件
//初始化
void InitSqList(PSQList ps)//相当于赋初值 就像 int a=10;
{
assert(ps != NULL);//断言
if (ps == NULL)//相等和赋值容易搞错
{
return;
}
ps->length = 0;//现在顺序表是空的
}
//判满 *** 作
static bool IsFul(PSQList ps)
{
assert(ps != NULL);//断言
if (ps == NULL)//相等和赋值容易搞错
{
return false;
}
if (ps->length == 10)
{
return true;
}
else
return false;
}
//插入数据,在ps顺序表的pos位置插入val;
bool Insert(PSQList ps, int pos, int val)//pos是1 2 3 4 5 这样的数 下标是从0开始
{
assert(ps != NULL);//断言
if (ps == NULL || pos < 0 || pos>ps-> length ||IsFul(ps))//相等和赋值容易搞错
{
return false;//注意函数的返回值 和上一个不一样了
}
//思路:以pos为边界条件 将pos位置之后的数都向后移一位
for (int i = ps->length - 1; i >= pos - 1; i--)
{
ps->elem[i + 1] = ps->elem[i];
}
ps->elem[pos] = val;
ps->length++;//数据多了一个 有效长度就要++ 这一步容易忘
return true;//这是个有返回值的函数
}
//判空
bool IsEmpty(PSQList ps)
{
assert(ps != NULL);//断言
return ps->length == 0;
}
//在ps中查找第一个key值,找到了返回下标,没有找到返回-1;
int Search(PSQList ps, int key)//key是数值
{
assert(ps != NULL);//断言
if (ps == NULL)//相等和赋值容易搞错
{
return -1;
}
//思路:for循环 遍历 找到key值
for (int i = 0; i < ps->length; i++)
{
if (ps->elem[i] == key)
{
return i;
}
}
return -1;//找了一圈后还没找到
}
//删除pos位置的值
bool DelPos(PSQList ps, int pos)
{
assert(ps != NULL);//断言
if (ps == NULL)//相等和赋值容易搞错
{
return false;
}
if (pos < 0 || pos >= ps->length)
{
return false;
}
//思路:调用Search函数 找到pos位置,把pos位置之后的值向前移一个位置
for (int i = pos; i < ps->length - 1; i++)
{
ps->elem[i] = ps->elem[i + 1];
}
ps->length--;//少了一个数 所以数据个数--
return true;
}
//删除第一个val的值
bool DelVal(PSQList ps, int val)//根据数值进行删除
{
assert(ps != NULL);//断言
if (ps == NULL)//相等和赋值容易搞错
{
return false;
}
int i = Search(ps, val);
if (i < 0)
{
return false;
}
return DelPos(ps, i);
}
//返回key的前驱下标,如果不存在返回-1;
int GetPrio(PSQList ps, int key)//key是数值 前驱指的是key之前的那个数及地址
{
assert(ps != NULL);//断言
if (ps == NULL)//相等和赋值容易搞错
{
return -1;
}
int i = Search(ps, key);
if (i <= 0)
{
return -1;
}
else
return i - 1;
}
//返回key的后继下标,如果不存在返回-1;
int GetNext(PSQList ps, int key)//参考上一个,
{
assert(ps != NULL);//断言
if (ps == NULL)//相等和赋值容易搞错
{
return -1;
}
int i = Search(ps, key);
if (i < 0 || i == ps->length - 1)
{
return -1;
}
else
return i + 1;
}
//输出
void Show(PSQList ps)//把表的数值展现出来
{
assert(ps != NULL);//断言
if (ps == NULL)//相等和赋值容易搞错
{
return;
}
for (int i = 0; i < ps->length; i++)
{
printf("%5d", ps->elem[i]);
}
printf("\n");
}
//清空数据
void Clear(PSQList ps)//将表内的东西全部清除
{
ps->length = 0;
}
(4)建立test.cpp测试文件
#include
#include "SQList.h"
int main()
{
SQList sq;
InitSqList(&sq);//初始化 解引用
//printf("%d \n", sizeof(sq));
for (int i = 0; i < 10; i++)
{
Insert(&sq, i, i);
}
//Show(&sq);
/*int index = Search(&sq, 7);
if (index >= 0)
{
printf("该值位于%d号下标\n ", index);
}
else
{
printf("没有找到该值\n");
}*/
/*for (int i =0; i <10; i++)
{
int index = Search(&sq, i);
if (index >= 0)
{
printf("%d位于%d号下标\n", i, index);
}
else
{
printf("没有找到\n");
}
}*/
/*DelPos(&sq, 5);
Show(&sq);*/
/*DelVal(&sq, 1);
Show(&sq);*/
/*int i = GetPrio(&sq, 6);
if (i < 0)
{
return -1;
}
else
{
printf("%d的前驱下标是%d\n", 6, i);
}*/
/*int index = GetNext(&sq, 6);
if (index < 0)
{
return -1;
}
else
{
printf("%d的后驱下标是%d\n", 6, index);
}*/
Clear(&sq);
Show(&sq);
return 0;
}
PS:附上测试的照片
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)