数据结构之顺序表

顺序表

一、创建表

个人理解,即先建个壳子,表明这是个顺序表,里面存的变量是什么类型。

代码如下

#include<stdio.h>
#define MAXSIZE 100
typedef struct {
	int *elem;
	int length;
}List;

二、初始化

将前面定义的变量定义为数组且分配空间大小。

代码如下

/***顺序表初始化***/
void InitList(List &L){
	L.elem=new int[MAXSIZE];
	L.length=0;
}

三、赋值

给表赋值,用for循环读值,是数组的基本操作,L.length=n即记录表当前长度。

代码如下

/***读数赋值***/
void Assignment(List &L,int n,int e){
	printf("输入表长:");
	scanf("%d",&n);
	printf("依次输入%d个值:",n);
	for(int i=0;i<n;i++){
		scanf("%d",&e);
		L.elem[i]=e;
	}
	L.length=n;
}

四、打印表

遍历表中当前元素值,由于后面要多次用到插入、删除等操作,所以单独个函数方便随时查看,L.length的长度在每个操作的函数里都有做处理。

代码如下

/***打印表***/
void Print(List L){
	printf("表中当前数:");
	for(int i=0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	}
}

五、插入

插入的思想是用户输入插入的数值和位置先将L.length++,此时L.elem[L.length-1]即为刚增加的一个数组长度,再将L.elem[L.length-1]=L.elem[L.length-2],以此类推,可以看成把前一个数挪到后一个数的位置,直到用户需要的位置时停止,此时这个位置可以赋值为用户要插入的数。

代码如下

/***插入***/
void Insert(List &L,int x,int y){
	printf("\n输入要插入的数和位置:");
	scanf("%d %d",&x,&y);
	L.length++;
	for(int a=L.length;a>y-1;a--){
		L.elem[a-1]=L.elem[a-2];
	}
	L.elem[y-1]=x;
}

六、删除

删除的思想与插入刚好相反,确定用户要删除的位置z后,只需将后一个数赋值给当前位置的数,即L.elem[z-1]=L.elem[z],直到倒数第二个数也被赋值后为止,再删掉最后多出来的数组长度。

代码如下

/***删除***/
void Delete(List &L,int z){
	printf("\n输入要删除的数的位置:");
	scanf("%d",&z);
	for(int a=z;a<L.length;a++){
		L.elem[a-1]=L.elem[a];
	}
	L.length--;
}

七、按值查找和按位查找

操作很简单,不过多赘述。

代码如下

/***按值查找***/
void ValueSearch(List L,int b){
	printf("\n输入要查找的值:");
	scanf("%d",&b);
	for(int i=0;i<L.length;i++){
		if(L.elem[i]==b){
			printf("%d在第%d位",b,i+1);	
			break;	
		}
	}
}
//	else {printf("表中无该值");	}
/***按位查找***/
void LocateSearch(List L,int d){
	printf("输入要查找的值的位数:");
	scanf("%d",&d);
	printf("第%d位是%d",d,L.elem[d-1]);
}

八、menu()及main函数的调用

menu()看起来方便,运用switch…case使用起来更灵活且代码看起来整洁

代码如下

void Menu(List L){
	printf("************************\n");
	printf(" * 1.  赋值           *\n");
	printf(" * 2.  插入           *\n");
	printf(" * 3.  删除           *\n");
	printf(" * 4.  按值查找       *\n");
	printf(" * 5.  按位查找       *\n");
	printf("************************\n");

}
int main()
{
	int n,e,x,y,z,c=0,b,d;   //n 初始化的表长,e 赋值的各个数,x 要插入的数,y 要插入的位置   
	List L;                  //z 将第z个元素删除,c stwich分支,b 按值查找的值,d按值查找的位置 
	InitList(L);			 //d 按位查找的位数 
 	Menu(L);
	while(c<5){
		printf("\n输入1~4执行下一步操作:");
		scanf("%d",&c);
		switch (c){
			case 1:Assignment(L,n,e);Print(L);break;  //赋值 
			case 2:Insert(L,x,y);Print(L);break;  //插入 
			case 3:Delete(L,z);Print(L);break;  //删除 
			case 4:ValueSearch(L,b);break;		//按值查找
			case 5:LocateSearch(L,d);break;		//按位查找
		}
	}	
}

另外,对于子函数何时该用传值符&,个人认为,如果该子函数改变了表的长度或内容,则需要加,例如插入,删除,赋值。反之,只是简单的查找元素或者打印遍历,则不需要。

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值