数据结构--顺序表的实现

#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h" 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
	SeqList* list=SeqList_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);
	//超过了长度,z=5是插不进去的 
	for(index=0;index<SeqList_Length(list);index++)
	{
		//Get函数得到的一个数据的地址,将这个地址做强制类型转换之后,
		//通过指针取出该地址中保存的数据 
		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_Destory(list);
	return 0;
}

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

//创建可复用的数据链表,保存它的地址,而不是具体数据
//这样子可以接受不同的数据类型,不用修改太多
//Insert(list,char c,int pos)
//Insert(list.int i,int pos) 
//往数据表中插入的是指针,地址、 4个字节,32位。 
//顺序表中存放的是各种数据的地址,是一个指针 
typedef unsigned int TSeqListNode;
typedef struct _tag_SeqList
{
	int capacity;
	int length;
	TSeqListNode*node;
}TSeqList;
/***********************
/功能:创建一个顺序表 
/返回值: Seqlist*(void* ),是一个指针,指向真实的顺序表 
/ 
/***********************/
SeqList* SeqList_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*,是一个地址,在其他调用函数中可以数据类型转换 
	 } 
} 
/***********************
/功能:销毁顺序表 
/返回值: none 
/ 
/***********************/
void SeqList_Destory(SeqList* list)
{
	free(list);
} 

void SeqLsit_Clear(SeqList* list)
{
	TSeqList*sList=(TSeqList*)list;
	if(sList!=NULL)
	{
		sList->length=0;
		//默认length==0时,该顺序表为空,不再需要考虑此时里面是否存有数据 
	}
}
/***********************
/功能:获得顺序表现在的长度 
/返回值: 顺序表此时的长度 
/ 
/***********************/
int SeqList_Length(SeqList* list)
{
	TSeqList* sList=(TSeqList*)list;
	int ret=-1;
	if(sList!=NULL)
	{
		ret=sList->length;
	}
	return ret;
}
/***********************
/功能:获得顺序表的容量 
/返回值: 顺序表的容量 
/ 
/***********************/
int SeqList_Capacity(SeqList*list)
{
	TSeqList*sList=(TSeqList*)list;
	int ret=-1;
	if(sList!=NULL)
	{
		ret=sList->capacity;
	}
	return ret;
}
/***********************
/功能:在顺序表插入一个元素,顺序表的下标从0开始,一分配的数组下标要区分 
/返回值: int型 
/ 参数:顺序表的地址,插入元素的地址,插入的位置 
/***********************/
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos)
{
	//void*形参的顺序表强制类型转换成相应的顺序表数据类型 
	TSeqList*sList=(TSeqList*)list;
	int ret=(sList!=NULL);
	int i=0;
	ret=ret&&(sList->length+1<=sList->capacity);
	ret=ret&&(pos>=0);
	if(ret)
	{
		//判断是否大于最后,是则修正为最后 
		if(pos>=sList->length)
		{
			pos=sList->length; 
		}
		for(i=sList->length;i<pos;i--)
		{
			sList->node[i]=sList->node[i-1];
		}
		//node参数,一个指针值,地址,强制类型转换,将node数据元素的这个地址保存在node[]中 
		sList->node[i]=(TSeqListNode)node;
		sList->length++;
	}
	return ret;
}
/***********************
/功能:获得顺序表下标pos的数据 
/返回值: SeqListnode* _void*型,地址 
/ 参数:顺序表,位置pos 
/***********************/
SeqListNode* SeqList_Get(SeqList* list,int pos)
{
	TSeqList*sList=(TSeqList*)list;
	SeqListNode*ret=NULL;
	if((sList!=NULL)&&(pos>=0)&&(pos<sList->length)) 
	{
		//node 中保存的是地址值,将它强制类型转换 
		ret=(SeqListNode*)(sList->node[pos]);
	}
	return ret;
}
/***********************
/功能:删除顺序表下边为pos位置的元素 
/返回值: SeqListNode*—void*型,地址 ,返回删除的数据元素的地址 
/ 参数:顺序表,要删除的位置pos 
/***********************/
SeqListNode* SeqList_Delete(SeqList* list,int pos)
{
	TSeqList*sList=(TSeqList*)list;
	SeqListNode* ret=SeqList_Get(list,pos);
	int i=0;
	if(ret!=NULL)
	{
		//pos 后面的元素pos+1向前移动 
		for(i=pos+1;i<sList->length;i++)
		{
			sList->node[i-1]=sList->node[i]; 
		}
		sList->length--;
	}
	return ret;
}


#ifndef _SEQLIST_H
#define _SEQLIST_H
typedef void SeqList;
typedef void SeqListNode;
//void* 封装这两个数据类型的元素,
//void* 可以接收任何类型的数据元素的指针
//void* 可以赋值给任何类型的指针,但是需要做强制类型转换 
SeqList* SeqList_Create(int capacity);
void SeqList_Destory(SeqList* list);
void SeqLsit_Clear(SeqList* list);
int SeqList_Length(SeqList* list);
int SeqList_Capacity(SeqList*list);
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos);
SeqListNode* SeqList_Get(SeqList* list,int pos);
SeqListNode* SeqList_Delete(SeqList* list,int pos);


#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值