c语言-用数组模拟 --实现顺序表的-增,删,改,查

#include <stdio.h>
#include <malloc.h>
/*采用数组模拟线性表*/
#define MAXSIZE 20
typedef struct LNode * List;//定义一个指向LNode结构的指针 
struct LNode{
	int Data[MAXSIZE];//创建一个int类型的数组 
	int Last;//指向数组最后一个元素的下标,最后一个元素并不代表该数组最后一个位置
	 
}; 
//struct LNode L;
List Ptrl;//定义一个指向该指针结构体的变量 

//建立空的顺序表 
List MakeEmpty(){
	List Ptrl;//定义一个指向该指针结构体的变量  
	Ptrl = (List)malloc(sizeof(struct LNode));//为结构体类型分配一块内存 
	Ptrl->Last = -1;//如果该链表没有元素,就将-指向数组最后一个元素的下标Last指向-1,代表空  
	return Ptrl;
}

//在链表中查找一个元素
int Find(int x, List Ptrl) {//在链表Ptrl中查找一个x 
	int i = 0;
	while(i <= Ptrl->Last && Ptrl->Data[i] != x)
		   i++;
	if (i > Ptrl->Last)
	   return -1;//如果下标大于最后一个元素的下标,说明该线性表中并没有该元素,返回-1 
	else
		return i;//找到x元素所对应的下标	   
} 

//插入
//前提条件:第i(1 <= i <= n+1)个位置上插入一个值为X的新元素,第i个位置也就是i - 1 
void Insert(int x,int i,List Ptrl) {//7,11,Ptrl     
	int j;
	if(Ptrl->Last == MAXSIZE-1) {//指向最后一个元素的下标Last指向了MAXSIZE-1,说明数组满 
		printf("表满");
		return; 
	}
	if(i < 1 || i > Ptrl->Last+2) {
	/*
	  *****
	  插入位置的合法性之说明(2021年11月9日):
		  i < 1:因为时模拟数组实现的插入,i可以取等于1,也就是可以在下标1-1 = 0处插入元素,也就是说将元素插在顺序表的头部,原先头部元素往后移一个
		  i > Ptrl->Last+2: 
		  因为第一个if条件已经说明该链表尾部至少还有一个空位,
		  考虑只剩一个空位的情况:
		  能够在(Ptrl->last+1)的位置上还插入一个元素,而Ptrl->last+1位置对应的是第Ptrl->last+2的位置
	*/  
        printf("位置不合法");
        return; 
	} 
	for (j = Ptrl->Last; j >= i-1;j--) {//将下标指向Last 
		Ptrl->Data[j+1] = Ptrl->Data[j];//将元素从后面移一个位置,从最后一个元素开始,从而将Data[i-1]对应位置空出来 
	}
	Ptrl->Data[i-1] = x;
	Ptrl->Last++;//仍然将Last指向最后一个元素 
} 

//删除操作的实现,删除第i个元素,也就是删除i-1下标所对应的元素 
void Delete(int i, List Ptrl) {
	int j;
	if(i < 1 || i >Ptrl->Last + 1) {//检查删除位置的合法性 
		printf("不存在第%d个元素",i);
	}
	for (j = i; j <= Ptrl->Last; j++) {
		Ptrl->Data[j-1] = Ptrl->Data[j];//与插入不同,该操作是将元素从需要插入的位置逐个往前移 
	}
	Ptrl->Last--; 
} 
int main(void) {
	//建立顺序表 
	Ptrl = MakeEmpty();
 
	//插入--第i(1 <= i <= n+1)个位置上插入一个值为X的新元素,第i个位置也就是i - 1 
	Insert(1,1,Ptrl);//注意:每一次插入,Ptrl->Last都往后移一位 
	Insert(2,2,Ptrl);
	Insert(3,3,Ptrl);
	Insert(4,4,Ptrl);
	
	//查找链表中所有元素
	printf("%d\n",Find(1,Ptrl)); 
	printf("%d\n",Find(2,Ptrl));
	printf("%d\n",Find(3,Ptrl));
	printf("%d\n",Find(4,Ptrl));
 		
	//删除操作的实现
	Delete(2,Ptrl); 
	printf("删除元素2后,看一下元素2的状态为:%d\n",Find(2,Ptrl));
	printf("删除元素2后,查看3所处的位置为:%d\n",Find(3,Ptrl));
	
	printf("Delete报错测试为:\n"); 
	Delete(0,Ptrl);
	printf("\nInsert报错测试为:\n"); 
	Insert(7,4,Ptrl);
	/*
	按照道理,由于只删除了第2个元素,因为第0个元素不存在,那么Ptrl->Last=2指向了第3个元素,
	由Insert()函数中if条件 i > Ptrl->Last+2,4 < Ptrl->Last=3 + 2 == 5,不满足该条件,那么
	就可以继续以下操作,插入元素,但是,实际上并没有插入,因位 Delete(0,Ptrl);语句执行了
	函数中的Ptrl->Last--; 尽管没有第0个元素,实际上Ptrl->Last=1指向了第2个元素,以下输出将验证
	Ptrl->Last的数值 
	 
	*/ 
	printf("\n验证Ptrl->Last所处的位置为:%d\n",Ptrl->Last);
 		
	return 0;
} 

输出:

0
1
2
3
删除元素2后,看一下元素2的状态为:-1
删除元素2后,查看3所处的位置为:1
Delete报错测试为:
不存在第0个元素
Insert报错测试为:
位置不合法
验证Ptrl->Last所处的位置为:1

--------------------------------
Process exited after 0.01702 seconds with return value 0
请按任意键继续. . .
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值