首页 > 学院 > 开发设计 > 正文

静态顺序表------C语言实现

2019-11-06 08:05:23
字体:
来源:转载
供稿:网友

StaticSeqlist.h文件

#define _CRT_SECURE_NO_WARNINGS 1#ifndef _STATICSEQLIST_H__#define _STATICSEQLIST_H__#include<stddef.h>#include<assert.h>#include<string.h>#define MAXSIZE 10typedef int DataType;//#define DataType inttypedef struct Seqlist{	DataType array[MAXSIZE];	size_t size;  //有效元素的个数}Seqlist,*PSeqlist;void IniSeqlist(PSeqlist seq);void PushBack(PSeqlist seq,DataType data);void PRintSeqlist(PSeqlist seq);void PopBack(PSeqlist seq);void PushFront(PSeqlist seq,DataType data);void PopFront(PSeqlist seq);void Insert(PSeqlist seq,DataType pos,DataType data);void Erase(PSeqlist seq,size_t pos);void Remove(PSeqlist seq,DataType data);void RemoveAll(PSeqlist seq,DataType data);void Bubblesort(PSeqlist seq);void Secletsort(PSeqlist seq);void Secletsort_OP(PSeqlist seq);int BinarySearch(PSeqlist seq,DataType data);int Size(PSeqlist seq);int Empty(PSeqlist seq);#endif //_STATICSEQLIST_H__StaticSeqlist.c文件

