c语言静态顺序表的相关功能实现

首先给出头文件部分,是所实现函数功能的声明和头文件的引用

SeqList.h

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __SEQLIST_H__ 
#define __SEQLIST_H__ 

#include<stdio.h>
#include<stdlib.h>
#include <assert.h>

#define MAX 10 //定义顺序表最大容量

typedef int DataType;//定义数据类型

typedef struct SeqList
{
	DataType data[MAX];//数据类型
	int sz;//元素数量
}SeqList, *pSeqList;

void InitSeqList(pSeqList ps);//初始化顺序表
void PushBack(pSeqList ps, DataType d);//插尾
void PopBack(pSeqList ps);//删尾
void Display(const pSeqList ps);//打印顺序表
void PushFront(pSeqList ps, DataType d);//插头
void PopFront(pSeqList ps);//删头
int Find(pSeqList ps, DataType d);//查找你要的元素
void Insert(pSeqList ps, DataType d, int pos);//在给定的位置插入元素
void Remove(pSeqList ps, DataType d);//删除你要删除的元素第一个
void RemoveAll(pSeqList ps, DataType d);//删除你要删除的的出现的所有元素
void Reverse(pSeqList ps);//逆序顺序表
void Sort(pSeqList ps);//排序逆序表
int BinarySearch(pSeqList ps, DataType d);//二分查找
#endif //__SEQLIST_H__
接下里来给出测试函数的实现

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
void InitSeqList(pSeqList ps)//初始化顺序表
{
	assert(ps != NULL);
	ps->sz = 0;
	memset(ps->data, 0, sizeof(ps->data));
}
void PushBack(pSeqList ps, DataType d)//在尾部插入尾函数
{
	assert(ps != NULL);
	if (ps->sz == MAX)
	{
		return;
	}
	ps->data[ps->sz] = d;
	ps->sz++;
}
void Display(const pSeqList ps)//打印函数
{
	int i = 0;
	assert(ps != NULL);
	for (i = 0; i < ps->sz; i++)
	{
		printf("%d ", ps->data[i]);
	}
	printf("\n");
}
void PopBack(pSeqList ps)//删除尾部的元素函数
{
	assert(ps != NULL);
	ps->sz--;
}
void PushFront(pSeqList ps, DataType d)//从头部开始插入元素
{
	assert(ps != NULL);
	if (ps->sz<MAX)
	{
		int i = 0;
		for (i =ps->sz; i>0; i--)
		{
			ps->data[i] = ps->data[i-1];
		}
		ps->data[0] = d;
		ps->sz++;
	}
}
void PopFront(pSeqList ps)//删除头部
{
	int i = 0;
	assert(ps != NULL);
	for (i = 0; i < ps->sz; i++)
	{
		ps->data[i] = ps->data[i + 1];
	}
	ps->sz--;
}
int Find(pSeqList ps, DataType d)//查找第几个元素
{
	int i = 0;
	if (ps != NULL);
	for (i = 0; i < ps->sz; i++)
	{
		if (ps->data[i] == ps->data[d-1])
			return ps->data[i];
	}
	return -1;
}
void Insert(pSeqList ps, DataType d, int pos)//指定位置插入元素,d要插入的元素,pos指定位置
{
	assert(ps != NULL);
	if (ps->sz<MAX)
	{
		int i = 0;
		for (i = ps->sz; i>pos - 1; i--)
		{
			ps->data[i] = ps->data[i - 1];
		}
		ps->data[pos - 1] = d;
		ps->sz++;
	}
	else
		return;
}
void Remove(pSeqList ps, DataType d)//删除你要删除的第一个出现的元素
{
	int i = 0, j = 0;;
	assert(ps != NULL);
	for (i = 0; i < ps->sz; i++)
	{
		
		if (ps->data[i] == d)
		{
			for (j = i; j < ps->sz; j++)
			{
				ps->data[j] = ps->data[j + 1];
			}
			ps->sz--;
			break;
		}
	}
}
void RemoveAll(pSeqList ps, DataType d)
{
	int i = 0, j = 0;;
	assert(ps != NULL);
	for (i = 0; i < ps->sz;i++)
	{
		if (ps->data[i] == d)
		{
			for (j = i; j < ps->sz; j++)
			{
				ps->data[j] = ps->data[j + 1];
			}
			ps->sz--;
			i = 0;
		}
	}
}
void Reverse(pSeqList ps)//逆序顺序表
{
	assert(ps != NULL);
	int i = 0,j=ps->sz-1;
	int n = ps->sz /2 ;
	for (i = 0; i <=n / 2; i++,j--)
	{
		int temp = 0;
		temp = ps->data[i];
		ps->data[i] = ps->data[j];
		ps->data[j] = temp;
	}
}
void Sort(pSeqList ps)//排序,采用的是冒泡排序
{
	assert(ps != NULL);
	int i = 0, j = 0;
	for (i = 0; i < ps->sz - 1; i++)
	{
		for (j = 0; j < ps->sz - 1 - i; j++)
		{
			int temp = 0;
			if (ps->data[j]>ps->data[j + 1])
			{
				temp = ps->data[j];
				ps->data[j] = ps->data[j + 1];
				ps->data[j + 1] = temp;
			}
		}
	}
}
int BinarySearch(pSeqList ps, DataType d)//二分查找,d表示你要查找的元素
{
	int left = 0;
	int right = ps->sz - 1;
	while (left < right)
	{
      int mid = (right - left) / 2 + left;
		if (d>ps->data[mid])
		{
			left = mid+1;
		}
		else if(d < ps->data[mid])
		{
			right = mid - 1;
		}
		else 
		{
			return mid;
		}
	}
}
最后给出test.c部分,这里主要是main函数和测试函数来测试所实现的函数功能

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
void test()
{
	SeqList my_list;//创建结构提变量
	InitSeqList(&my_list);//初始化函数
	//PushBack(&my_list, 1);//插尾函数
	//PushBack(&my_list, 2);//插尾函数
	//PushBack(&my_list, 3);//插尾函数
	//PushBack(&my_list, 4);//插尾函数
	//Display(&my_list);//打印数序表
	//PopBack(&my_list);//删除尾部元素的信息
	//Display(&my_list);//打印数序表
	PushFront(&my_list, 1);//从头部插入
	PushFront(&my_list, 2);
	PushFront(&my_list, 3);
	PushFront(&my_list, 4);
	Display(&my_list);
	/*Insert(&my_list, 10, 4);*///指定位置插入元素
	/*Remove(&my_list, 2);*///删除所有你想删除的元素出现的第一个
	//RemoveAll(&my_list, 2);//删除顺序表中出现的所有你要删除的元素
	//Display(&my_list);
	/*Reverse(&my_list);*///逆序的测试
	Sort(&my_list);//排序的测试
	Display(&my_list);
	int ret = BinarySearch(&my_list,1 );//二分查找的测试
	printf("%d",ret);
	/*Display(&my_list);*/
}
int main()
{
	test();//测试函数,用来测试顺序表所有功能
	system("pause");
	return 0;
}
对于void test()测试函数中的内容,因为我在编写的时候根据自己实现的函数顺序所测试的,所以大家可以根据自己的想法重新调整测试函数里面的函数测试顺序。

有什么问题欢迎大家随时评论指正!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值