数据结构——基于C的线性表的顺序存储结构的基本操作的实现

/***
*SeqList.c
*	Copyright (c) 2015, XZG. All rights reserved.
*Purpose:
*   线性表顺序存储结构的创建、数据插入、数据获取、获取长度、删除数据、清空数据、销毁顺序存储结构方法的实现
***/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct _SeqList
{
	unsigned int*  node;
	int length;
	int capacity;
}TSeqList;
typedef void SeqList;
typedef void SeqListNode;


//线性表顺序存储结构的创建
SeqList* SeqList_Create(int capacity)
{
	//为结构体分配内存
	/*第一种内存分配方式
	TSeqList* list = (TSeqList *)malloc(sizeof(TSeqList));
	为结构体中的数组分配内存
	list->node = (unsigned int *)malloc(sizeof(unsigned int)*capacity);
	*/

	/*第二种内存分配方式
	TSeqList* list = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(unsigned int)*capacity);
	list->node = (unsigned int*)list++;
	*/
	TSeqList* ret = NULL;
	if (capacity <= 0)
	{
		return NULL;
	}
	ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(unsigned int)*capacity);;
	if (ret == NULL)
	{
		return NULL;
	}
	ret->node = (unsigned int*)(ret + 1);
	if (ret->node == NULL)
	{
		return NULL;
	}
	//对其初始化
	ret->capacity = capacity;
	ret->length = 0;
	memset(ret->node, 0, sizeof(unsigned int)*capacity);
	return ret;
}

//在线性表顺序存储结构的指定位置插入数据
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
	TSeqList *tList = NULL;
	//判断指针是否为空
	if (list == NULL)
	{
		return -1;
	}
	tList = (TSeqList*)(list);
	if (node == NULL)
	{
		return -1;
	}
	//判断是否满了
	if (tList->length >= tList->capacity)
	{
		return -2;
	}
	//判断位置是否越界
	if (pos < 0 || pos >= tList->capacity)
	{
		return -2;
	}
	if (pos >= tList->length)
	{
		pos = tList->length;
	}
	//插入算法
	for (int i = tList->length; i > pos; i--)
	{
		//将第pos个元素到最后一个元素向后移动一格
		tList->node[i] = tList->node[i - 1];
	}
	tList->node[pos] = (unsigned int)node;
	tList->length++;
	return 0;
}

//删除线性表顺序存储结构指定位置的数据

SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
	TSeqList *tList = NULL;
	SeqListNode* ret = NULL;
	//判断指针是否为空
	if (list == NULL)
	{
		return NULL;
	}
	tList = (TSeqList*)(list);
	//判断位置是否越界
	if (pos < 0 || pos >= tList->length)
	{
		return NULL;
	}
	ret = (SeqListNode*)tList->node[pos];
	for (int i = pos; i < tList->length; i++)
	{
		//将第pos个元素到最后一个元素向后移动一格
		tList->node[i] = tList->node[i + 1];
	}
	tList->length--;
	return ret;
}

//获取线性表顺序存储结构指定位置的数据

SeqListNode* SeqList_Get(SeqList* list, int pos)
{
	TSeqList *tList = NULL;
	SeqListNode* ret = NULL;
	//判断指针是否为空
	if (list == NULL)
	{
		return NULL;
	}
	tList = (TSeqList*)(list);
	//判断位置是否越界
	if (pos < 0 || pos >= tList->length)
	{
		return NULL;
	}
	ret = (SeqListNode*)tList->node[pos];
	return ret;
}

//初始化线性表顺序存储结构

void SeqList_Clear(SeqList* list)
{
	TSeqList *tList = NULL;
	//判断指针是否为空
	if (list == NULL)
	{
		return;
	}
	tList = (TSeqList*)(list);
	tList->length = 0;
	memset(tList->node, 0, sizeof(unsigned int)*tList->capacity);
	return;
}

//获取线性表顺序存储结构的长度
int SeqList_Length(SeqList* list)
{
	TSeqList *tList = NULL;
	//判断指针是否为空
	if (list == NULL)
	{
		return 0;
	}
	tList = (TSeqList*)(list);
	return tList->length;
}
//获取线性表顺序存储结构的容量
int SeqList_Capacity(SeqList* list)
{
	TSeqList *tList = NULL;
	//判断指针是否为空
	if (list == NULL)
	{
		return 0;
	}
	tList = (TSeqList*)(list);
	return tList->capacity;
}

//销毁线性表顺序存储结构

int SeqList_Destory(SeqList* list)
{
	//判断指针是否为空
	if (list == NULL)
	{
		return 0;
	}
	free(list);
	list = NULL;
	return 0;
}
下面为我写的测试用例:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "SeqList.h"


typedef struct _Teacher
{
	char name[30];
	int age;
}Teacher;
void main()
{
	SeqList * s = NULL;
	Teacher t1, t2, t3;
	t1.age = 11;
	t2.age = 22;
	t3.age = 33;
	s = SeqList_Create(10);//线性表数据创建
	SeqList_Insert(s, (SeqListNode*)&t1, 0);//线性表数据插入
	SeqList_Insert(s, (SeqListNode*)&t2, 0);
	SeqList_Insert(s, (SeqListNode*)&t3, 0);
	int i = 0, len = 0;
	len = SeqList_Length(s);//获取线性表长度
	for ( i = 0; i < len; i++)
	{
		Teacher * tmp = (Teacher*)SeqList_Get(s, i);//获取线性表中指定的数据
		printf("%d  ",tmp->age);
	}
	printf("\n");
	for ( i = 0; i < len; i++)
	{
		Teacher * tmp = (Teacher*)SeqList_Delete(s, 0);//删除线性表中数据
		printf("%d _", tmp->age);
	}
	SeqList_Destory(s);
	system("pause");

}

转载于:https://my.oschina.net/xzggis/blog/365693

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值