c语言实现静态顺序表 ------------第一次自己独立完成

Seqlist.h
typedef struct SeqList
{
	DataType array[N];
	size_t size;
}SeqList;
void InitSeqList(SeqList *s);
void PushBack(SeqList *s, DataType x);
void PopBack(SeqList *s);
void PushFront(SeqList *s, DataType x);
void PopFront(SeqList *s);
void Insert(size_t pos, DataType x, SeqList* s);
void Erase(SeqList *s, size_t pos);
void PrintSeqList(SeqList *s);
int Find(SeqList *s, DataType x);
void Modify(SeqList *s, size_t pos, DataType x);
int Remove(SeqList *s, DataType x);
int RemoveAll(SeqList *s, DataType x);
void BubbleSort(SeqList *s);
void SelectSort(SeqList *s);//选择排序1
void Swap(DataType * a, DataType*b);
void SelectSortup(SeqList *s);//选择排序升级版
int BinarySearch(SeqList*s, DataType x);
Seqlist.c
#include"Seqlist.h"
void InitSeqList(SeqList *s)//初始化,不然里面数据全是随机值
{
	memset(s->array, 0, sizeof(DataType)*N);
	s->size = 0;

}
void PushBack(SeqList *s, DataType x)
{    //1.最先检查函数参数
	assert(s);
	//2.先判断满没满
	if (s->size == N)
	{
		printf("Seqlist is full");
		return;
	}
	else
	{
		s->array[s->size] = x;
		s->size++;
	}
}
void PopBack(SeqList *s)
{//1.检查参数
	assert(s);
 //2.判断是否为空
	if (s->size == 0)
	{
		printf("Seqlist is empty");
		return;
	}
	s->array[s->size - 1] = 0;
	s->size--;
}
void PushFront(SeqList *s, DataType x)
{//1.先判断参数
	assert(s);
//2.判断是否满了
	if (s->size == N)
	{
		printf("Seqlist is full");
		return;
	}
	for (int i = s->size-1 ; i>=0; i--)
	{
		s->array[i + 1] = s->array[i];
	}
	s->array[0] = x;
	s->size++;
}
void PopFront(SeqList *s)
{//1.检查参数
	assert(s);
 //2.判断是否为空
	if (s->size == 0)
	{
		printf("Seqlist is empty");
		return;
	}
	for (int i = 1; i < s->size ; i++)
	{
		s->array[i - 1] = s->array[i];
	}
	s->size--;
}
void PrintSeqList(SeqList *s)//可以不用传指针,因为不改变里面的值,但是最好传指针,如果传指针创建临时指针变量只是4字节,而如果不创建指针则是404字节
{	assert(s);
	for (size_t i = 0; i < s->size; i++)
	{
		printf("%d ", s->array[i]);
	}
	printf("\n");
	
}
//void Insert(size_t pos, DataType x, SeqList* s)//pos代表下标
//{
//	//1.判断参数是否合法
//	assert(s);
//	assert(pos <= s->size);
//	//2.判断满没满
//	if (s->size == N)
//	{
//		printf("Seqlist is full");
//		return;
//	}
//	for (size_t i = s->size-1; i > pos; i--)
//	{
//		s->array[i + 1] = s->array[i];
//	}
//	s->array[pos] = x;
//	s->size++;
//}
void Insert(size_t pos, DataType x, SeqList* s)//pos代表下标
{
	//1.判断参数是否合法
	assert(s);
	assert(pos <= s->size);
	//2.判断满没满
	if (s->size == N)
	{
		printf("Seqlist is full");
		return;
	}
	//错误
	//for (size_t i = s->size - 1; i >= pos; i--)//注意此处越界访问  因为i为size_t类型,减到0,继续减又是一个很大的数。
	//{                                         //有人就会说那就把size_t i改为int i     答案是还是错,因为pos还是size_t类型,pos与i相
	//	                                      //比较又会把i进行整形提升为size_t类型。。。正确改法是把pos强转为int
	//	s->array[i + 1] = s->array[i];
	//}
	//正确1
	/*for (int i = s->size - 1; i >= (int)pos; i--)
	{
		s->array[i + 1] = s->array[i];
	}*/
	//正确2
	for (size_t i = s->size; i > pos; i--)
	{
		s->array[i] = s->array[i - 1];
	}
	s->array[pos] = x;
	s->size++;
} 
void Erase(SeqList *s, size_t pos)
{
	//1.判断参数是否合法
	assert(s);
	assert(pos < s->size);
	for (size_t i = pos; i < s->size-1; i++)
	{
		s->array[i] = s->array[i+1];
	}
	s->size--;
}
int Find(SeqList *s, DataType x)//返回值int的含义   如果找到,返回找到元素的下标,如果没有找到返回-1
{
	//1.判断参数合法性
	assert(s);
	for (int i = 0; i < s->size; i++)
	{
		if (s->array[i] == x)
		{
			return i;

		}
	}
	return -1;
}
void Modify(SeqList *s, size_t pos, DataType x)
{
	//1.判断参数
	assert(s);
	assert(pos < s->size);
	s->array[pos] = x;
}
int Remove(SeqList *s, DataType x)
{//1.判断参数
	assert(s);
	int pos = Find(s, x);
	if (pos != -1)
	{
		Erase(s,pos);
		return 0;
	}
	else
	{
		return -1;
	}

}
int RemoveAll(SeqList *s, DataType x)//用i找不等于x把不等于x的存下,等于x的不存
{//1.判断参数

	assert(s);
	int i = 0;
	int j = 0;
	while (i < s->size)
	{
		if (s->array[i] != x)
		{
			s->array[j] = s->array[i];
			i++;
			j++;
		}
		else if(s->array[i] == x)
		{
			i++;
		}
	}
	s->size = j;
	return (i == j) ? -1: 0;
}
void BubbleSort(SeqList *s)
{//1.判断参数
	assert(s);
	
	size_t end ;
	for (end = s->size; end > 0; end--)//交换多少趟
	{
		size_t start = 0;//注意每趟结束把start置成0
		int flag = 0;
		while (start + 1 < end)//一趟交换多少次。end控制冒到那个位置
		{
			if (s->array[start] > s->array[start + 1])
			{
				DataType tmp = s->array[start];
				s->array[start] = s->array[start + 1];
				s->array[start + 1] = tmp;
				flag = 1;
			}
			start++;
		}
		if (flag == 0)
		{
			break;
		}
		
	}
}
void Swap(DataType* a, DataType* b)
{
	DataType tmp =*a;
	          *a =*b;
	          *b = tmp;

}
void SelectSort(SeqList *s)
{

	
	for (size_t start = 0; start < s->size; start++)
	{
		size_t min = start;
		for (size_t i = start; i < s->size; i++)//选一个最小的数出来
		{
			if (s->array[i] < s->array[min])
			{
				min = i;
			}
		}
		Swap(s->array+min, s->array+start);

	}
}
void SelectSortop(SeqList *s)
{
	size_t start = 0;
	size_t finish = s->size-1;
	for (; start <=finish; start++)
	{
		size_t max = start;//注意 :此处start不能放外面,因为start是每次都要更新的
		size_t min = start;
		size_t i = start;
		for (; i <=finish;i++)
		{
			if (s->array[i]> s->array[max])
			{
				max = i;
			}
			if (s->array[i] < s->array[min])
			{
				min = i;
			}
		}
		Swap(s->array + min, s->array + start);
		if (start == max)
		{
			max = min;
		}
		Swap(s->array + max, s->array + finish);
		finish--;
		
	}
}
int BinarySearch(SeqList*s, DataType x)
{
	int left = 0;
	int right = s->size - 1;
	
	while (left <= right)
	{
		int mid = (right - left) / 2 + left;
		if (s->array[mid] == x)
			return mid;
		if (s->array[mid] > x)
		{
			right = mid -1;
		}
		if (s->array[mid] <x)
		{
			left = mid+1;
		}
	}
	return -1;
}
test.c
#include"Seqlist.h"
void test1()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s, 1);
	PushBack(&s, 2);
	PushBack(&s, 3);
	PushBack(&s, 4);
	PrintSeqList(&s);
	PopBack(&s);
	PopBack(&s);
	PrintSeqList(&s);
}
void test2()
{
	SeqList s;
	InitSeqList(&s);
	PushFront(&s,1);
	PushFront(&s,2);
	PushFront(&s,3);
	PushFront(&s,4);
	PrintSeqList(&s);
	PopFront(&s);
	PopFront(&s);
	PrintSeqList(&s);
	Insert(2, 3, &s);
	PrintSeqList(&s);
	Insert(0, 0, &s);
	PrintSeqList(&s);
}
void test3()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s, 1);
	PushBack(&s, 2);
	PushBack(&s, 3);
	PushBack(&s, 4);
	PushBack(&s, 5);
	PrintSeqList(&s);
	Erase(&s, 0);
	PrintSeqList(&s);
	Erase(&s, 3);
	PrintSeqList(&s);
}
void test4()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s, 1);
	PushBack(&s, 2);
	PushBack(&s, 3);
	PushBack(&s, 4);
	PushBack(&s, 5);
	PrintSeqList(&s);
	int ret=Find(&s, 1);
	printf("ret=%d\n", ret);
	 ret = Find(&s, 7);
	printf("ret=%d\n", ret);
	Modify(&s, 0, 9);
	PrintSeqList(&s);
}
void test5()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s, 1);
	PushBack(&s, 2);
	PushBack(&s, 3);
	PushBack(&s, 4);
	PushBack(&s, 5);
	Remove(&s, 4);
	PrintSeqList(&s);

}
void test6()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s, 4);
	PushBack(&s, 2);
	PushBack(&s, 4);
	PushBack(&s, 4);
	PushBack(&s, 5);
	PushBack(&s, 4);
	RemoveAll(&s,4);
	PrintSeqList(&s);
}
void test7()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s, 4);
	PushBack(&s, 2);
	PushBack(&s, 1);
	PushBack(&s, 8);
	PushBack(&s, 5);
	PushBack(&s, 4);
	BubbleSort(&s);
	PrintSeqList(&s);
}
void test8()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s, 4);
	PushBack(&s, 2);
	PushBack(&s, 1);
	PushBack(&s, 8);
	PushBack(&s, 5);
	PushBack(&s, 4);
	SelectSortop(&s);
	PrintSeqList(&s);
}
void test9()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s, 1);
	PushBack(&s, 2);
	PushBack(&s, 5);
	PushBack(&s, 8);
	PushBack(&s, 9);
	PushBack(&s,10);
	int ret = 0;
	/*ret = BinarySearch(&s, 5);
	printf("%d\n", ret);*/
	ret = BinarySearch(&s, 8);
	printf("%d\n", ret);
}
int main()
{
	test9();
	system("pause");
	return 0;
}


这一次我不会在胜败未分的混沌中提早离席,希望一切都还来的及。-----------------------2018.2.8



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值