您的位置:首页 > 编程语言 > C语言/C++

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

2018-02-08 17:36 441 查看
Seqlist.h
typedef struct SeqList
{
DataType array
;
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: