C语言几日瞎练☞顺序表

今天第一日瞎练,给大家带来一个顺序表的讲解。内容有所借鉴
①顺序表就相当于我们学的数组,但是顺序表有前驱元素和后驱元素,就相当于我们排队一样,大家只需要记住前面的人就可以找到自己的位置。
②但是第一个位置没有前驱元素,最后一个位置没有后驱元素。
③并且我们的长度是动态可变的。
④掌握了更有利于我们今后的学习!!!

#include <stdio.h>
#include <stdlib.h>
typedef struct Link{
	int *data; //这里我们创建动态数组
	int size,length;//size表示顺序表应有的长度 length表示现有的长度
}Link;
//首先我们对顺序表进行初始化操作
Link *init(int n)
{
	Link *link = (Link*)malloc(sizeof(Link));//申请内存空间
	link->data = (int*)malloc(sizeof(int)*n);//动态数组申请空间
	link->size = n;
	link->length = 0;//长度初始化
	return link;
}

//顺序表的插入操作
int insert(Link *link,int ind,int val){ //ind下标 val值
	//首先判断是否能够插入成功
	if(link->size == link->length) return 0;//如果表满了,则插入失败
	if(ind>link->length || ind < 0) return 0;//插入的下标大于顺序表的长度或者插入的下标值小于0
	if(link == NULL) return 0;//若link为空,则无法插入 because没有空间
	//接下来我们可以开始插插插了
	for(int i=link->length; i > ind; i--){
		link->data[i] = link->data[i-1]; //插入时我们要倒着遍历,让插入的点后的数据 都向后移动一位
		printf("输出%d",link->data[i]);
	}
	link->data[ind] = val; //将空出来的位置插入进去
	link->length = link->length + 1; //插入成功后让长度+1
	return 1;
}

//顺序表有插入就应当有删除
int delete(Link *link,int ind){
	//同理先判断无法删除的情况
	if(link == NULL) return 0; //和插入解释一样
	if(ind < 0 || ind >= link->length) return 0;
	if(link->length == 0) return 0; //没有数据 我去删除谁啊?
	for(int i=ind ; i < link->length; i++){
		link->data[i] = link->data[i+1]; //让ind后的数据都向前移动一位,覆盖ind的位置
	}
	link->length = link->length - 1;
	return 1;
}

//顺序表的输出
void outPut(Link *link){
	printf("顺序表的长度 =%d",link->length);
	for(int i=0; i < link->length; i++){
		printf("  插入值 =%d ",link->data[i]);
	}
	printf("\n");
}

//顺序表的销毁
int clearLink(Link *link){
	if(link==NULL) return 0;//若为空,则不需要销毁
	free(link->data);//先销毁数据
	free(link);//在销毁空间
}

//
int main(){
	int n,choose,ind,val;
	printf("请输入你理想中顺序表的长度");
	scanf("%d",&n);
	Link *link = init(n);
	do
	{
		printf("[1]插入\n");
		printf("[2]删除\n");
		printf("[3]遍历\n");
		printf("[4]退出走人\n");
		scanf("%d",&choose);
		switch(choose)
		{
		case 1:
			printf("请输入插入的位置和插入值\n");
			scanf("%d%d",&ind,&val);
			insert(link,ind,val);
			break;
		case 2:
			printf("删除请输入删除的位置\n");
            scanf("%d",&ind);
            delete(link,ind);
            break;
        case 3:
            printf("遍历\n");
            outPut(link);
            break;
        case 4:
        	printf("退出");
        	exit(0);
        default:
        	exit(0);
		}
	}while(choose<5);
	return 0;
}**加粗样式**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值