数据结构-顺序表

顺序表简介及特点

顺序表是在计算机内存中以数组的形式保存的线性表,采用顺序存储结构。
特点:
顺序并且连续存储
大小固定,满不能存,空不能取
查找方便,增删改麻烦

定义顺序表

	重定义一种数据类型为data_type(以int为例),定义一个顺序表,表中可以存N个数据,count用来记录存入的数据个数。
#define N 10

typedef int data_type;

//定义顺序表类型
typedef struct list
{
	data_type arr[N];
	int count; //数据个数
}List;

子函数

创建顺序表

	通过malloc进行顺序表的空间开辟,并用memset进行清空。
List * CreatList(void)
{
	List *pList = (List *)malloc(sizeof(List));
	if(NULL == pList) //判断是否创建成功
	{
		return NULL;
	}
	memset(pList,0,sizeof(List));//清空
	pList->count = 0;
	return pList;
}

插入、显示、修改、销毁

插入:
参数:List *pList,接收顺序表
int pos,接收插入的位置
data_type item,接收插入的数据
返回值:int,使用enum定义了OK,成功返回OK,也可以直接返回0,表示插入成功.
先进行参数判断,然后进行插入,插入必须满足表不为满,然后从最后一个数据开始,依次往后移动一个位置,最后在pos的
位置插入数据,并将pList->count++(数据个数加1)
注意:数据存是从pList->arr[0]开始存,一般将这个元素称为第一个元素,移动的时候需要注意自己的逻辑。
int InsertList(List *pList,int pos,data_type item)
{
	//参数判断
	if(NULL == pList)
	{
		return LISTNULL;
	}
	if(pos <1 || pos > N)
	{
		return POSERROR;
	}
	if(N == pList->count)
	{
		return LISTFULL;
	}
	//开始插入,先移动后面的结点
	int i = 0;
	for(i = pList->count;i >= pos;i--)
	{
		pList->arr[i]= pList->arr[i-1];
	}
	//插入结点
	pList->arr[pos-1] = item;
	pList->count++;
	return OK;
}
显示:
参数:
List *pList,接收顺序表
按顺序进行输出,注意i的取值
int ShowList(List *pList)
{
	//判断表空或者异常
	if(NULL == pList || pList->count == 0)
	{
		return LISTEMPTY;
	}
	//输出
	int i = 0;
	for(i = 0;i < pList->count;i++)
	{
		printf("%d ",pList->arr[i]);
	}
	puts("");
	return OK;
}
删除
参数:List *pList,接收顺序表
int pos,接收删除的位置
data_type *item,用来存放删除的数据,返回给main函数,通过指针进行操作
返回值:int,使用enum定义了OK,成功返回OK,也可以直接返回0,表示删除成功.
先进行参数判断,然后进行删除,删除必须满足表不为空,然后将要删除的数据保存到*item中,有效数字减1,将后面的数据依次前移。
int DelList(List *pList,int pos,data_type *item)
{
	//参数判断
	if(NULL == pList)
	{
		return LISTNULL;
	}
	if(0 == pList->count)
	{
		return LISTEMPTY;
	}
	//删除
	int i = 0;
	*item = pList->arr[pos-1];
	for(i = pos + 1;i <= pList->count;i++)
	{
		pList->arr[i-2] = pList->arr[i-1];
	}
	pList->count--;
	return OK;

}
销毁:
通过二级指针接收链表的地址进行销毁
int DestoryList(List **ppList) //ppList = &pList,*ppList = pList
{
	if(NULL == ppList)
	{
		return LISTNULL;
	}
	free(*ppList);
	*ppList = NULL;
	return OK;

}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 10

typedef int data_type;

//定义顺序表类型
typedef struct list
{
	data_type arr[N];
	int count; //数据个数
}List;

enum ret 
{
	POSERROR = -5,
	MALLOCERROR = -4,
	LISTNULL,
	LISTFULL,
	LISTEMPTY,
	OK,
};

//---------函数声明--------------
List *CreatList(void);
int InsertList(List *pList,int pos,data_type item);
int DelList(List *pList,int pos,data_type *pData);
int ShowList(List *pList);
int DestoryList(List **ppList);

int main(int argc, const char *argv[])
{
	int op,pos;
	data_type item;
	List *pList = NULL;
	pList = CreatList();
	while(1)
	{
		printf("********1.Insert********\n");
		printf("********2.Show**********\n");
		printf("********3.DelList*******\n");
		printf("********-1.EXIT*********\n");
		printf("\n");
		printf("input your op:");
		scanf("%d",&op);
		if(-1 == op)
			break;
		switch(op)
		{
			case 1:
				{
					printf("input your pos and item: ");
					scanf("%d%d",&pos,&item);
					InsertList(pList,pos,item);
					break;
				}
			case 2:
				{
					ShowList(pList);
					break;
				}
			case 3:
				{
					printf("input your pos:");
					scanf("%d",&pos);
					DelList(pList,pos,&item);
					printf("Del is %d\n",item);
					break;
				}
		}
	}
	printf("%p\n",pList);
	DestoryList(&pList);
	printf("%p\n",pList);
	return 0;
}

//---------函数实现----------------
List * CreatList(void)
{
	List *pList = (List *)malloc(sizeof(List));
	if(NULL == pList) //判断是否创建成功
	{
		return NULL;
	}
	memset(pList,0,sizeof(List));//清空
	pList->count = 0;
	return pList;
}

//插入
int InsertList(List *pList,int pos,data_type item)
{
	//参数判断
	if(NULL == pList)
	{
		return LISTNULL;
	}
	if(pos <1 || pos > N)
	{
		return POSERROR;
	}
	if(N == pList->count)
	{
		return LISTFULL;
	}
	//开始插入,先移动后面的结点
	int i = 0;
	for(i = pList->count;i >= pos;i--)
	{
		pList->arr[i]= pList->arr[i-1];
	}
	//插入结点
	pList->arr[pos-1] = item;
	pList->count++;
	return OK;
}

//删除


//显示
int ShowList(List *pList)
{
	//判断表空或者异常
	if(NULL == pList || pList->count == 0)
	{
		return LISTEMPTY;
	}
	//输出
	int i = 0;
	for(i = 0;i < pList->count;i++)
	{
		printf("%d ",pList->arr[i]);
	}
	puts("");
	return OK;
}

//删除
int DelList(List *pList,int pos,data_type *item)
{
	//参数判断
	if(NULL == pList)
	{
		return LISTNULL;
	}
	if(0 == pList->count)
	{
		return LISTEMPTY;
	}
	//删除
	int i = 0;
	*item = pList->arr[pos-1];
	for(i = pos + 1;i <= pList->count;i++)
	{
		pList->arr[i-2] = pList->arr[i-1];
	}
	pList->count--;
	return OK;

}

//销毁
int DestoryList(List **ppList) //ppList = &pList,*ppList = pList
{
	if(NULL == ppList)
	{
		return LISTNULL;
	}
	free(*ppList);
	*ppList = NULL;
	return OK;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值