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