C语言数据结构篇——顺序表的理解,创建,插入和删除

静态顺序表和动态顺序表

首先让我们了解一下这两种顺序表有什么区别
所以我们可以知道如果想要插入和删除顺序表中元素时,我们需要用到动态顺序表

还需要了解一下C语言动态内存分配

顺序表:

插入时,记得申请开拓空间
删除时,记得用后面的数据覆盖前面的数据

初始化顺序表

void list_initial(List *L)				//初始化顺序表 
{
	L->list = (int *)malloc(MAXSIZE * sizeof(int));		//开辟10个int大小的空间并且强制转化成指针 
	if(L->list == NULL)
	{
		printf("内存开辟失败\n");
		exit(0);					//正常退出 
		
	}
	
	L->len = 0;    //初始化数据有效数据为0
	L->listsize = MAXSIZE;		//初始化数组长度为MAXSIZE
	printf("内存开辟成功\n");

}

输出顺序表

void show_list(List *L)			//2、输出该顺序表
{
	printf("\n");
	for(int i=0;i<L->len;i++)
	{
		printf("%d\t",L->list[i]);
	}
	printf("\n");
}

在顺序表中插入数据

void list_insert(List *L,int i, int data)		
{
	int *base, *insert, *p;				
	if(i<1 || i>L->len+1 || L==NULL)		//这里检查插入的位置有没有问题 
	{
		printf("位置输入错误\n");
		printf("失败");
	}
	
	if(L->len > L->listsize)		
	{
		base = (int *)realloc(L->list,(L->listsize+MAXSIZE)*sizeof(int));		//这里想想是不是可以用 L->len+1(有效数据个数)来申请拓展空间就可以了 
		L->list = base;
		L->listsize = L->listsize + MAXSIZE;					//这里想想是不是可以用 L->len+1(有效数据个数)来申请拓展空间就可以了 ,因为这样可能申请冗余
															
		
		 
//		printf("list->list:%d\n",L->list);		//这里在测试的时候应该注意这里不是指针类型 
//		printf("list->len:%d\n",L->len);
//		printf("list->listsize:%d\n",L->listsize);
	}
	
	
	
	insert = &(L->list[i-1]);		//插入的位置 
	
	for(p=L->list + L->len-1; p>=insert; p--)		
	{
		*(p+1) = *p;
	}
	*insert = data;			//直接传递数值 
	L->len++;				//每有数值进来时,有效长度+1 
	printf("插入成功");
	
}

在顺序表中删除数据

void list_delete(List *L,int i)
{
	int *q, *delete_i;
	if(L==NULL || i<0 || i>L->len)
	{
		printf("位置输入错误\n");
		printf("失败");
	}
	
	delete_i = &(L->list[i-1]);			//指针指向需要删除的位置 
	q = L->list + L->len-1;				//指针指向最后位置 
	for(delete_i=delete_i+1; delete_i<=q; ++delete_i)		
	{
		*(delete_i-1) = *delete_i;				
	}
	L->len--;
	printf("删除成功");
} 



完整代码

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

#define MAXSIZE 10				//这里先自己假定有10个位置 

typedef struct
{
	int *list;			//这里需要特别注意,还没有分配大小,如果没有分配大小在后面的输入输出会失败 
	int len;			//有效数据 
	int listsize;		//顺序表的长度 
}List;




void list_initial(List *L)				//初始化顺序表 
{
	L->list = (int *)malloc(MAXSIZE * sizeof(int));		
	if(L->list == NULL)
	{
		printf("内存开辟失败\n");
		exit(0);					//正常退出 
		
	}
	
	L->len = 0;    //初始化数据有效数据为0
	L->listsize = MAXSIZE;		//初始化数组长度为MAXSIZE
	printf("内存开辟成功\n");

}



void list_insert(List *L,int i, int data)		
{
	int *base, *insert, *p;				
	if(i<1 || i>L->len+1 || L==NULL)		//这里检查插入的位置有没有问题 
	{
		printf("位置输入错误\n");
		printf("失败");
	}
	
	if(L->len > L->listsize)		
	{
		base = (int *)realloc(L->list,(L->listsize+MAXSIZE)*sizeof(int));		//这里想想是不是可以用 L->len+1(有效数据个数)来申请拓展空间就可以了 
		L->list = base;
		L->listsize = L->listsize + MAXSIZE;					//这里想想是不是可以用 L->len+1(有效数据个数)来申请拓展空间就可以了 ,因为这样可能申请冗余
																
		
		 
//		printf("list->list:%d\n",L->list);		//这里在测试的时候应该注意这里不是指针类型 
//		printf("list->len:%d\n",L->len);
//		printf("list->listsize:%d\n",L->listsize);
	}
	
	
	
	insert = &(L->list[i-1]);		//插入的位置 
	
	for(p=L->list + L->len-1; p>=insert; p--)		
	{
		*(p+1) = *p;
	}
	*insert = data;			//直接传递数值 
	L->len++;				//每有数值进来时,有效长度+1 
	printf("插入成功");
	
}

void list_delete(List *L,int i)
{
	int *q, *delete_i;
	if(L==NULL || i<0 || i>L->len)
	{
		printf("位置输入错误\n");
		printf("失败");
	}
	
	delete_i = &(L->list[i-1]);			//指针指向需要删除的位置 
	q = L->list + L->len-1;				//指针指向最后位置 
	for(delete_i=delete_i+1; delete_i<=q; ++delete_i)		//删除的时候记得+1 
	{
		*(delete_i-1) = *delete_i;				
	}
	L->len--;
	printf("删除成功");
} 

void show_list(List *L)			//2、输出该顺序表
{
	printf("\n");
	for(int i=0;i<L->len;i++)
	{
		printf("%d\t",L->list[i]);
	}
	printf("\n");
}


int main()
{
	int i; 
	List L;			//直接定义一个指针变量,待会看看可不可以把星号去掉 ,去不掉!!!换方法 
	
	list_initial(&L);
	
	for(i=0; i<10; i++)
	{
		list_insert(&L,i+1,i+1);
	}
	printf("\n");
	printf("插入前的顺序表");
	show_list(&L); 
//	printf("list->list:%d\n",L.list);		//这里在测试的时候应该注意这里不是指针类型 
//	printf("list->len:%d\n",L.len);
//	printf("list->listsize:%d\n",L.listsize);

	list_insert(&L,2,0);
	show_list(&L); 
	
	list_delete(&L,2);
	show_list(&L); 
	
	return 0;
} 









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值