静态顺序表的实现创建、查找、删除

来源:互联网 发布:淘宝网店实名认证照片 编辑:程序博客网 时间:2024/05/02 05:42

顺序表概述:用顺序存储方法存储的线性表

实现的功能:1、建立顺序表并初始化

                     2、在顺序表尾部插入元素

                     3、删除尾部元素

                            4、从前往后输出

                            5、在顺序表头插入元素

                            6、在任意位置插入元素

                            7、删除顺序表任意位置元素

                           8、删除给定数据为元素

                           9、删除所有为给定数的元素

                          10、排序(冒泡、选择排序)

////////////////////////////****静态版顺序表****/////////////////////////////////////

SeqList.h   

<span style="font-size:18px;">#ifndef  SEQLIST_H#define  SEQLIST_H#define  MAX_NUM 5#include<stdio.h>#include<string.h>#include<assert.h>typedef int DataType;typedef  unsigned int  size_t;typedef struct SeqList{DataType arr[MAX_NUM];   //数组size_t  sz;             //已经放有元素的总个数}SeqList,*PSeqList;void InitSeqList(PSeqList pSeqList);//初始化void PushBack(PSeqList pSeqlist, DataType data);//尾插void PopBack(PSeqList pSeqList);  //删除尾元素void PrintSeqList(SeqList SeqList);//从前往后输出void PushFront(PSeqList pSeqList, DataType data);//头插void PopFront(PSeqList pSeqList);//头删void Insert(PSeqList pSeqList, int pos, DataType data);//任意位置插入int  Find(PSeqList pSeqList, DataType data);//查找元素//删除顺序表pos位置元素void Erase(PSeqList pSeqList, int pos);//移除data数据void Remove(PSeqList pSeqList,DataType  data);void RemoveALL(PSeqList pSeqList,DataType data );//去除所有的data元素void BUbbleSort(PSeqList pSeqList);  //冒泡排序void SelectSort(PSeqList pSeqList);//选择排序#endif </span>
SeqList.c

#include"SeqList.h"//初始化void InitSeqList(PSeqList pSeqList){assert(NULL != pSeqList);pSeqList->sz = 0;memset(pSeqList->arr, 0, MAX_NUM*sizeof(DataType));}void PrintSeqList(SeqList SeqList)//从前往后输出{size_t iIdx = 0;/*assert(NULL != SeqList);*/for (; iIdx < SeqList.sz; iIdx++){printf("%d", SeqList.arr[iIdx]);}printf("\n");}void PushBack(PSeqList pSeqList, DataType data)//尾插{assert(pSeqList);if ((pSeqList->sz) >= MAX_NUM)  //是否满了{return;}pSeqList->arr[pSeqList->sz] = data;pSeqList->sz++;}void PopBack(PSeqList pSeqList)//删除尾元素{assert(NULL != pSeqList);if ((pSeqList->sz) <= 0){return;}pSeqList->sz--;}void PushFront(PSeqList pSeqList, DataType data)//从开头插入一个数{int iIdx = 0;assert(NULL!= pSeqList);if (pSeqList->sz >= MAX_NUM)//检查是否满了{return;}for (iIdx = (pSeqList->sz) - 1; iIdx >= 0; iIdx--){pSeqList->arr[iIdx + 1] = pSeqList->arr[iIdx];}pSeqList->arr[0] = data;pSeqList->sz++;}void PopFront(PSeqList pSeqList)//删除头元素{size_t iIdx = 0;assert(pSeqList);if (pSeqList->sz <= 0){return;}for (iIdx = 0; iIdx < pSeqList->sz-1; iIdx++)//注意这里的sz-1防止越界{pSeqList->arr[iIdx] = pSeqList->arr[iIdx + 1];}pSeqList->sz--;}void Insert(PSeqList pSeqList, int pos, DataType data)//任意位置插入{assert(NULL != pSeqList);if ((pSeqList->sz < MAX_NUM)&&(pos >= 0) && (pos < pSeqList->sz))//对元素总数检测,位置的检测{int iIdx = pSeqList->sz;for (; iIdx >pos ; iIdx--){pSeqList->arr[iIdx] = pSeqList->arr[iIdx - 1];}pSeqList->arr[pos] = data;pSeqList->sz++;}}int  Find(PSeqList pSeqList, DataType data){int iIdx = 0;assert(NULL != pSeqList);for (iIdx = 0; iIdx < pSeqList; iIdx++){if (data == pSeqList->arr[iIdx]){return iIdx;}}return -1;}//删除顺序表pos位置元素void Erase(PSeqList pSeqList, int pos){assert(NULL != pSeqList);if ((pos >= 0) && (pos < pSeqList->sz)){int iIdx = pos;for (; iIdx < pSeqList->sz-1; iIdx++){pSeqList->arr[iIdx] = pSeqList->arr[iIdx + 1];}pSeqList->sz--;}}//移除data数据void Remove(PSeqList pSeqList, DataType  data){int ret = 0;assert(NULL != pSeqList);ret = Find(pSeqList, data);Erase(pSeqList, ret);}void RemoveALL(PSeqList pSeqList, DataType data){int iCount=0 ;int iIdx = 0;assert(NULL != pSeqList);if (pSeqList->sz <= 0){return;}for (; iIdx < pSeqList->sz; iIdx++){if (data == pSeqList->arr[iIdx]){++iCount;}else{pSeqList->arr[iIdx - iCount] = pSeqList->arr[iIdx];}}pSeqList->sz -= iCount;}void BUbbleSort(PSeqList pSeqList) //冒泡排序{int iIdx = 0;int jIdx = 0;int flag = 0;assert(NULL!=pSeqList);if (pSeqList->sz == 0){return;}for (iIdx = 0; iIdx < pSeqList->sz - 1; iIdx++){flag = 0;for (jIdx = 0; jIdx < (pSeqList->sz - 1) - iIdx; jIdx++){if (pSeqList->arr[jIdx] > pSeqList->arr[jIdx+1])//小到大{DataType temp = pSeqList->arr[jIdx+1];pSeqList->arr[jIdx+1] = pSeqList->arr[jIdx];pSeqList->arr[jIdx] = temp;flag = 1;}}if (flag != 1){return;}}return;}void SelectSort(PSeqList pSeqList)//选择排序{int iIdx = 0;int jIdx = 0;int min = 0;   assert(NULL!=pSeqList);for (iIdx = 0; iIdx < pSeqList->sz - 1; iIdx++){min = iIdx;for (jIdx = iIdx; jIdx < (pSeqList->sz - 1); jIdx++){if (pSeqList->arr[min] > pSeqList->arr[jIdx])  //从小到大{min = jIdx;}}//每次找到比arr[min]还小的数就交换!if (min != iIdx){DataType temp = pSeqList->arr[iIdx];pSeqList->arr[iIdx] = pSeqList->arr[min];pSeqList->arr[min] = temp;}}}

>>>>>为方便各位和我一样正”在路上“学习的同学,我也把测试函数也放在下面,方便大家检验本人的程序,同时测试函数里面的诸多代码都是重复性的,所以就留下来,免得大家做一些重复性的工作<<<<<

test.c


#include "SeqList.h"void Test1(){SeqList seqList;InitSeqList(&seqList);//地址传递PushBack(&seqList, 1);PushBack(&seqList, 2);PushBack(&seqList, 3);PushBack(&seqList, 4);PrintSeqList(seqList);}void test2(){SeqList seqList;InitSeqList(&seqList);//地址传递PushBack(&seqList, 1);PushBack(&seqList, 2);PushBack(&seqList, 3);PushBack(&seqList, 4);PrintSeqList(seqList);PopBack(&seqList);PrintSeqList(seqList);PopBack(&seqList);PrintSeqList(seqList);PopBack(&seqList);PrintSeqList(seqList);PopBack(&seqList);PrintSeqList(seqList);}void test3(){SeqList seqList;InitSeqList(&seqList);//地址传递PushFront(&seqList, 1);PushFront(&seqList, 2);PushFront(&seqList, 3);PushFront(&seqList, 4);PrintSeqList(seqList);PopFront(&seqList);PrintSeqList(seqList);PopFront(&seqList);PrintSeqList(seqList);PopFront(&seqList);PrintSeqList(seqList);PopFront(&seqList);PrintSeqList(seqList);}void test4(){SeqList seqList;int ret = 0;InitSeqList(&seqList);//地址传递PushFront(&seqList, 1);PushFront(&seqList, 2);PushFront(&seqList, 3);PushFront(&seqList, 4);PrintSeqList(seqList);Insert(&seqList,0,55);PrintSeqList(seqList);ret = Find(&seqList, 55);printf("%d ", ret);Erase(&seqList, 0);PrintSeqList(seqList);}void test5(){SeqList seqList;InitSeqList(&seqList);//地址传递PushBack(&seqList, 1);PushBack(&seqList, 2);PushBack(&seqList, 2);PushBack(&seqList, 3);PushBack(&seqList, 3);PrintSeqList(seqList);RemoveALL(&seqList, 3);PrintSeqList(seqList);}test6(){SeqList seqList;InitSeqList(&seqList);//地址传递PushBack(&seqList, 4);PushBack(&seqList, 3);PushBack(&seqList, 2);PushBack(&seqList, 1);PushBack(&seqList, 5);PrintSeqList(seqList);SelectSort(&seqList);PrintSeqList(seqList);}int main(){/*Test1();*///test2();/*test3();*///test4();/*test5();*/test6();return 0;}


这里对于顺序表的总长度是直接给定的,这样就存在一些限制。后面我会对其改进,实现动态的顺序表!

大笑


0 0