数据结构学习(1)

本文深入解析了顺序表的定义、特点及其基本操作实现,包括初始化、插入、遍历、获取元素、判断空表、查看长度、查找元素、删除元素、清空及销毁线性表。通过具体代码示例,展示了如何在C语言中实现这些功能。

(一)顺序表
定义: 将线性表中的元素相继存放在一个连续的存储空间中(可利用一维数组描述存储结构)。
特点: 线性表的顺序存储方式,直接前驱,直接后驱。
遍历: 顺序访问, 可以随机存取。
代码
SequenceList.h

#ifndef   SEQUENCE_LIST
#define  SEQUENCE_LIST
#define  SIZE              10
#define  SUCCESS     1000
#define  FAILURE        1001
typedef   int  ElemType; 
struct  sequence
{
	ElemType *data;
	int length;
};
struct sequence Seq;
int InitList(Seq *l);//初始化
int InsertList(Seq *l, int p, Elemtype e);//插入数据
int TraverseList(Seq l, void(*p)(ElemType e));//显示数据
int GetElem(Seq l, int p, ElemType e);//获取元素
int ListEmpty(Seq l00);//判断线性表为空
int ListLength(Seq l);//查看元素个数
int LocateElem(Seq l, ElemType e, int (*p)(int ,int ));//查找元素
int ListDelete(Seq *l, int p, ElemType *e);//删除元素
int ClearList(Seq *l);//清空线性表
int DestoryList();//销毁线性表
#endif

SequenceList.c

int InintList(Seq *l)
{
	if(NULL == l)
	{
		return FAILURE;
	}
	l->data = (ElemType *)malloc(sizeof(ElemType) * SIZE);
	if(NULL == l->data)
	{
		return FAILURE;
	}
	l->length = 0;
	return SUCCESS;
}

int InsertList(Seq *l, int p, ElemType e)
{
	if(NULL == l)
	{
		return FAILURE;
	}
	if(p <= 0 || p > l-> length + 1 || l->length >= SIZE)
	{
		return FAILURE;
	}
	int i;
	for(i = 0; i < l->length - p + 1; i++)
	{
		l->data[l->length - i] = l->data[l->length - i - 1];
	}
	l->data[p - 1] = e;
	l->length++;
	return SUCCESS;
}

int TraverseList(Seq l, void (*p)(ElemType))
{
	int i;
	for(i = 0; i < l.length; i++)
	{
		p(l.data[i]);
	}
	return SUCCESS;
}

int GetElem(Seq l, int p, ElemkType *e)
{
	if(p > l.length)
	{
		return FAILURE;
	}
	*e = l.data[p - 1];
	return SUCCESS;
}

int ListEmpty(Seq l)
{
	return (l.length == 0) ? SUCCESS : FAILURE;
}

int ListLength(Seq l)
{
	return l.length;
}

int LocateElem(Seq l, ElemType e, int (*p)(int ,int))
{
	int i;
	for(i = 0; i < l.length; i++)
	{
		if(p(l.data[i], e))
		{
			return i + 1;
		}
	}
	return FAILURE;
}

int ListDElete(Seq *l, int p, ElemType *e)
{
	if(NULL == l || p <= 0 || p > l->length)
	{
		 return FAILURE;
	}
	int i;
	*e = l->data[p -1];
	for(i = 0; i < l->length - p; i++)
	{
		l->data[p - 1 + i] = l->data[p + i];
	}
	l->length--;
	return SUCCESS;
}

int ClearList(Seq *l)
{
	if(NULL == l)
	{
		return FAILURE;
	}
	l->length = 0;
	return SUCCESS;
}
int DestoryList(Seq *l)
{
	if(NULL == l)
	{
		return FAILURE;
	}
	free(l->data);
	l->data = NULL;
	return SUCCESS;
}

main.c

void show(ElemType e)
{
	printf("%s\n",e);
}

int equal(int x, int y)
{
	return (x == y) ? 1:0;
}

int main()
{
	Seq s;
	int ret, i;

	ret = InitList(&s);
	if(FAILURE == ret)
	{
		printf("init failure!\n");
		exit(1);
	}
	else if(SUCCESS == ret)
	{
		printf("init success!\n");
	}
	
	for(i = 0; i < 5; i++)
	{
		ret = InsertList(&s, i + 1, i + 1);
		if(FAILURE == ret)
		{
			printf("sert %d failure!\n", i + 1);
		}
		else if(SUCCESS == ret)
		{
			printf("sert %d success!\n", i + 1);
		}
	}

	ret = TraverseList(s,show);
	if(SUCCESS == ret)
	{
		printf("\n traverse success!\n");
	}
	else if(FAILURE == ret)
	{
		printf("\n traverse failure!\n");
	}

	int p = 3;
	ElemType e;
	ret = GetElem(s, p, &e);
	if(FAILURE == ret)
	{
		printf(“get elemtype failure!\n”);
	}
	else if(SUCCESS == ret)
	{
		printf("%d-th element is %d\n", p, e);
	}

	ret = ListEmpty(s);
	if(SUCCESS == ret)
	{
		printf("线性表是空\n");
	}
	else if(FAILURE == ret)
	{
		printf("线性表不是空!\n");
	}

	ret = ListLength(s);
	printf("length is %d\n", ret);

	e = 100;
	ret = LocateElem(s, e, equal);
	if(FAILURE == ret)
	{
		printf("element %d is not exit!\n", e);
	}
	else 
	{
		printf("element %d id %d-th!\n", e, ret);
	}
	
	for(i = 0; i < 3; i++)
	{
		ret = ListDelete(&s, i + 1, &e);
		if(SUCCESS == ret)
		{
			printf("delete %d success!\n", e);
		}
		else if(FAILURE == ret)
		{
			pri"delete %d failure!\n", e);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值