C语言数据结构——顺序表

  数据结构的一些讲解,供学习者参考,也顺带作为复习


  线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为顺序表。因为内存中的地址空间是线性的,因此,用物理上的相邻实现数据元素之间的逻辑相邻关系既是简单又自然的。

       


将数据存储区data和指针last封装成一个结构体作为顺序表的类型

struct LinearList<span style="white-space:pre">		</span>/*定义顺序表结构*/
{
<span style="white-space:pre">	</span>int *list;<span style="white-space:pre">			</span>/*存顺序表元素*/
<span style="white-space:pre">	</span>int size;<span style="white-space:pre">			</span>/*存顺序表长度*/
<span style="white-space:pre">	</span>int MaxSize;<span style="white-space:pre">		</span>/*存list数组元素的个数*/


};

顺序表的初始化

/*顺序表的初始化函数*/
void InitList (LIST *L,int ms)
{
<span style="white-space:pre">	</span>if((L->list=(int *)malloc(ms*sizeof(int)))==NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>printf("内存申请失败!\n");
<span style="white-space:pre">		</span>exit(1);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>L->size = 0;
<span style="white-space:pre">	</span>L->MaxSize = ms;
<span style="white-space:pre">	</span>printf("链表创建成功!\n");
}


顺序表的插入算法

/*顺序表的插入算法,item:记录插入的值;rc:记录插入的位置*/
int InsertList(LIST *L, int item, int rc)
{
	int i;
	if((L->size)>=L->MaxSize)
		return -1;				/*顺序表已满*/
	if(rc<0)					/*插入位置为0到L->size*/
		rc = 0;
	if(rc>L->size)
		rc = L->size;
	for(i=L->size-1;i>=rc;i--)			/*将rc后面的元素后移*/
		L->list[i+1]=L->list[i];
	L->list[rc]=item;
	L->size++;
	return 0;
}

输出顺序表的所有元素

/*输出顺序表所有元素*/
void OutputList(LIST *L)
{
	int i;
	for(i=0;i<L->size;i++)
		printf("%d",L->list[i]);
	printf("\n");
}

顺序表的查找算法

/*查找算法*/
int FindList(LIST *L,int item)
{
	int i;
	for(i=0;i<L->size;i++)
		if(L->list[i]==item)			/*找到相同元素,返回元素的位置*/
			return i;
		return -1;						/*无法找到,返回-1*/
}

顺序表的删除算法

/*删除元素,item:删除元素的值*/
int DeleteList_1( LIST *L,int item)
{
	int i,n;
	for(i=0;i<L->size;i++)				/*找到相同的元素*/
		if(item==L->list[i])
			break;
	if(i<L->size)
	{
		for(n=i;n<L->size-1;n++)
			L->list[n] = L->list[n+1];
		L->size--;
		return i;
	}
	return -1;
}

删除顺序表指定位置的元素

/*删除指定位置的数据*/
int DeleteList_2( LIST *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 0;
}

主函数代码,仅供学习参考

void main()
{
	LIST LL;			/*顺序表*/
	int i,r,n,model;	/*i:元素值;r:插入位置;n:顺序表长度;model:选择行为模式*/
	printf("请输入所需链表的长度:\t");
	scanf("%d",&n);
	fflush(stdin);
	InitList(&LL,n);
	printf("list addr = %p\tsize = %d\tMaxSize = %d\n",LL.list,LL.size,LL.MaxSize);	
	
	while(1)
	{
		printf("请选择你需要的操作\n【1】插入数据\n【2】查找数据\n【3】删除特定位置的数据\n【4】删除链表中的某个数据\n【5】遍历并输出线性表\n【6】退出\n");
		scanf("%d",&model);
		fflush(stdin);
		switch(model)
		{
		case 1:
			while(1)
			{
				printf("请输入插入元素值:\t");
				scanf("%d",&i);
				if(i==0)
					break;
				printf("请输入插入的位置:\t");
				scanf("%d",&r);
				if((InsertList(&LL,i,r-1))==-1)
					printf("插入失败!");
				printf("当前线性表为:\n");
				OutputList(&LL);
			}
			break;
		case 2:
			while(1)
			{
				printf("请输入查找元素值:\t");
				scanf("%d",&i);
				if(i==0)
					break;
				r=FindList(&LL,i);
				if(r<0)
					printf("没有找到\n");
				else
					printf("元素位置为:%d\n",r+1);
			}
			break;
		case 3:
			while(1)
			{
				printf("请输入删除的元素位置:\t");
				scanf("%d",&r);
				if(r==0)
					break;
				i=DeleteList_2(&LL,r-1);
				if(i<0)
					printf("位置越界\n");
				else
				{
					printf("线性表为:");
					OutputList(&LL);
				}
			}
			break;
		case 4:
			while(1)
			{
				printf("请输入删除的元素值:\t");
				scanf("%d",&i);
				if(i==0)
					break;
				r=DeleteList_1(&LL,i);
				if(r<0)
					printf("没有找到该元素\n");
				else
				{
					printf("位置为%d的元素已经删除\n",r+1);
					printf("线性表为:");
					OutputList(&LL);
				}
			}
			break;
		case 5:
			OutputList(&LL);
			break;
		case 6:
			exit(0);
		default:
			printf("请重新输入:\n");
			break;
		}
	}

运行结果如下图



需要源代码的欢迎下载,免积分,共同学习,接下来会每天分享一篇,持续一个星期

http://download.csdn.net/detail/kevin_iot/9395161


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值