顺序表练习(c语言描述)

线性表的循序表示:

typedef int Position;
typedef struct LNode *PtrToNode;
struct LNode{
	ElementType Data[MAXSIZE];
	Position Last;
};

顺序表的初始化:

List MakeEmpty(){
	List l;
	l=(List)malloc(sizeof(struct LNode));//创建一个顺序表 
	l->Last=-1;//顺序表的索引值为-1,进行初始化 
	return l;
} 

顺序表的查找

#define ERROR -1// 将错误信息ERROR的值定义为-1 
Position Find(List l,ElementType x){//返回查找元素的所在位置 
	Position i=0;//从0起始位置开始 
	while(i<=l->Last&&l->Data[i]!=x)//判断条件 
		i++;
	if(i>l->Last) return ERROR;
	else return i;
}

顺序表的插入

bool Insert(List l,ElementType x,int i) {
// l:要插被入的顺序表,x;要插入的元素 ,i:要插入的位置 
Position j;//用来做记号 
if(l->Last==MAXSIZE-1){//判断是否表满 
	//表已满,不能插入
	printf("表满");
	return false;
}
if(i<1||i>l->Last+2){//判断是否插入的位置对不对 
	//插入的是数组的第i号前,
	printf("位序不合法") ;
	return false;
}
//在判断完所有不合法的情况后,就开始正常插入了
for(j=l->Last;j>=i-1;j--){//把要插入位置后的元素都向后移一位 
	l->Data[j+1]=l->Data[j];
}
l->Data[i-1]=x;//插入 
l->Last++;//最后标记向后移动一位 
return true; 
}

顺序表的删除操作

bool Delete(List l,int i){
	//从l中删除指定位序的元素,该元素数组的下标i-1
	Position j;
	//判断 删除的位置是否合适
	if(i<1&&i>l->Last+1) {
		printf("位序%d不存在元素",i);
		return false;
	}
	for(j=i;j<=l->Last;j++){//第i号元素后的元素,向前移动一位 
		l->Data[j]=l->Data[j+1];
	}
	l->Last--;//数组末尾标记减一 
	return true
} 

线性表的链式存储实现:

typedef struct LNode * PtrToLNode;
struct LNode{
	ElementTyped Data;
	PtrToLNode Next;
}; 
typedef PtrToLNode Position;//这里的位置是结点的地址 
typedef PtrToLnode List;


求表长:

int Length(List L){
	Position p;
	int cnt=0;//初始化计时器
	p=L;//p指向表的第一个结点
	while(p){
		p=p->Next;
		cnt++;
	}
	return cnt;
}

查找:按序号

ElementType FindKth(List L,int K){
	Position p;
	int cnt=1;//位序从1开始
	p=L;//p指向L的第一个结点
	while(p&&cnt<K){
		p=p->Next;
		cnt++;
	}
	if((cnt==K)&&p)
		return p->Data;//找到第K个
	else
		return ERROR;//返回错误信息
}

查找:按值查找

ElementType Find(List L,ElementType X){
	Position p=L;//p指向L的第一个结点
	while(p&&p->Data!=X){
		p=p->Next;
	}
	return p;
}

插入

List Insert(List L,ElementType X,int i){
	Position tmp,pre;
	tmp=(Position)malloc(sizeof(struct LNode));//申请,填装结点
	tmp->Data=X;
	if(i==1){
		tmp->Next=L;
		return tmp;//返回新表头指针
	}else{
		int cnt=1;
		pre=L;
		while(pre&&cnt<i-1){
			pre=pre->Next;
			cnt++;
		}
		if(pre==NULL||cnt!=i-1){
			printf("插入位置参数错误\n");
			free(tmp);
			return false;
		}else{
			tmp->Next=pre->Next;
			pre->Next=tmp;
			return L;
		}
	}
}

带头结点的链式表的插入函数:

bool Insert(List L,ElementType X,int i){
	//默认L有头结点
	Position tmp,pre;
	int cnt=0;
	//查找位序为i-1的结点
	pre=L;//pre指向表头
	while(pre&&cnt<i-1){
		pre=pre->Next;
		cnt++;
	}
	if(pre==NULL&&cnt!=i-1){
		printf("插入位置参数错误");
		return false;
	}else{
		tmp=(Position)malloc(sizeof(struct LNode));//申请 填装结点
		tmp->Data=X;
		tmp->Next=pre->Next;
		pre->Next=tmp;
		return true;
	}
}

删除

bool Delete(List L,int i){
	Position pre,tmp;
	int cnt=0;
	//查找位序为i-1的结点
	pre=L;
	while(pre &&cnt<i-1){
		pre=pre->Next;
		cnt++;
	}
	if(pre==NULL||cnt!=i-1||pre->Next=NULL){
	//所找结点或位序为i的结点不在L中
		printf("删除位置错误\n");
		return false;
	}else{
		tmp=pre->Next;
		pre=tmp->Next;
		free(tmp);
		return true;
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值