C语言实现顺序表的基本操作

#include<stdio.h>
#include<stdlib.h>
 
#define INITSIZE 100
#define INIT_LENGTH 6

typedef int ElemType;
typedef struct
{ ElemType *data;        /* 存储空间基地址 */
  int length;            /* 顺序表长度(即已存入的元素个数) */
  int listsize;      /* 当前存储空间容量(即能存入的元素个数) */
}sqlist;

	
/*-------------------------------------------------------------------*/
/* (1)初始化操作(创建一个空的顺序表L) */
void initlist(sqlist *L)
{   
	L->data=(ElemType *)malloc(sizeof(ElemType) *INITSIZE );
	
	L->length=0;

	L->listsize=INITSIZE;
	
}

/*-------------------------------------------------------------------*/
/* (2)求表长操作(统计顺序表L中存储的数据元素个数) */
int getlen(sqlist *L)
{
	return (L->length);  
}
/*-------------------------------------------------------------------*/
/* (3)取元素操作(取出顺序表L的第i个数据元素的值) */
int getelem(sqlist*L,int i,ElemType *e)
{
	if(i<1||i>L->length) return 0;
	*e = L->data[i-1];
	return 1;
}
/*-------------------------------------------------------------------*/
/* (4)元素定位操作(在顺序表L中,查找第1个与x值相等的数据元素的位置) */
int locate(sqlist *L,ElemType x)
{ 
	int i = 0;
	while(i<L->length)
	{
		if(L->data[i]==x)
		{
			return i+1;
		}else
		{
			i++;
		}
	}
	return 0;
}
/*-------------------------------------------------------------------*/
/* (5)插入操作(在顺序表L中的第i个位序上插入一个值为x的数据元素) */
int insert(sqlist *L,int i,ElemType x)
{ 
  int j;
  if(i<1||i>L->length+1) return 0;  /* 参数i不合理,返回0 */
  
  if(L->length==L->listsize)        /* 存储空间不够,增加一个存储空间 */
  {  L->data=(ElemType *)realloc(L->data,(L->listsize+1)*sizeof(ElemType));
     L->listsize++;                 /* 重置存储空间长度 */
  }
  for(j=L->length-1;j>=i-1;j--)
    L->data[j+1] = L->data[j];      /* 将序号为i及之后的数据元素后移一位 */
    L->data[i-1]=x;                   /* 在序号i处放入x */
    L->length++;                      /* 顺序表长度增1 */
  return 1;                         /* 插入成功,返回1 */
}


/*-------------------------------------------------------------------*/
/* (6)删除操作(将顺序表L的第i个元素删除) */
int delete(sqlist *L,int i,ElemType *e)
{ int j;
  if(i<1||i>L->length) return 0;  /* 参数i不合理,返回0 */
  *e=L->data[i-1];                /* 存储被删除的元素 */
  for(j=i;j<L->length;j++)
    L->data[j-1] = L->data[j];      /* 将序号为i及之后的数据元素前移一位 */
    L->length--;                    /* 顺序表长度减1 */
  return 1;                       /* 删除成功,返回1 */
}
/*-------------------------------------------------------------------*/
/* (7)修改操作(修改顺序表L的各数据元素值) */
int alter(sqlist *L,int i,ElemType e)
{
  
  if(i<1||i>L->length) return 0;
  
  L->data[i-1] = e;
  return 1;

}

/*-------------------------------------------------------------------*/
/* (8)输出操作(输出顺序表L的各数据元素值) */
void list(sqlist *L)
{ 
	int i ;
	int x = 0;
	printf("您更新后顺序表中的数据为:\n");
	for(i=1;i<L->length+1;i++)
	{
		if(getelem(L,i,&x)==1)
		{
			printf("%d\t",x);
		}
		
	}
	printf("\n");
}

void test01()
{
	int e = 0;
	int i = 0;
	int x = 0;
	int count = 0;
	int count1 = 0;
	sqlist L;
	initlist(&L);                                                       
  
  
 /*------------------------插入------------------*/
   printf("请添加%d个数值到你的顺序表中\n",INIT_LENGTH);
   for(i=1;i<INIT_LENGTH+1;i++)
   {
		scanf("%d",&x);
		if(insert(&L,i,x)==0)
		{
			printf("插入失败!\n");
			return;
		}
     
   }
   
	list(&L);
/*------------------------删除------------------*/
	printf("请输入你需要删除的位置:\n");
	scanf("%d",&i);
	if(delete(&L,i,&x)==1)
	{
		printf("删除成功!\n");
	}else{printf("删除失败!\n");}
	
	list(&L);

	printf("请输入你需要插入的位置:\n");
	scanf("%d",&i);
	printf("请输入你需要插入的位置的元素:\n");
	scanf("%d",&x);
	if(insert(&L,i,x)==1)
	{
		printf("插入成功!\n");
	}else{printf("插入失败!\n");}

	list(&L);
/*------------------------修改------------------*/
	printf("请输入你需要修改的位置:\n");
	scanf("%d",&i);
	printf("请输入你需要修改的位置的元素:\n");
	scanf("%d",&x);
	if(alter(&L,i,x)==1)
	{
		printf("修改成功!\n");
	}else{printf("修改失败!\n");}
	 
	list(&L);

	printf("请输入你需要查找的位置:\n");
	scanf("%d",&i);
/*------------------------查找------------------*/
	if(getelem(&L,i,&x)==1)
	{
		printf("查找成功!\n");
	    printf("x=%d\n",x);
	}else{printf("查找失败!\n");}


}

int main()
{
	test01();
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值