静态顺序表的实现(2)

前面我已经写过一个静态顺序表的实现,今天我就来再实现一下这个静态顺序表,其中添加了一些新的东西。

实现顺序表的以下操作 

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    //冒泡排序升级
代码的实现如下所示:
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;
}
所有的顺序表在这里就已经结束了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值