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

///C语言实现静态顺序表///
#include<stdio.h>
#include<assert.h>

#define MaxSize 5
typedef int DataType;

typedef struct SeqList
{
	DataType arr[MaxSize];
	size_t size;
}SeqList,*pSeqList;

void InitSeqList(SeqList* seq)//初始化
{
	assert(seq);
	printf("%x\n",&seq);
	memset(seq->arr,0,sizeof(seq->arr));
	seq->size = 0;
}
void PrintSeqList(SeqList* seq)//打印
{
	int i = 0;
	for(; i < seq->size; i++)
	{
		printf("%d ",seq->arr[i]);
	}
	printf("\n");
}
void Reverse(SeqList* seq, int left, int right)//递归逆序打印顺序表
{
	if(left < right)
	{
		int temp;
		temp = seq->arr[right];
		seq->arr[right] = seq->arr[left];
		seq->arr[left] = temp;
		Reverse(seq, left+1, right-1);
	}
}
void PushBack(SeqList* seq, DataType data)//尾插
{
	assert(seq);
	if(seq->size >= MaxSize)
		return;
	seq->arr[seq->size++] = data;
}
void PopBack(SeqList* seq)//尾删
{
	assert(seq);
	if(seq->size == 0)
		return;
	seq->size--;
}
void PushFront(SeqList* seq, DataType data)//头插
{
	int idx = 0;
	for(idx = seq->size-1; idx >= 0; idx--)
	{
		seq->arr[idx+1] = seq->arr[idx];
	}
	seq->arr[0] = data;
	seq->size++;
}
void PopFront(SeqList* seq)//头删
{
	int idx = 0;
	assert(seq);
	for(idx = 0; idx < seq->size-1; idx++)
	{
		seq->arr[idx] = seq->arr[idx+1];
	}
	seq->size--;
}
void Insert(SeqList* seq, size_t pos, DataType data)//任意位置插入
{
	int idx = seq->size;//可能尾插
	if(NULL == seq || pos > seq->size)//链表为空pos位置大于size都不合法
		return;
	if(seq->size >= MaxSize)//插入后元素个数大于容量
		return;
	for(; idx >= pos; idx--)
	{
		seq->arr[idx] = seq->arr[idx+1];
	}
	seq->arr[pos] = data;
	seq->size++;
}
void Erase(SeqList* seq, size_t pos)//任意位置删除
{
	int idx = pos;
	if(NULL == seq || pos >= seq->size || seq->size == 0)//如果链表为空或删除位置不合法或链表元素为0
		return;
	
	for(;idx < seq->size; idx++)
	{
		seq->arr[idx] = seq->arr[idx+1];
	}
	seq->size--;
}
int Find(SeqList* seq, DataType data)//查找某个元素位置
{
	int idx = 0;
	assert(seq);
	for(;idx < seq->size; idx++)
	{
		if(seq->arr[idx] == data)
			return idx;
	}
	return -1;
}
int BinarySearch(SeqList* seq, int key, int left, int right)
{
	int mid;
	//left = 0;
	//right = seq->size-1;
	//assert(seq);
	if(left <= right){//左边要小于右边
	mid = left + (right-left)/2;
	if(seq->arr[mid] == key)
		return mid;
	else if(seq->arr[mid] < key)
		return BinarySearch(seq, key, mid+1, right);
	else /*if((seq->arr[mid] > key))*/
	{
		return BinarySearch(seq, key, left, mid-1);
	}
	}
	else{
		return -1;}
}
void Remove(SeqList* seq, DataType data)//删除值为data的元素
{
	assert(seq);
	Erase(seq, Find(seq, data));
}
void RemoveAll(SeqList* seq, DataType data)//删除所有值为data的元素
{
	int count = 0;
	int idx = 0;
	//assert(seq);
	while(idx < seq->size)
	{
		if(seq->arr[idx] = data)
		{
			count++;
		}
		else
		{
			seq->arr[idx-count] = seq->arr[idx];
		}
		idx++;
	}
	seq->size -= count;
}
void BubbleSort(SeqList* seq)//冒泡排序
{
	int i = 0;
	int j = 0;
	int flag = 0;
	assert(seq);
	for(i = 0; i < seq->size-1; i++)
	{
		flag = 0;
		for(j = 0; j < seq->size-1-i; j++)
		{
			if(seq->arr[j] > seq->arr[j+1])
			{
				DataType temp;
				temp = seq->arr[j+1];
				seq->arr[j+1] = seq->arr[j];
				seq->arr[j] = temp;
				flag = 1;
			}
		}
		if(flag == 0)
			return;
	}
}

void FunTest()
{
	SeqList seq;
	int pos = 0;
	InitSeqList(&seq);
	//PrintSeqList(&seq);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PushBack(&seq, 5);
	PushFront(&seq, 1);
	//Insert(&seq, 3, 3);
	PrintSeqList(&seq);
	Reverse(&seq, 0, 4);

	//BubbleSort(&seq);
	//pos = BinarySearch(&seq, 4, 0, 4);
	//RemoveAll(&seq, 4);
	PrintSeqList(&seq);//有问题

	PopFront(&seq);
	//pos = Find(&seq, 4);
	//printf("%d\n",pos);

	//Remove(&seq, 4);
	
	printf("%d\n",seq.size);
}
int main()
{
	FunTest();
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值