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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态顺序是一种使用数组实现的线性,它的大小在编译时确定,不可动态改变。下面是静态顺序的C语言实现: ```c #define MAX_SIZE 100 // 定义静态顺序的最大容量 typedef struct { int data[MAX_SIZE]; // 用数组存储数据元素 int length; // 当前顺序的长度 } SeqList; // 初始化顺序 void init(SeqList *list) { list->length = 0; } // 插入元素 int insert(SeqList *list, int index, int value) { if (index < 0 || index > list->length || list->length == MAX_SIZE) { return 0; // 插入位置不合法或顺序已满,插入失败 } for (int i = list->length - 1; i >= index; i--) { list->data[i + 1] = list->data[i]; // 将插入位置后的元素后移一位 } list->data[index] = value; // 在插入位置插入新元素 list->length++; // 长度加1 return 1; // 插入成功 } // 删除元素 int remove(SeqList *list, int index) { if (index < 0 || index >= list->length) { return 0; // 删除位置不合法,删除失败 } for (int i = index + 1; i < list->length; i++) { list->data[i - 1] = list->data[i]; // 将删除位置后的元素前移一位 } list->length--; // 长度减1 return 1; // 删除成功 } // 获取元素 int get(SeqList *list, int index) { if (index < 0 || index >= list->length) { return -1; // 获取位置不合法,返回-1示失败 } return list->data[index]; } // 修改元素 int modify(SeqList *list, int index, int value) { if (index < 0 || index >= list->length) { return 0; // 修改位置不合法,修改失败 } list->data[index] = value; return 1; // 修改成功 } ``` 以上是静态顺序的简单实现,包括初始化、插入、删除、获取和修改等基本操作。你可以根据需要进行调用和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值