顺序表
一、创建表
个人理解,即先建个壳子,表明这是个顺序表,里面存的变量是什么类型。
代码如下
#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; //按位查找
}
}
}
另外,对于子函数何时该用传值符&,个人认为,如果该子函数改变了表的长度或内容,则需要加,例如插入,删除,赋值。反之,只是简单的查找元素或者打印遍历,则不需要。