数据结构--顺序表

学数据结构一个月左右了,可代码敲得却不是很多,一方面学校功课有点重,一方面自己想做的事情也比较多,当然最重要的原因还是自己利用时间效率太低了。不过还是要加油啊,时间很珍贵,不断提高自己的时间利用效率,不断学习,不断提升自己的实力。
今天找了一个时间把这目前学的一部分代码贴到这里,自己当时写代码没有加注释,在这里加一点注释理一下,也算是一种小小的复习吧。感觉认真看了书目前学的部分还是算比较简单的内容,实现的时候也没遇上什么困难,当然代码可能有些地方不完善。

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

#define INIT_SIZE 5        //顺序表的初始容量,这里比较小是因为方便测试Judge_Full函数的功能
#define SIZE_INCREMENT 10  //满时每次新增加的容量

typedef struct{
	int * base;     //分配内存块的首地址,当作数组名看较方便理解(可以实现随机存取)
	int length;     //顺序表目前的长度
	int List_size;  //顺序表的容量
}SqList ;            //这几个是此种顺序表的主要要素                                

void Init_List(SqList *);              //初始化一个空顺序表
void Fill_List(SqList *);              //填充该空顺序表,方便后面对顺序表的操作
void Print_List(SqList *);             //输出顺序表中储存的数据
void Insert_List(SqList *,int ,int );  //在顺序表中某位置后插入某元素
void Delete_List(SqList *,int );       //删除顺序表中某元素
void Clear_List(SqList *);             //清空顺序表
void Destory_List(SqList *);           //销毁顺序表
void Judge_Full(SqList *);             //判断顺序表是否为满
void Judge_Empty(SqList *);            //判断顺序表是否为空
void Judge_Exist(SqList *);            //判断顺序表是否存在


int main()                             //主函数这里实现的功能主要是测试各个分函数
{
	SqList * S;
	S = (SqList *)malloc(INIT_SIZE *sizeof(int));
	int n = 9;
	int e = 100;
	Init_List(S);
	Fill_List(S);
	Print_List(S);
	Insert_List(S,n,e); //在第n个元素后面插入e
	Print_List(S);
	Delete_List(S,n); //删除第n个元素 
    //Destory_List(S); 
    //Clear_List(S);
	Print_List(S); 
	return 0;
 } 
 void Init_List(SqList *S)
 {
 	S->base = (int *)malloc(INIT_SIZE *sizeof(int));
 	if(!S->base)                             //分配内存失败
 	{
 		printf("Fail to Build the List");
 		exit (1);
	 }
 	S->length = 0;                           //初始化其长度为0,初始容量为预定义值
 	S->List_size = INIT_SIZE;
 }
 void Judge_Full(SqList *S)
 {
 	Judge_Exist(S);
 	if(S->length == S->List_size)            //满
 	{
 		S->base = (int *)realloc(S->base,(S->List_size + SIZE_INCREMENT)* sizeof(int));//重新分配内存
 		if(!S->base)                         //重新分配内存失败
 		{
 			printf("the List is Full but Fail to Realloc");
 			exit (2);
		 }
	 }
 }
 void Fill_List(SqList *S)
 {
 	int i;
 	for(i = 0;i<9;i++)
 	{
 		Judge_Exist(S);
 		Judge_Full(S);
 		S->base[i] = i;
 		S->length ++;
	 }
 }
 void Print_List(SqList *S)
 {
 	int i ;
 	Judge_Exist(S);
 	Judge_Empty(S);
 	printf("the Elements of the List:\n");
 	for(i = 0;i < S->length;i++)
 	{
 		printf("%d ",S->base[i]);
	 }
	 printf("\n");
 }
 void Insert_List(SqList *S,int n,int e)
 //在第n个元素后面插入e 
 {
 	int i ;
 	Judge_Exist(S);
 	if( n<1 || n>S->length)
 	{
 		printf("Input Error");
 		exit (3);
	 }
	if(n == S->length)
	 {
	 	Judge_Full(S);             //每次插入前判断表是否为满
	 	S->base[n] = e;            //在第n+1个位置插入该元素
	 	S->length ++;              //长度加1
	 }
 	else 
 	{
 		for(i = S->length;i>(n-1);i--)         //移动后面元素,也是顺序储存结构的一个缺点
 		{
 			Judge_Full(S);
 			S->base[i] = S->base[i-1];
		 }
		 S->base[i+1] = e;
		 S->length++;
	 }
 }
void Delete_List(SqList *S,int n )           //操作基本类似插入元素
{
	int i;
	Judge_Exist(S);
	Judge_Empty(S);
	if((n<1)||(n>S->length))
	{
		printf("Input Error");
		exit (5);
	}
	for(i = n-1;i<S->length;i++)
	{
		S->base[i] = S->base[i+1];
	}
	S->length--;
}
void Judge_Empty(SqList *S)
{
	if((S->length) == 0)                 
	{
		printf("the List is Empty");
		exit (4);
	 } 
}
void Destory_List(SqList *S)
{
	free(S->base);                 //释放内存块,摧毁空间,销毁该表
	S->base = NULL;
 } 
void Judge_Exist(SqList *S)
{
	if(!S->base)
	{
		printf("the List doesn't Exist\n");
		exit (6);
	}
}
void Clear_List(SqList *S)
{
	S->length = 0;                          //通过length来清空顺序表
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值