数据结构:顺序表的基本操作

顺序表,全名顺序存储结构,是线性表的一种。

顺序表的初始化

Status InitList_Sq(SqList *L)
{
	L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L->elem)
		exit(OVERFLOW);///存储分配失败
	L->length=0;
	L->listsize=LIST_INIT_SIZE;///初始存储容量
	return OK;
}

顺序表的插入操作

在这里插入图片描述

Status InsertList(SqList *L,int i,ElemType e)
{
	ElemType *newbase;
	ElemType *q;
	ElemType *p;
	if(L->length>=LIST_INIT_SIZE) ///当前存储空间已满,增加分配 
	{
		newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase) exit(OVERFLOW);///存储分配失败
		L->elem=newbase;///新基址
		L->listsize+=LISTINCREMENT;///增加存储容量
	}
	if(i>L->length+1||i<1)  return ERROR;
	
	q=&(L->elem[i-1]);///q为插入的位置
	for(p=&(L->elem[L->length-1]);p>=q;--p)///从最后一个元素依次往后挪
		*(p+1)=*p;
	*q=e;///放值
	++L->length;///表长增加1
		return OK;
}

顺序表的删除操作

在这里插入图片描述

Status DeleteList(SqList *L,int i,ElemType *e)
{
	ElemType *p,*q;
	if((i>L->length+1)||(i<1))	return ERROR;///i值不合法
	if(L->length==0)  return ERROR;
	p=&(L->elem[i-1]);///p为被删除元素的位置
	*e=*p;///被删除元素的值赋给e
	q=&(L->elem[L->length-1]);///表尾元素的位置
	for(++p;p<=q;++p)被删除元素之后的元素左移
		*(p-1)=*p;
		--L->length;///表长减1
	return OK;
}

顺序表的查找

int equal(ElemType e1,ElemType e2)
{
	return e1==e2?TRUE:FALSE;
}

int large(ElemType e1,ElemType e2)
{
	return e1>e2?TRUE:FALSE;	
}
int small(ElemType e1,ElemType e2)
{
	return e1<e2?TRUE:FALSE;
}
int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType e1,ElemType e2))///在线性表L中查找第1个与e满足compare()的元素的位序
{
	int i;
	ElemType *p;
	p=L.elem;///p的初值为第1个元素的存储位置
	i=1;///第1个元素的位序

	while(i<=L.length&&!(*compare)(*p++,e))  ++i;

	if(i<=L.length) return i;
	else
		return 0;
}

顺序表的销毁

Status DestroyList(SqList *L)
{
	if(!L->elem) return ERROR;
	free(L->elem);
	L->length=0;
	L->listsize=0;
	return OK;
}

顺序表的基本操作代码

#include "stdio.h"
#include "stdlib.h"

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef int ElemType;
typedef int Status;
typedef struct SqList
{
	ElemType *elem;
	int length;
	int listsize; 
}SqList;

Status InitList_Sq(SqList *L)
{
	
	L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L->elem)
		exit(OVERFLOW);///存储分配失败
	L->length=0;
	L->listsize=LIST_INIT_SIZE;///初始存储容量
	return OK;
}

void InputList(SqList *L,int n)
{
	int i;
	for(i=0;i<n;i++)
		scanf("%d",&L->elem[i]);
	L->length=n;
}


void OutputList(SqList L)
{
	int i;
	for(i=0;i<L.length;i++)
		printf("%d ",L.elem[i]);
		printf("\n");
}

int ListLength(SqList L)
{
	return L.length;
}

Status GetElem(SqList L,int i,ElemType *e)
{
	if(i>L.length||i<1)	return ERROR;
	else
		*e=L.elem[i-1];
	return OK;
}

Status PriorElem(SqList L,int cur_e,ElemType *pre_e)
{
	int i=1,st;
	if(cur_e>L.length||cur_e<2)   return FALSE;///cur_e是L的数据元素,且不是第一个
	while(cur_e>=2&&cur_e<=L.length)
	{
		if(cur_e==L.elem[i-1])
		{	
			st=i-1;
			break;
		}
		++i;
	}
	*pre_e=L.elem[st-1];
	return OK;
}

Status NextElem(SqList L,int cur_e,ElemType *next_e)
{
	int i=1,st;
	if(cur_e>=L.length)  return FALSE;///cur_e是L的数据元素,且不是最后一个
	while(cur_e<L.length)
	{
		if(cur_e==L.elem[i-1])
		{
			st=i-1;
			break;
		}
		++i;
	}
	*next_e=L.elem[st+1];
	return OK;
}

int equal(ElemType e1,ElemType e2)
{
	return e1==e2?TRUE:FALSE;
}

int large(ElemType e1,ElemType e2)
{
	return e1>e2?TRUE:FALSE;	
}

int small(ElemType e1,ElemType e2)
{
	return e1<e2?TRUE:FALSE;
}

int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType e1,ElemType e2))///在线性表L中查找第1个与e满足compare()的元素的位序
{
	int i;
	ElemType *p;
	p=L.elem;///p的初值为第1个元素的存储位置
	i=1;///第1个元素的位序

	while(i<=L.length&&!(*compare)(*p++,e))  ++i;

	if(i<=L.length) return i;
	else
		return 0;
}

