数据结构-线性表-1顺序线性表

#include<stdio.h>
/*线性表的特点:同一性、有穷性、有序性*/
//线性表的抽象数据类型:数据元素、结构关系、基本操作
//基本操作:InitList/ListLength/GetData/InsList/DelList/Locate/DestroyList/ClearList/EmptyList
//增删改查+基本属性

#define MAXSIZE 100
#define ElemType char 

//线性表的线性存储结构(如果是空表last值是-1) 
typedef struct
{
	ElemType elem[MAXSIZE];
	int last;
	
 }SeqList;
//可以构造结构体类型的变量和对应的指针变量,区别就是变量直接用L.a访问,而指针变量用L->a访问结构体中对应的元素 
 
 
//查找操作(共两种,按序号查找和按内容查找)
/*int GetData(SeqList L, int i)
{ 判错的就省略了,意思意思得了 
	return L.elem[i-1];	
 } */ 
 
int Locate(SeqList L, ElemType e)
{
	i = 0;
	while((i<=L.last) && (L.elem[i]!=e)){
		i++;
	}
	if(i<=L.last)
		return (i+1);
	else
		return -1;
}
//注意这里我们返回的是标号

//插入操作:注意插入操作要用指针变量(删除同理) 
#define OK 1
#define ERROR 0
int InsList(SeqList *L, int i, ElemType e)
{
	if(i<1 || i>L->last+2){
		printf("插入位置不合法\n");
		return (ERROR);
	}
	if(L->last+1 > MAXSIZE){
		printf("表已满故无法插入\n");
		return (ERROR);
	}

	int k;
	for(k=L->last;k>=i-1;k--){
		L->elem[k+1] = L->elem[k];//元素从后往前依次往后移 
	}
	//先移走,再变动 
	L->elem[i-1] = e;
	L->last++;
	return (OK);
 } 
 
 
//删除操作:保存被删除的元素到元素类型的指针变量e 
int DelList(SeqList *L, int i, ElemType *e)
{
	if(i<1 || i>L->last+1)
	{
		printf("删除位置不合法\n");
		return (ERROR); 
	 } 
	if (L->last == -1)
	{
		printf("链表为空,不能删除!\n");
		return (ERROR);
	}
	e = L->elem[i-1];
	int k;
	for(k = i; k<=L->last; k++){
		L->elem[k-1] = L->elem[k];//元素从前到后依次往前移 
	}
	L->last--;
	return (OK);
 } 

/*例题:有序顺序表LA和LB、将它们合成一个有序顺序表LC(非递减排序)*/
//其实这段代码的总体思路和归并排序是一毛一样的 
void mergeList(SeqList *LA, SeqList *LB, SeqList *LC)
{
	int i=0,j=0,k=0;
	while((i<=LA->last) && (j<=LB->last))
	{
		if(LA->elem[i]<=LB->elem[j]){
			LC->elem[k] = LA->elem[i];
			k++;i++;
		}
		else{
			LC->elem[k] = LB->elem[j];
			k++;j++;
		}
	}
	while(i<=LA->last){
		LC->elem[k] = LA->elem[i];
		k++;i++;
	}
	while(j<=LB->last){
		LC->elem[k] = LB->elem[j];
		k++;j++;
	}
	LC->last = k-1;
 } 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值