#include"StaticSeqList.h"void IniSeqlist(PSeqlist seq)   //初始化静态顺序表{	assert(seq);	seq->size = 0;	memset(seq->array, 0 ,sizeof(seq->array));}void PushBack(PSeqlist seq,DataType data)   //静态顺序表数据后插{	assert(seq);	if(seq->size == MAXSIZE)	{		return;	}	seq->array[seq->size++] = data;}void PopBack(PSeqlist seq)   //静态顺序表数据后删{	assert(seq);	if(seq->size == 0)	{		return;	}	seq->size--;}void PushFront(PSeqlist seq,DataType data)    //静态顺序表数据前插{	DataType idx = 0;	assert(seq);	if(seq->size == MAXSIZE)	{		return;	}	for(idx=seq->size-1; idx>=0;--idx)	{		seq->array[idx+1] = seq->array[idx];	}	seq->array[0] = data;	seq->size ++;}void PopFront(PSeqlist seq)   //静态顺序表数据前删{	int idx = 1;	assert(seq);	if(seq->size == 0)	{		return;	}	for(; idx<seq->size; ++idx)	{		seq->array[idx-1] = seq->array[idx];	}	seq->size--;}void Insert(PSeqlist seq,size_t pos,DataType data)  //静态顺序表数据任意位置插入数据{	int idx = 0;	assert(seq);	if(pos > seq->size)	{		return;	}	for(idx=seq->size-1; idx>=pos; --idx)	{		seq->array[idx+1] = seq->array[idx];	}	seq->array[pos] = data;	seq->size++;}void Erase(PSeqlist seq,size_t pos)   //静态顺序表数据任意位置删除数据{	int idx = pos;	assert(seq);	if(pos>seq->size)	{		return;	}	for(; idx<seq->size-1; ++idx)	{		seq->array[idx] = seq->array[idx+1];	}	seq->size--;}int Find(PSeqlist seq,DataType data)   //查找静态顺序表data元素  返回下标{	int idx = 0;	assert(seq);	for(; idx<seq->size; ++idx)	{		if(seq->array[idx] == data)		{			return idx;		}	}	return -1;}void Remove(PSeqlist seq,DataType data)   //删除静态顺序表中值为data的元素{	int ret = 0;	int idx = 0;	assert(seq);	if(seq->size == 0)	{		return;	}	if(-1 != (ret = Find(seq,data)))	{		Erase(seq,ret);	}}void RemoveAll(PSeqlist seq,DataType data)  //缺点  Find每次查找都要从第一个位置开始{	int pos = 0;	assert(seq);	while(-1!=(pos = Find(seq,data)))	{		Erase(seq,pos);	}}void RemoveAll(PSeqlist seq,DataType data)  //自己实现的删除所有data元素{	int idx = 0;	int count = 0;	assert(seq);	if(seq->size == 0)	{		return;	}	for(; idx<seq->size; ++idx)	{		if(seq->array[idx] == data)		{			count++;			Erase(seq,idx);		}	}}void RemoveAll(PSeqlist seq,DataType data)  //(老师)上课所讲的方法删除所有data元素{	int count = 0;	int idx= 0;	assert(seq);	for(; idx<seq->size; ++idx)	{		if(seq->array[idx] == data)		{			count++;		}		else		{			seq->array[idx-count] = seq->array[idx];		}	}	seq->size -= count;}void PrintSeqlist(PSeqlist seq)   //打印顺序表{	int idx = 0;	assert(seq);	for(; idx<seq->size; ++idx)	{		printf("%d ",seq->array[idx]);	}	printf("/n");}void Bubblesort(PSeqlist seq)   //冒泡排序{	DataType i = 0;	DataType j = 0;	DataType flag = 0;	assert(seq);	for(i=0; i<seq->size-1; ++i)	{		flag = 0;		for(j=0; j<seq->size-i-1; ++j)		{			if(seq->array[j]>seq->array[j+1])			{				DataType tmp = seq->array[j];				seq->array[j] = seq->array[j+1];				seq->array[j+1] = tmp;				flag = 1;			}		}		if(flag == 0)		{			break;         //防止当已排序成功但循环没有结束		}	}}void Secletsort(PSeqlist seq)  //选择排序法{	DataType i = 0;	DataType j = 0;	DataType pos = 0;	DataType tmp = 0;	assert(seq);	for(i=0; i<seq->size-1; ++i)	{		pos = 0;		for(j=1; j<seq->size-i; ++j)		{			if(seq->array[pos]<seq->array[j])			{				pos = j;			}		}			if(pos != seq->size-i)			{				tmp = seq->array[pos];				seq->array[pos] = seq->array[seq->size-i-1];				seq->array[seq->size-i-1] = tmp;			}	}}void Secletsort_OP(PSeqlist seq)    //优化后的选择排序法{             	DataType j = 0;	DataType begin = 0;	DataType end = 0; 	DataType maxPos = 0;	DataType minPos = 0;	DataType tmp = 0;	assert(seq);	end = seq->size-1;		while(begin<end)	{		maxPos = begin;		minPos = begin;				for(j=begin+1; j<=end; ++j)		{			if(seq->array[maxPos]<seq->array[j])			{								maxPos = j;			}						if(seq->array[minPos]>seq->array[j])			{								minPos = j;                        			}                                        		}		   			if(end != maxPos)			{				tmp = seq->array[maxPos];				seq->array[maxPos] = seq->array[end];				seq->array[end] = tmp;			}			if(begin != minPos)			{				tmp = seq->array[minPos];				seq->array[minPos] = seq->array[begin];				seq->array[begin] = tmp;				}				end--;				begin++;	}}int BinarySearch(PSeqlist seq,DataType data)  //二分查找{	DataType left = 0;	DataType right = 0;	DataType mid = 0;	assert(seq);	right = seq->size;	while(left<right)	{		mid = left-((left-right)>>1);		if(seq->array[mid]>data)		{			right = mid;		}		else if(seq->array[mid]<data)		{			left = mid+1;		}		else		{			return mid;		}	}	return -1;}int Size(PSeqlist seq){	assert(seq);	return seq->size;}int Empty(PSeqlist seq){	assert(seq);	if(seq->size == 0)	{		return -1;	}	return 0;}test.c文件

#include"StaticSeqList.h"void Funtest(){	DataType ret = 0;	Seqlist seq;	IniSeqlist(&seq);	PushBack(&seq,0);	PushBack(&seq,1);	PushBack(&seq,2);	PushBack(&seq,3);	PushBack(&seq,4);	PushBack(&seq,5);	PushBack(&seq,6);	PrintSeqlist(&seq);	PopBack(&seq);	PrintSeqlist(&seq);	PushFront(&seq,0);	PrintSeqlist(&seq);	PopFront(&seq);    PrintSeqlist(&seq);	Insert(&seq,3,8);	PrintSeqlist(&seq);	Erase(&seq,3);	PrintSeqlist(&seq);	Remove(&seq,3);	PrintSeqlist(&seq);	RemoveAll(&seq,2);	Bubblesort(&seq);	Secletsort(&seq);    Secletsort_OP(&seq);    ret = BinarySearch(&seq,2);	PrintSeqlist(&seq);     ret = Size(&seq);	printf("%d/n",ret);	}int main(){	Funtest();	system("pause");	return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表