前面我已经写过一个静态顺序表的实现,今天我就来再实现一下这个静态顺序表,其中添加了一些新的东西。
实现顺序表的以下操作
1、SeqListInit //给一个顺序表初始化,seq表示的是顺序表结构的指针。
2、SeqListPushBack // 将一个元素插入到顺序表的末尾 ; value 新插入的值。
3、SeqListPopBack //将顺序表的最后一个元素删除
4、SeqListPushFront //往顺序表的前面插入一个元素;value是新插入的值
5、SeqListPopFront(SeqList* seq); 删除顺序表中第一个元素
6、SeqListGet(SeqList* seq, size_t pos, SeqType default_value); 取顺序表中任意位置的一个元素 ,pos要取元素的下标,如果取元素失败了,就返回default_value; return对应小标位置的元素的值
7、SeqListSet(SeqList* seq, size_t pos, SeqType value); 将顺序表中指定位置的值进行设置 pos 要修改的顺序表的元素位置,value 要设置的值.
8、SeqListFind(SeqList* seq, SeqType value); 查找顺序表中指定元素的下标 ;return 对应值的下标. 如果找不到, 就返回
(size_t)-1
9、SeqListInsert(SeqList* seq, size_t pos, SeqType value); 在指定位置插入元素 ,value要插入的值,pos要插入的位置
10、SeqListErase(SeqList* seq, size_t pos); 删除指定位置的元素 ;pos要删除的元素位置
11、SeqListRemove(SeqList* seq, SeqType to_delete); 删除顺序表中指定的值, 如果存在重复元素, 只删除第一个 to_delete 待删除的值
12、SeqListRemoveAll //删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本 ;to_delete 待删除的元素
13、SeqListSize //获取元素的个数。return顺序表元素的个数
14、SeqListEmpty //判断顺序表是否为空,如果顺序表为空,返回1,否则返回0
15、SeqListBubbleSort //冒泡排序
16、SeqListBubbleSortEx //冒泡排序升级
2、SeqListPushBack // 将一个元素插入到顺序表的末尾 ; value 新插入的值。
3、SeqListPopBack //将顺序表的最后一个元素删除
4、SeqListPushFront //往顺序表的前面插入一个元素;value是新插入的值
5、SeqListPopFront(SeqList* seq); 删除顺序表中第一个元素
6、SeqListGet(SeqList* seq, size_t pos, SeqType default_value); 取顺序表中任意位置的一个元素 ,pos要取元素的下标,如果取元素失败了,就返回default_value; return对应小标位置的元素的值
7、SeqListSet(SeqList* seq, size_t pos, SeqType value); 将顺序表中指定位置的值进行设置 pos 要修改的顺序表的元素位置,value 要设置的值.
8、SeqListFind(SeqList* seq, SeqType value); 查找顺序表中指定元素的下标 ;return 对应值的下标. 如果找不到, 就返回
(size_t)-1
9、SeqListInsert(SeqList* seq, size_t pos, SeqType value); 在指定位置插入元素 ,value要插入的值,pos要插入的位置
10、SeqListErase(SeqList* seq, size_t pos); 删除指定位置的元素 ;pos要删除的元素位置
11、SeqListRemove(SeqList* seq, SeqType to_delete); 删除顺序表中指定的值, 如果存在重复元素, 只删除第一个 to_delete 待删除的值
12、SeqListRemoveAll //删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本 ;to_delete 待删除的元素
13、SeqListSize //获取元素的个数。return顺序表元素的个数
14、SeqListEmpty //判断顺序表是否为空,如果顺序表为空,返回1,否则返回0
15、SeqListBubbleSort //冒泡排序
16、SeqListBubbleSortEx //冒泡排序升级
代码的实现如下所示:
void SeqListRemove(SeqList* seqlist, DataType to_delete)//删除顺序表中的元素,有多个,只删除一个
{
if (seqlist == NULL){
return;
}
if (seqlist->size == 0){
return;
}
size_t i = 0;
i = SeqListFindi(seqlist, to_delete);
SeqListErase(seqlist, i);
}
void seqListRemoveAll(SeqList* seqlist ,DataType to_delete)//删除顺序表中重复出现的元素,重复出现的全部删除
{
//时间复杂度为O(n^2)
if (seqlist == NULL){
return;
}
if (seqlist->size == 0){
return;
}
size_t pos = SeqListFindi(seqlist, to_delete);
if (pos != -1){
SeqListErase(seqlist, pos);
}
}
//void seqListRemoveAllEx(SeqList* seqlist, DataType to_delete){
////时间复杂度O(n)
// size_t i = 0;
// for (; i < seqlist->size; i++){
// if (seqlist->arr[i] == to_delete){
// SeqListErase(seqlist, i);
// i--;
// }
// }
//
//}
size_t SeqListSize(SeqList* seqlist)//返回该顺序表的个数
{
if (seqlist == NULL){
return;
}
return seqlist->size;
}
int SeqListEmpty(SeqList* seqlist)//返回该顺序表是否为空,为空返回1,否则返回0
{
if (seqlist == NULL){
return;
}
if (seqlist->size == 0){
return 1;
}
else
return 0;
}
void SeqListBubbleSort(SeqList* seqlist)//冒泡排序
{
if (seqlist == NULL){
return;
}
if (seqlist->size == 1){
return;
}
int i = 0;
for (i = 0; i<seqlist->size - 1; i++){
int j = 0;
for (j = 0; j<seqlist->size - 1 - i; j++){
if (seqlist ->arr[j]>seqlist->arr[j + 1]){
DataType tmp = seqlist->arr[j];
seqlist->arr[j] = seqlist->arr[j + 1];
seqlist->arr[j + 1] = tmp;
}
}
}
}
int cmp(const void * p1, const void * p2)
{
return (*(int *)p1 > *(int *)p2);
}
void SeqListBubbleSortEx(SeqList* seqlist, int(*cmp)(void*, void*))//使用回调函数的查找
{
if (seqlist == NULL){
return;
}
if (seqlist->size == 1){
return;
}
size_t i = 0;
for (i = 0; i<seqlist->size - 1; i++){
int j = 0;
for (j = 0; j<seqlist->size - 1 - i; j++){
if (cmp(&(seqlist->arr[j]), &(seqlist->arr[j + 1]))){
DataType tmp = seqlist->arr[j];
seqlist->arr[j] = seqlist->arr[j + 1];
seqlist->arr[j + 1] = tmp;
}
}
}
}
在写代码的过程中我遇到的主要问题是这个函数指针的相关知识,导致我在这里花了很长的时间。
测试代码主要如下所示:
void test5(){
SeqList seqlist;
SeqListInit(&seqlist);
SeqListPushBack(&seqlist, 2);
SeqListPushBack(&seqlist, 3);
SeqListPushBack(&seqlist, 4);
SeqListPushBack(&seqlist, 5);
SeqListPushBack(&seqlist, 4);
SeqListPushBack(&seqlist, 6);
SeqListPushBack(&seqlist, 7);
SeqListRemove(&seqlist,4);
SeqListPrint(&seqlist);
}
void test6(){
SeqList seqlist;
SeqListInit(&seqlist);
SeqListPushBack(&seqlist, 2);
SeqListPushBack(&seqlist, 3);
SeqListPushBack(&seqlist, 4);
SeqListPushBack(&seqlist, 5);
SeqListPushBack(&seqlist, 4);
SeqListPushBack(&seqlist, 6);
SeqListPushBack(&seqlist, 7);
SeqListPushBack(&seqlist, 8);
seqListRemoveAll(&seqlist, 3);
SeqListPrint(&seqlist);
}
void test7(){
SeqList seqlist;
SeqListInit(&seqlist);
SeqListPushBack(&seqlist, 2);
SeqListPushBack(&seqlist, 3);
SeqListPushBack(&seqlist, 4);
SeqListPushBack(&seqlist, 5);
SeqListPushBack(&seqlist, 4);
SeqListPushBack(&seqlist, 6);
SeqListPushBack(&seqlist, 7);
SeqListPushBack(&seqlist, 8);
SeqListSize(&seqlist);
SeqListPrint(&seqlist);
}
void test8(){
SeqList seqlist;
SeqListInit(&seqlist);
SeqListPushBack(&seqlist, 2);
SeqListPushBack(&seqlist, 3);
SeqListEmpty(&seqlist);
SeqListPrint(&seqlist);
}
void test9(){
SeqList seqlist;
SeqListInit(&seqlist);
SeqListPushBack(&seqlist, 5);
SeqListPushBack(&seqlist, 3);
SeqListPushBack(&seqlist, 4);
SeqListPushBack(&seqlist, 2);
SeqListBubbleSort(&seqlist);
SeqListPrint(&seqlist);
}
void test10(){
int cmp(const void * p1, const void * p2);//注意函数指针在使用的时候就必须声明,一般函数的声明在头文件中这里为了看起来方便,所以就放在这了。
SeqList seqlist;
SeqListInit(&seqlist);
SeqListPushBack(&seqlist, 5);
SeqListPushBack(&seqlist, 3);
SeqListPushBack(&seqlist, 1);
SeqListPushBack(&seqlist, 2);
SeqListPrint(&seqlist);
SeqListBubbleSortEx(&seqlist,cmp);
SeqListPrint(&seqlist);
}
int main()
{
//SeqList seqlist;
//SeqListInit(&MySqeList);//初始化顺序表
//SeqListPushFront(&MySqeList,1);//头插
//SeqListPushFront(&MySqeList, 2);//头插
//SeqListPushFront(&MySqeList, 3);//头插
//SeqListPushFront(&MySqeList,4);//头插
//SeqListPushFront(&MySqeList, 5);//头插
//SeqListPopFront(&MySqeList);//头删
//SeqListPrint(&MySqeList);
//SeqListPushBack(&seqlist,8);//尾插
//SeqListPushBack(&seqlist,9);
//SeqListPushBack(&seqlist,10 );
//SeqListPopBack(&seqlist);
//SeqListPopBack(&seqlist);
//SeqListPrint(&seqlist);
//testseqlistpush();
//test1();
//test2();
//test3();
//test4();
//test5();
//test6();
// test7();
//test8();
//test9();
test10(&cmp);
getchar();
return 0;
}所有的顺序表在这里就已经结束了。
674

被折叠的 条评论
为什么被折叠?



