C语言—顺序表


#include <stdio.h>
#include <stdlib.h>  //进程头文件
#define LIST_INIT_SIZE 100  //预设空间容量
#define LISTINCREAMENT 10 //扩展空间增量
typedef int ElemType;  //数据元素类型
typedef struct
{
	ElemType *elem;  //基地址
	int length;  //当前长度
	int listsize;  //当前空间容量(单位为个)
} SqList;  //顺序表类型
void InitList(SqList &L)  //构造空的顺序表
{
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if(!L.elem)  //保证算法的健壮性
	{
		printf("\n空间开辟失败,程序退出!");
		exit(!0);  //结束进程
	}
	L.length = 0;  //置空
	L.listsize = LIST_INIT_SIZE;  //当前空间容量
}
void CreateList(SqList &L)  //创建顺序表
{
	int num,i;
	printf("\n请输入顺序表的长度:");
	scanf("%d",&num);
	if(num < 1)
	{
		printf("\n输入长度不合法,程序结束!");
		exit(!0);
	}
	if(num > L.listsize)
	{
		ElemType *newbase;  //扩展空间以后的临时新的地址
		printf("\n当前顺序表的长度超过预设顺序表的长度,需要扩展空间!");
		newbase = (ElemType *)realloc(L.elem,(LIST_INIT_SIZE + LISTINCREAMENT) * sizeof(ElemType));
		if(!newbase)
		{
			printf("\n扩展空间失败,程序退出!");
			exit(!0);
		}
		L.listsize = LIST_INIT_SIZE + LISTINCREAMENT;  //重置新的顺序表容量
		L.elem = newbase;
	}
	for(i = 1;i <= num;i++)
	{
		printf("\n请输入第%d个元素:",i);
		scanf("%d",&L.elem[i - 1]);
	}
	L.length = num;  //重置当前顺序表长度
}
void Traverse(SqList L)  //遍历顺序表
{
	int i;
	if(!L.elem || !L.length)
	{
		printf("\n顺序表不存在或者顺序表为空,操作失败,程序退出!");
		exit(!0);
	}
	printf("\n顺序表中的值:");
	for(i = 1;i <= L.length ;i++)
		printf("%4d",L.elem[i - 1]);
	printf("\n");
}
ElemType GetElem(SqList L,int position)  //读取顺序表中指定位置position的元素的值
{
	if(!L.elem || !L.length || position < 1 ||position > L.length )
	{
		printf("\n顺序表不存在或者为空或者指定位置不合法,程序退出!");
		exit(!0);
	}
	return L.elem[position - 1];
}
ElemType PriorElem(SqList L,int position)  //返回指定位置元素的直接前驱元素
{
	if(!L.elem || !L.length ||position == 1||position > L.length)
	{
		printf("\n顺序表不存在或者为空或者指定位置不合理,程序退出!");
		exit(!0);
	}
	return L.elem[position - 2];
}
ElemType NextElem(SqList L,int position)  //返回指定位置元素的直接后驱
{
	if(!L.elem ||!L.length ||position == L.length ||position<1 ||position > L.length)
	{
		printf("\n顺序表不存在或者为空或者指定位置不合法,程序退出!");
		exit(!0);
	}
	return L.elem[position];
}
void ListInsert(SqList &L,int position,ElemType e)  //在顺序表指定位置插入元素
{
	ElemType *p,*q,*newbase;
	if(!L.elem || position < 1 || position > L.length + 1)
	{
		printf("\n顺序表不存在或者指定位置不合理,程序退出!");
		exit(!0);
	}
	if(L.length >= L.listsize)  //顺序表空间已用完,需要扩展空间
	{
		newbase = (ElemType *)realloc(L.elem,(LIST_INIT_SIZE + LISTINCREAMENT) * sizeof(ElemType));
		if(!newbase)
		{
			printf("\n扩展空间失败,程序退出!");
			exit(!0);
		}
		L.listsize = LIST_INIT_SIZE + LISTINCREAMENT;  //重置新的顺序表容量
		L.elem = newbase;
	}
	p = L.elem + position - 1;
	q = L.elem + L.length - 1;
	while(p <= q)  //元素移动
	{
		*(q + 1) = *q;
		q--;
	}
	*p = e;  //插入元素
	++L.length;  //顺序表长度加1
}
ElemType ListDelete(SqList &L,int position)  //删除指定位置的元素
{
	ElemType e,*p,*q;
	if(!L.elem || !L.length || position < 1 || position > L.length)
	{
		printf("\n顺序表不存在或者为空或者指定位置不合理,程序退出!");
		exit(!0);
	}
	e = L.elem[position - 1] ;
	p = &L.elem[position - 1];
	q = L.elem + L.length -1;
	while(p <= q)  //元素移动
	{
		*p = *(p + 1);
		p++;
	}
	--L.length;
	return e;
}
int main()
{
	int pos;
	ElemType e;
	SqList L;
	InitList(L); //初始化顺序表
	CreateList(L);  //创建顺序表
	Traverse(L);  //遍历顺序表
	printf("\n请输入要读取元素的位序:");
	scanf("%d",&pos);
	printf("\n读取顺序表第%d个位置的元素,值为:%d。\n",pos,GetElem(L,pos));
	printf("\n请输入要插入的元素的位序:");
	scanf("%d",&pos);
	printf("\n请输入要插入的元素:");
	scanf("%d",&e);
	ListInsert(L,pos,e); //插入元素
	printf("\n在顺序表第%d个元素之前,插入元素为:%d\n",pos,e);
	Traverse(L);
	printf("\n请输入要删除的元素位序:");
	scanf("%d",&pos);
	e = ListDelete(L,pos);
	printf("\n删除顺序表第%d个元素,值为%d。\n",pos,e);
	Traverse(L);
	printf("\n\n");
}

猜你喜欢

转载自blog.csdn.net/Long_UP/article/details/121766908