首先写一个定长的顺序表的程序吧(其实有点像小项目那样)
(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); Clear(&sq); Show(&sq); return 0; }
PS:附上测试的照片



