生成文件
对于一个工程,需要生成三个文件,一个.h文件和两个.c文件,.h文件用于声明函数,而两个.c文件分别是.h文件中声明函数的具体实现代码和测试文件,例如我这里要创建一个顺序表并实现一些基本功能,我创建的三个文件分别是sqlist.h sqlist.c和test.c文件。
sqlist.h
如图所示,这个文件里的内容就是声明表的主体包括两个部分:一个数组和一个last(最后一个元素的下标),以及一些函数功能的声明
//.h文件的作用是定义结构体,定义函数名
/* 第一种定义结构体方式
typedef int data_t;
#define N 128
struct sqlist_t
{
data_t data[N];
int last;
};
typedef struct sqlist_t sqlist;//sqlist L; struct sqlist_t L;
typedef struct sqlist_t * sqlink;// struct sqlist_t * p; sqlink p;
*/
//第二种定义结构体方式
typedef int data_t;
#define N 10 //数组大小为10
typedef struct {
data_t data[N]; //定义data数组的大小
int last; //定义最后一个元素的下标
}sqlist, *sqlink; //sqlist是结构体 *sqlink是结构体的指针 这是顺序表的标准格式
sqlink list_create(); //创建一个线性表,sqlink是返回值的类型,表示返回该线性表的地址,不需要参数
int list_clear(sqlink L); //返回值都是int型 置空,里面的参数是指针/地址
int list_delete(sqlink L); //删除
int list_empty(sqlink L); //检查内容是否为空
int list_length(sqlink L); //计算表长度
int list_locate(sqlink L, data_t value); //在表中检查value的位置
int list_insert(sqlink L, data_t value, int pos); //在表中插入一个value,位置是pos
int list_show(sqlink L); //打印表
int list_merge(sqlink L1,sqlink L2); //合并两个顺序表
int list_show(sqlink L); //显示表
int list_delete2(sqlink L); //删除表中重复元素
sqlist.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"sqlist.h"
sqlink list_create()
{
//申请内存
sqlink L;
L=(sqlink)malloc(sizeof(sqlist));//malloc输出为void,需要强制转换用(sqlink)
if (L == NULL)//如果malloc返回值是空 表示创建失败
{
printf("线性表创建失败");
return L;
}
//初始化
memset(L,0,sizeof(sqlist));//memset作用是把内容都清零
L->last = -1;//注意这里的结构体访问元素用-> 下标不可能为-1,用-1表示数组里的值都清零
//申请成功,返回值是空表地址
return L;
}
//显示顺序表内容
int list_show(sqlink L)
{
int i;
for(i=0;i<=L->last;i++)
{
printf("%d ",L->data[i]);
}
putchar('\n');
}
//线性表置空函数,返回值0正常,返回值-1异常
int list_clear(sqlink L)
{
memset(L,0,sizeof(sqlist));//memset作用是把内容都清零
L->last = -1;
if (L == NULL)//判断表是否为空
return 0;
else
return -1;
}
//函数:判断顺序表是否为空,空返回0,非空返回1
int list_empty(sqlink L)
{
if (L->last == -1)//判断表是否为空
return 0;
else
return 1;
}
//函数:计算顺序表的有效长度
int list_length(sqlink L)
{
if(L == NULL) //如果参数没有传进来,返回-1
return -1;
else
return(L->last+1);//如果参数传进了,返回last+1,例如最后下标为2,有效长度就为3
}
//函数:在顺序表中找到某个元素的位置并输出位置i,没有找到输出-1
int list_locate(sqlink L,data_t value)
{
int i=0;
for(i=0;i<N;i++)
{
if(L->data[i] == value)
{
return i;
break;
}
}
return -1;
}
//在顺序表中的指定位置插入一个元素
int list_insert(sqlink L,data_t value,int pos)
{ int i;
//先检查是否有空余位置
if(L->last == N-1)
printf("当前数据表已满\n");
#if 1
for(i=L->last+1;i>pos;i--)
{
L->data[i]=L->data[i-1];
}
L->data[pos]=value;
#endif
L->last++;
return 0;
}
//在顺序表中删除指定位置的元素
int list_delete(sqlink L,int pos)
{
int i;
for(i=pos;i<L->last;i++)
{
L->data[i]=L->data[i+1];
}
L->data[L->last]=0;
L->last--;
return 0;
}
//合并两个顺序表
int list_merge(sqlink L1,sqlink L2)
{
int i=0;//用于遍历
int ret;//用于判断L2中的data[i]是否有相同元素
if(list_empty(L2))//L2如果为空 则退出函数不合并
return -1;
while(i<=L2->last)
{
ret=list_locate(L1,L2->data[i]);//判断L2中元素在L1中位置
if (ret == -1)//如果没有重合,插入
{
if(L1->last == N-1)//判断L1是否满了
break;
list_insert(L1,L2->data[i],L1->last+1);//没有重合且L1没满,插入
i++;
}
i++;
return 0;
}
}
//删除顺序表中的重复元素
int list_delete2(sqlink L)
{
int i=0;
int j;
while(i<L->last)
{
printf("****\n");
for(j=i+1;j<=L->last;j++)
{
if(L->data[j] == L->data[i])
{
list_delete(L,j);
}
}
i++;
}
return 0;
}
test.c
这里我有两个测试文件
#include<stdio.h>
#include<stdlib.h>
#include"sqlist.h"
int main()
{
sqlink L;
L = list_create();
#if 0 //测试创建顺序表并置空的功能
int i;
for(i=0;i<=N;i++)
{
printf("%d ",L->data[i]);
}
putchar('\n');
#endif
#if 0 //测试检查表是否为空的功能
int x=list_empty(L);
if (x == 0)
printf("顺序表为空\n");
else
printf("顺序表不为空\n");
#endif
#if 0 //检查有效长度功能
int y=list_length(L);
if (y == -1)
printf("参数传入失败\n");
printf("当前顺序表有效长度为%d\n",y+1);
#endif
#if 0 //检查确定数据位置功能
int z;
list_locate(L,z);
#endif
#include<stdio.h>
#include<stdlib.h>
#include"sqlist.h"
int main()
{
sqlink L1;
sqlink L2;
L1 = list_create();
L2 = list_create();
list_clear(L1);
list_clear(L2);
list_insert(L1,1,0);
list_insert(L1,2,0);
list_insert(L1,3,0);
list_insert(L1,1,0);
list_insert(L1,2,0);
list_insert(L1,3,0);
#if 0
list_insert(L2,2,0);
list_insert(L2,3,0);
list_insert(L2,4,0);
list_insert(L2,5,0);
list_insert(L2,6,0);
list_insert(L2,7,0);
#endif
list_show(L1);
list_delete2(L1);
list_show(L1);
free(L1);
}