线性表的基本操作函数的编写

#include<stdio.h>
#include<stdlib.h>
typedef struct linearlist
{
	int *list;
	int size;//元素个数
	int maxsize;//元素个数最大值
} lili;//定义一个结构体并起别名为lili
void initlist (lili*L,int ms)
{
	if((L->list=(int*)calloc(ms,sizeof(int*)))==NULL)//给list分配内存,要记得free
	{
		printf("内存申请错误!\n");
		exit(1);
	}
	L->size=0;
	L->maxsize=ms;
}
int insertlist(lili*L,int item,int rc)//rc代表下标
{
	int i;
	if(L->size==L->maxsize)//线表已满
		return -1;
	if(rc<0)//位置不合法
		rc=0;
	if(L->maxsize>rc>=L->size)//若位置rc+1(下标为rc)还没有值,则直接将item放入该位置
		rc=L->size;
	for(i=L->size-1;i>=rc;i--)/*size-1变为最后一个元素的下标,从最后
	一个(下标为n-1),移到下标为n,依此类推至将第rc+1个元素(下标为rc)移到下标为rc+1的位置上*/
		L->list[i+1]=L->list[i];
	L->list[rc]=item;//第rc+1个元素
	L->size++;
	return 1;
}
void outputlist(lili*L)
{
	int i;
	for(i=0;i<L->size;i++)
		printf("%d",L->list[i]);
	printf("\n");
}
int findlist(lili *L,int item)
{
	int i;
	for(i=0;i<L->size;i++)
		if(L->list[i]==item)
			return i;
	return -1;
}
int deletelist1(lili*L,int item)
{
	int i,n;
	for(i=0;i<L->size;i++)//循环一遍看看是否有item这个元素,并定位它的下标
		if(item==L->list[i])
			break;
	if(i<L->size)//说明找到了
	{
		for(n=i;n<L->size-1;n++)/*从item的下标(n)到最后一个下标,将下标n+1的值移动
			到下标n中,以此类推至将下标为size-1(最后一个下标)的值移动到它前面一个位置*/
			L->list[n]=L->list[n+1];
		L->size--;//线表大小减一
		return i;
	}
	return -1;
}
int dele2list(lili *L,int rc)
{
	int n;
	if(rc<0||rc>L->size)
		return -1;
	for(n=rc;n<L->size-1;n++)
		L->list[n]=L->list[n+1];
		L->size--;
	return 1;
}

void main()
{
	lili LL;
	int i, r;
	printf( "list addr=%p\tsize=%d\tMaxSize=%d\n", LL.list, LL.size,LL.maxsize);
	initlist( &LL, 100 );
	printf( "list addr=%p\tsize=%d\tMaxSize=%d\n", LL.list, LL.size,LL.maxsize);
	while( 1 )
	{
		printf( "请输入元素值,输入0结束插入操作:" );
		fflush( stdin );
		scanf("%d",&i);
		if(i==0)
			break;
		printf( "请输入插入位置" );
		scanf( "%d", &r );
		insertlist(&LL, i, r-1);
		printf( "线性表为: " );
		outputlist( &LL );           
	}
	while( 1 )
	{
		printf( "请输入查找元素值,输入0结束查找操作:" );
		fflush( stdin );   
		scanf( "%d", &i );
		if( i == 0 )
			break;
		r =    r = findlist( &LL, i );        
		if( r < 0 )
			printf( "没找到\n" );
		else
			printf( "有符合条件的元素,位置为:%d\n", r+1 );
	}
	while( 1 )
	{
		printf( "请输入删除元素值,输入0结束查找操作:" );
		fflush( stdin );   
		scanf( "%d", &i );
		if( i == 0 )
			break;
		r =      r = deletelist1( &LL, i );      
		if( r < 0 )
			printf( "没找到\n" );
		else {                      
			printf( "有符合条件的元素,位置为:%d\n线性表为:", r+1 );
			outputlist( &LL );
		}
	}
	while( 1 )
	{
		printf( "请输入删除元素位置,输入0结束查找操作:" );
		fflush( stdin );  
		scanf( "%d", &r );  
		if( r == 0 )
			break;
		i =    i = dele2list( &LL, r-1 );        
		if( i < 0 )
			printf( "位置越界\n" );
		else {                      
			printf( "线性表为:" );
			outputlist( &LL );
		}
	}
}

这是我根据书上的练习题写的,希望对大家有帮助,不懂的或者我有写错的地方可以在评论区留言,看到会回复,我也只是个小白,努力进步ing!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值