Status DeleteList(SqList *L,int i,ElemType *e)
{
	ElemType *p,*q;

	if((i>L->length+1)||(i<1))	return ERROR;///i值不合法
	if(L->length==0)  return ERROR;

	p=&(L->elem[i-1]);///p为被删除元素的位置
	*e=*p;///被删除元素的值赋给e
	q=&(L->elem[L->length-1]);///表尾元素的位置
	for(++p;p<=q;++p)被删除元素之后的元素左移
		*(p-1)=*p;
		--L->length;///表长减1
	return OK;
}

Status InsertList(SqList *L,int i,ElemType e)
{
	ElemType *newbase;
	ElemType *q;
	ElemType *p;
	if(L->length>=LIST_INIT_SIZE) ///当前存储空间已满,增加分配 
	{
		newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase) exit(OVERFLOW);///存储分配失败
		L->elem=newbase;///新基址
		L->listsize+=LISTINCREMENT;///增加存储容量
	}
	if(i>L->length+1||i<1)  return ERROR;
	
	q=&(L->elem[i-1]);///q为插入的位置
	for(p=&(L->elem[L->length-1]);p>=q;--p)///从最后一个元素依次往后挪
		*(p+1)=*p;
	*q=e;///放值
	++L->length;///表长增加1
		return OK;
}

Status EmptyList(SqList L)
{
  return L.length==0?OK:ERROR;
}

void ClearList(SqList *L)
{
	L->length=0;
	printf("清空线性表成功!\n");
}

Status DestroyList(SqList *L)
{
	if(!L->elem) return ERROR;
	free(L->elem);
	L->length=0;
	L->listsize=0;
	return OK;
}

void main()
{	
	SqList L;
    ElemType e;
	int choice=1,i;
	if(InitList_Sq(&L)==OK)
		printf("ok\n");
	else
		printf("error!\n");
	while(choice!=0)
	{
		system("cls");
		printf("1.InitList_Sq   2.InputList   3.OutputList \n");
		printf("4.GetElem       5.PriorElem   6.NextElem\n");
		printf("7.LocateElem    8.DeleteList  9.InsertList\n");
		printf("10.EmptyList    11.ClearList   12.DestroyList   0.exit\n");
		printf("please input your choice:\n");
		scanf("%d",&choice);
		switch(choice)
		{
		case 1: 
			{
			if(InitList_Sq(&L)==OK)///传地址,可以改变L的值。
				printf("创建一个表成功!\n");
			break;
			}
		case 2:
			{
			int num;
			printf("请问你要输入几个数:\n");
			scanf("%d",&num);
			InputList(&L,num);
			break;
			}
		case 3:
			{
			printf("您输入的数为:\n");
			OutputList(L);///传值,不会对原链表有改变
			printf("顺序表的长度为:%d\n",ListLength(L));
			break;
			}
		case 4:
			{
			int i;
			printf("请输入你要获取第几个位置对应的值:\n");
			scanf("%d",&i);
			if((GetElem(L,i,&e))==OK)
				printf("第%个位置对应的值为:%d\n",i,e);
			else if((GetElem(L,i,&e))==ERROR)
				printf("没有找到第%d个元素的值\n",i);
			break;
			}
		case 5:
			{
			int cur_e;
			ElemType pre_e;
			printf("请输入线性表中的一个元素:\n");
			scanf("%d",&cur_e);
			if(PriorElem(L,cur_e,&pre_e)==FALSE)
				printf("没有找到%d的前驱元素!\n",cur_e);
			if(PriorElem(L,cur_e,&pre_e)==OK)
				printf("%d的前驱元素为%d\n",cur_e,pre_e);
			break;
			}
		case 6:
			{
			int cur_e;
			ElemType next_e;
			printf("请输入线性表中的一个元素:\n");
			scanf("%d",&cur_e);
			if(NextElem(L,cur_e,&next_e)==FALSE)
				printf("没有找到%d的后继元素!\n",cur_e);
			if(NextElem(L,cur_e,&next_e)==OK)
				printf("%d的前驱元素为%d\n",cur_e,next_e);
			break;
			}
		case 7:
			{
			int index;
			ElemType e;
			printf("请输入一个元素:\n");
			scanf("%d",&e);
			index=LocateElem(L,e,large);
			if(index!=0)  
				printf("元素的位置为:%d\n",index);
			else
				if(index==0) 
					printf("没有找到!\n");
			break;
			}
		case 8:
			{
			int num;
			printf("请输入要删除第几个数:\n");
			scanf("%d",&num);
			if(DeleteList(&L,num,&e)==OK)
			{
				for(i=0;i<L.length;i++)
				printf("%d ",L.elem[i]);
				printf("\n");
			}
			break;
			}
		case 9:
			{
			int location,num;
			printf("请输入数的位置:\n");
			scanf("%d",&location);
			printf("请输入要插入的数:\n");
			scanf("%d",&num);
			if(InsertList(&L,location,num)==OK)
			{
				for(i=0;i<L.length;i++)
				printf("%d ",L.elem[i]);
				printf("\n");
			}
			break;
			}
		case 10:
			{
			if(EmptyList(L)==OK)
				printf("it is an empty list!\n");
			else
				printf("it is not an empty list!\n");
			break;
			}
		case 11:
			{
			ClearList(&L);
			break;
			}
		case 12:
			{
			if(DestroyList(&L)==OK)
				printf("DestoyList succeed\n");
			else
				if(DestroyList(&L)==ERROR)
					printf("DestroyList fail.\n");
			break;
			}
		}
		system("pause");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值