线性表之顺序表代码

#ifndef _SEQLIST_H
#define _SEQLIST_H
#include"ututli.h"

#define ElemType int
#define DEFAULT_SIZE 8		//初始化时数组的长度
#define LIST_INCREMENT 2	//每次增加的长度


typedef struct SeqList
{
	ElemType *base;
	size_t	 len;
	size_t	 capacity;
}SeqList;

void InitSeqList(SeqList *list);				//初始化函数
int isfull(SeqList *list);						//判断是否为空
void move(SeqList *list,int m,int n);					//将制定位置移动函数
void push_back(SeqList *list,ElemType x );		//后插函数
void push_front(SeqList *list,ElemType x);		//头插函数
void pop_back(SeqList *list);					//尾删函数
void pop_front(SeqList *list);					//头删函数
void insert_pos(SeqList *list,int i,ElemType e);//按位置插入
void insert_val(SeqList *list,ElemType e);		//按值插入
void delete_pos(SeqList *list,int i);			//按位置删除
void delete_val(SeqList *list,ElemType e);		//按值删除
int  find_val(SeqList *list,ElemType e);		//按值查找
int  length(SeqList *list);						//求顺序表的长度
int  isempty(SeqList *list);					//判断是否为空,0为假,1为真.
void clear(SeqList *list);						//清空顺序表
void resver(SeqList *list);						//转置顺序表
void show_list(SeqList *list);					//显示函数
void sort(SeqList *list);						//排序函数
void DestroySeqlist(SeqList *list);				//摧毁函数
bool ListInsert(SeqList *list,int i,ElemType e);//动态插入函数
//
void InitSeqList(SeqList *list)
{
	list->base = ( ElemType*)malloc(sizeof(SeqList) * DEFAULT_SIZE);

	assert(list != NULL);
	list->len = 0;
	list->capacity = DEFAULT_SIZE;
}

void sort(SeqList *list)	//使用冒泡排序法
{
	if(list->len == 0 || list->len == 1)
		return;
	else
	{
		int i,j,t;
		for(i = 0; i <list->len-1; ++i )
			for(j = 0; j < list->len-1-i; ++j)
				if(list->base[j] > list->base[j+1])
				{
					t = list->base[j];
					list->base[j] = list->base[j+1];
					list->base[j+1] = t;
				}
	}
}

//判断是否满,如果为满的话,返回0,不满的话返回1.
int  isfull(SeqList *list)
{
	if(list->len == list->capacity)
		return 0;
	else
		return 1;
}

void move(SeqList *list,int m,int n)//m代表位置,n代表前移或者后移.
{									//为0代表前移,为1代表后移.
	int k;
	if(n == 1)
	{
		for(k = list->len-1; k >= m-1; --k)//将指定的位置向后移动
			list->base[k+1] = list->base[k];
	}
	else
	{
		for(k = m; k < list->len; ++k)
			list->base[k-1] = list->base[k];
	}
}

bool ListInsert(SeqList *list,int i,ElemType e)
{
	ElemType *newbase,*q,*p;
	if(i < 1 || i > list->len+1)	//插入的位置不合法
		return	false;
	if(list->len >= list->capacity)
	{
		if(!(newbase = (ElemType*)realloc(list->base,(list->capacity + LIST_INCREMENT) * sizeof(ElemType))))	
			exit(0);		//存储分配失败
		list->base = newbase;	//新地址
		list->capacity += LIST_INCREMENT;	//增加存储容量
	}
	q = list->base+i-1;			//q为插入位置
	move(list,i,1);				//插入位置的元素向后移动
	*q = e;			//插入
	++list->len;	//表长增加1
	return true;
}

void push_back(SeqList *list,ElemType x )
{
	if(isfull(list) == 0)
	{
		printf("顺序表已满,错误\n");
		return ;
	}
	else
		list->base[list->len++] = x;
}

void push_front(SeqList *list,ElemType x)
{
	if(isfull(list) == 0)
	{
		printf("顺序表已满,错误\n");
		return;
	}
	else
	{
		move(list,1,1);
		list->base[0] = x;
	}
	list->len++;
}

void pop_back(SeqList *list)
{
	if(list->len == 0)
		return;
	list->len--;
}

void pop_front(SeqList *list)
{
	if(list->len == 0)
		return;
	else if(list->len == 1)
		list->len--;
	else if(list->len <= list->capacity)
	{
		move(list,1,0);
		list->len--;
	}
}

void insert_pos(SeqList *list,int i,ElemType e)
{
	if(list->len == list->capacity)
		return;
	else if(i < 1 || i > list->len+1)
		return;
	else if(i <= list->len)
		move(list,i,1);
	list->base[i-1] = e;
	list->len++;
}

void insert_val(SeqList *list,ElemType e)
{
	if(isfull(list) == 0)
		return;
	else
		push_back(list,e);
}

void delete_pos(SeqList *list,int i)
{
	if(isfull(list) == 0)
		return;
	if(i < 1 || i > list->len)
		return;
	if(i < list->len)	//如果删除不是最后位置
		move(list,i,0);
	list->len--;
}

void delete_val(SeqList *list,ElemType e)
{
	int i;
	for(i = 0; i < list->len; ++i)
	{
		if(list->base[i] == e)
			break;
	}
	i++;
	if(i <= list->len)
		delete_pos(list,i);
	else
		printf("未找到要删除的值!");
}

int find_val(SeqList *list,ElemType e)	//返回0代表失败
{
	int i;
	if(list->len == 0)
		return 0;
	else
	{
		for(i = 0; i < list->len; ++i)
			if(list->base[i] == e)
				break;
	}
	i++;
	if(i <= list->len)
		return i;
	else
		return 0;
}

int length(SeqList *list)
{
	return list->len;
}

int isempty(SeqList *list)
{
	if(list->len == 0)
		return 1;
	else
		return 0;
}

void clear(SeqList *list)
{	//将List置为空表
	if(isempty(list) == 1)
		return ;
	else
		list->len = 0;
}

void resver(SeqList *list)
{
	int i,t;
	if(list->len == 0 || list->len == 1)
		return;
	else
		for(i = 0; i < list->len/2; ++i)
		{
			t = list->base[i];
			list->base[i] = list->base[list->len-1-i];
			list->base[list->len-1-i] = t;
		}
}

void show_list(SeqList *list)
{
	int i = 0;
	while(list->len > i )
	{
		printf("%d->",list->base[i]);
		i++;
	}
	printf("Over\n");
}
void DestroySeqlist(SeqList *list)
{	//初识条件:顺序线性表已经存在。操作结果,销毁顺序线性表.
	free(list->base);
	list->base = NULL;
	list->len = 0;
	list->capacity = 0;
}

#endif

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值