创建一个顺序表,并实现一些基本功能

生成文件

对于一个工程,需要生成三个文件,一个.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);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值