C语言实现一般线性表的顺序存储

C语言实现一般线性表的顺序存储,以下是在VS2013编译通过的,欢迎讨论。有关数据结构的概念可看我的另一篇文章http://blog.csdn.net/linuxlsl/article/details/45649655

一、头文件ArrList.h

#ifndef _ARRLIST_H
#define _ARRLIST_H

typedef struct
{
	int x;
	int y;
}Point;

typedef struct
{
	Point *pt;//节点
	int length;//链表当前长度
	int size;//链表总容量
}ArrList;

Point *CreateArrList(int nLength);       //创建长为 nLength 的线性表
void DestroyArrList(ArrList *list);    //销毁线性表 
void ClearArrList(ArrList *list);      //置空线性表 
int IsEmptyArrList(ArrList *list);     //检测线性表是否为空
int GetArrListLength(ArrList *list);   //获取线性表长度
int GetArrListSize(ArrList *list);     //获取线性表总容量
Point* GetArrListElement(ArrList *list, int pos);   //获取线性表中第pos个元素
int InsertToArrList(ArrList *list, int pos,Point* pt);//插入一个元素 pt 到线性表 nPos 处
Point* DeleteFromArrList(ArrList *list, int pos);//从线性表上删除一个元素


#endif

二、实现文件ArrList.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ArrList.h"


//创建长为 nLength 的线性表
Point* CreateArrList(int nLength)
{
	ArrList *ret = NULL;
	if (nLength < 0)
		return NULL;
	ret = (Point*)malloc(sizeof(ArrList)+sizeof(Point)*nLength);
	if (ret == NULL)
		return NULL;
	ret->pt = (Point*)(ret + 1);//ret向后跳sizeof(ArrList)
	ret->length = 0;
	ret->size = nLength;
	return ret;
}

//销毁线性表 
void DestroyArrList(ArrList *list)
{
	if (list == NULL)
		return;
	free(list);
	return;
}

//置空线性表
void ClearArrList(ArrList *list)
{
	if (list == NULL)
		return;
	list->length = 0;
}

//检测线性表是否为空
int IsEmptyArrList(ArrList *list)
{
	return list->length == 0 ? 1 : 0;
}

//获取线性表长度
int GetArrListLength(ArrList *list)
{
	if (list == NULL)
		return -1;
	return list->length;
}

//获取线性表总容量
int GetArrListSize(ArrList *list)
{
	if (list == NULL)
		return -1;
	return list->size;
}


//获取线性表中第pos个元素
Point* GetArrListElement(ArrList *list, int pos)
{
	Point* ret = NULL;
	if (list == NULL || pos<0 || pos >= list->length)
	{
		return NULL;
	}
	ret = &list->pt[pos];
//	pt = &list->pt[pos];
//	pt->x = list->pt[pos].x;
//	pt->y = list->pt[pos].y;
	return ret;
}

//插入一个元素 pt 到线性表 nPos 处
int InsertToArrList(ArrList *list, int pos, Point *pt)
{
	int i = 0;
	if (list == NULL || pt == NULL)
	{
		return -1;
	}

	//查看是不是满了
	if (list->length >= list->size)
	{
		return -2;
	}

	//位置错误判断
	if (pos<0 || pos >= list->size)
	{
		return -3;
	}

	//优化
	if (pos >= list->length)
	{
		pos = list->length;
	}
	//插入算法
	//从pos位置处开始,把数组后面的元素依此后移
	for (i = list->length; i>pos; i--)
	{
		//把前的元素往后移
		list->pt[i] = list->pt[i - 1];
	}
	//循环跳出以后,pos正好是,要出入的位置
	list->pt[pos] = *pt;
	list->length++;
	return 0;
}


//从线性表上删除一个元素
Point* DeleteFromArrList(ArrList *list, int pos)
{
	int i = 0;
	Point* ret = NULL;
	if (list == NULL || pos<0 || pos >= list->length)
	{
		return -1;
	}
	ret = &(list->pt[pos]);

	//删除算法
	for (i = pos; i<list->length; i++)
	{
		list->pt[i] = list->pt[i+1];
	}
	list->length--;
	return ret;
}

三、测试文件ArrListTest.c

#include<stdio.h>
#include "stdlib.h"
#include "string.h"
#include "ArrList.h"

int main()
{
	int i = 0;
	ArrList *list = NULL;
	Point P1, P2, P3;
	P1.x = 0;
	P1.y = 0;
	P2.x = 2;
	P2.y = 4;
	P3.x = 3;
	P3.y = 3;

	list = CreateArrList(10);
	printf("len:%d\n", GetArrListLength(list));
	printf("size:%d\n", GetArrListSize(list));
	InsertToArrList(list, 0, &P1);
	InsertToArrList(list, 0, &P2);
	InsertToArrList(list, 0, &P3);
	printf("len:%d\n", GetArrListLength(list));

	//循环遍历	
	for (i = 0; i < GetArrListLength(list); i++)
	{		
		Point* ret = GetArrListElement(list, i);		
		if (ret != NULL)
		{
			printf("P(%d,%d)\n",ret->x ,ret->y);
		}
	}

	for (i = 0; i < GetArrListLength(list); i++)
	{
		DeleteFromArrList(list, 0);
		printf("len:%d\n", GetArrListLength(list));
	}
	DestroyArrList(list);

	system("pause");
	return 0;
}

四、运行结果:




 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值