【C语言实现】可复用的顺序线性表


用C语言实现可复用的顺序线性表,进行了数据封装,可以直接使用

SeqList.h

#ifndef SEQLIST_H
#define SEQLIST_H

typedef void SeqList;		
typedef void SeqListNode;
//创建线性表
SeqList* List_Create(int capacity);
//获取线性表的最大长度 
int SeqList_Capacity(SeqList* list);
//销毁线性表
void SeqList_Destroy(SeqList* list); 
//清空线性表
void SeqList_Clear(SeqList* list);
//获取线性表的长度
int SeqList_Length(SeqList* list);
//元素插入线性表;在线性表list的pos位置插入新元素node
//返回值为1表示插入成功,0表示插入失败
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos);
//获取线性表中某个位置的元素;获取线性表list的pos位置处的元素
//返回值为pos位置处的元素,NULL表示获取失败
SeqListNode* SeqList_Get(SeqList* list,int pos); 
//将某个元素从线性表中删除;删除线性表list的pos位置处的元素
//返回值为删除的元素,NULL表示获取失败
SeqListNode* SeqList_Delete(SeqList* list,int pos);

#endif

main.c

简单的插入五个数 输出并删除

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

int main(int argc,char *argv[])
{
	SeqList* list = List_Create(5); 
	int i = 0;
	int j = 1;
	int k = 2;
	int x = 3;
	int y = 4;
	int z = 5;
	int index = 0;
	
    //每次都插入首位,把之前的数字后移
	SeqList_Insert(list,&i,0);
	SeqList_Insert(list,&j,0);
	SeqList_Insert(list,&k,0);
	SeqList_Insert(list,&x,0);
	SeqList_Insert(list,&y,0);
	SeqList_Insert(list,&z,0);
	
    //查找
	for(index = 0;index<SeqList_Length(list);index++)
	{
		int* p = (int*)SeqList_Get(list,index);
		
		printf("%d\n",*p);
	}
	
    printf("\n");	//换个行
	//删除每个元素
    while( SeqList_Length(list)>0 )
	{
		int* p = (int*)SeqList_Delete(list,0);
		
		printf("%d\n",*p);
	}
	//释放空间
	SeqList_Destroy(list);
		
	return 0;
}

SeqList.c

#include<stdio.h>
#include<malloc.h>
#include"SeqList.h"

//在.h文件里用void定义,把数据封装起来
typedef unsigned int TSeqListNode;

typedef struct Tag_SeqList 
{
	int capacity;	//最大长度 
	int length;		//当前长度 
	TSeqListNode* node;
}TSeqList;

//创建线性表
SeqList* List_Create(int capacity)
{
	TSeqList* ret = NULL;	//先创建指针
	
	if(capacity >= 0)
	{
		ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity);
	} 
	if(ret != NULL)
	{
		ret->capacity = capacity;
		ret->length = 0;
		ret->node = (TSeqListNode*)(ret + 1); 
	}
	
	return ret;
}

//销毁线性表
void SeqList_Destroy(SeqList* list)
{
	free(list);
}

//清空线性表
void SeqList_Clear(SeqList* list)
{
	TSeqList* sList = (TSeqList*)list;  //list本身是void*类型的,先做个强制类型转换
	
	if(sList !=NULL)
	{
		sList->length = 0;
	} 
}

//获取线性表的长度
int SeqList_Length(SeqList* list)
{
	TSeqList* sList = (TSeqList*)list;  //list本身是void*类型的,先做个强制类型转换
	int ret = -1;
	
	if(sList !=NULL)
	{
		ret = sList->length;
	} 
	
	return ret;
}

//获取线性表的最大长度 
int SeqList_Capacity(SeqList* list)
{
	TSeqList* sList = (TSeqList*)list;  //list本身是void*类型的,先做个强制类型转换
	int ret = -1;
	
	if(sList !=NULL)
	{
		ret = sList->capacity;
	} 
	
	return ret; 
}

//元素插入线性表;在线性表list的pos位置插入新元素node
//返回值为1表示插入成功,0表示插入失败
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos)
{
	TSeqList* sList = (TSeqList*)list;
	//1,判断线性表是否合法
	int ret = (sList != NULL);
	int i = 0;		//循环变量 
	ret = ret && ((sList->length+1) <= (sList->capacity)); 
	//2,判断插入位置是否合法
	ret = ret && (0<= pos);
	
	if(ret)
	{
		if(pos >= sList->length)
		{
			pos = sList->length; 
		}
		//3.从最后一个元素开始向前遍历到第pos个位置
        //  分别将他们都向后移动一个位置
        for(i=sList->length;i>pos;i--)
        {
        	sList->node[i] = sList->node[i-1];
		}
        //4.将新元素插入
        sList->node[i] = (TSeqListNode)node;
        sList->length++;
	}
	
	return ret;	
}

//获取线性表中某个位置的元素;获取线性表list的pos位置处的元素
//返回值为pos位置处的元素,NULL表示获取失败
SeqListNode* SeqList_Get(SeqList* list,int pos)
{
	TSeqList* sList = (TSeqList*)list;
	SeqListNode* ret = NULL;
	//1.判断线性表是否合法
    //2.判断位置是否合法
	if((sList != NULL)&&(0<=pos)&&(pos<=sList->length))
	{
		ret = (TSeqListNode*)sList->node[pos];
	}
	
	return ret;
}

//将某个元素从线性表中删除;删除线性表list的pos位置处的元素
//返回值为删除的元素,NULL表示获取失败
SeqListNode* SeqList_Delete(SeqList* list,int pos)
{
	TSeqList* sList = (TSeqList*)list;
	SeqListNode* ret = SeqList_Get(list,pos);		//在Get函数里有合法性测试了 
	int i=0;
	if(ret !=NULL)		//说明取出了真实的元素 
	{
		for(i=pos+1;i<sList->length;i++)	//从pos开始,后面的元素往前移动一位 
		{
			sList->node[i-1] = sList->node[i];
		}
		
		sList->length--;
	}
	
	return ret; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值