先上代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 50
#define OK 1
#define ERROR -1
#define TRUE 1
typedef int ElementType;
//基本结构
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];//最大数组长度
int Last;
};
//线表初始化
List MakeEmpty()
{
List PtrL;
PtrL = (List)malloc(sizeof(struct LNode));
PtrL->Last = -1;
return PtrL;
}
//按元素查找位置
int Potion_Find(List PtrL,ElementType X)
{
int i =0;
if(PtrL->Last==-1)
return ERROR;
while(i<=PtrL->Last && PtrL->Data[i] != X)
i++;
if(i > PtrL->Last) return ERROR;//找不到返回-1
else return i+1;//返回下标
}
//按位置查找元素
int FindKth(List PtrL,int X)
{
if(PtrL->Last==-1)
return ERROR;
if(X < 1 || X > PtrL->Last +1)
return ERROR;
return PtrL->Data[X-1];
}
//插入
ElementType Insert(List PtrL,ElementType X,int i)
{
int j;
if(PtrL->Last==-1)
return ERROR;
if(PtrL->Last == MAXSIZE-1) {
printf("表满");
return ERROR;
}
if(i < 1 || i >PtrL->Last+2) {//插入范围1到n+1,下标就是0到last+2
printf("位置不合法");
return ERROR;
}
if(i>=1 && i<= PtrL->Last+1)//插入的不是最后的
for(j = PtrL->Last; j >= i-1; j--)
PtrL->Data[j+1]=PtrL->Data[j];
PtrL->Data[i-1] = X;
PtrL->Last++;
return OK;
}
//删除
ElementType Delete(List PtrL,int i)
{
int j = 0;
if(PtrL->Last==-1)
return ERROR;
if(i < 1 || i > PtrL->Last+1)
return ERROR;
if(i>=1 &&i<PtrL->Last+1)
for(j = i-1;j<=PtrL->Last;j++)
PtrL->Data[j] = PtrL->Data[j+1];
PtrL->Last--;
return OK;
}
//返回元素个数
int get_Length(List PtrL)
{
return PtrL->Last+1;
}
//打印顺序表
void DispList(List PtrL)
{
int i =0;
if(PtrL->Last == -1)
printf("\n没有元素可以打印!");
else{
printf("打印所有元素:");
for(;i<=PtrL->Last;i++)
printf("%d ",PtrL->Data[i]);
}
printf("\n");
}
//显示菜单
void Menu()
{
printf("********************************************\n");
printf(" 1.建立顺序表 \n");
printf(" 2.插入元素 \n");
printf(" 3.删除元素 \n");
printf(" 4.按位置查找元素 \n");
printf(" 5.按元素值查找元素 \n");
printf(" 6.求顺序表的长度 \n");
printf(" 7.显示线性表 \n");
printf(" 0.返回 \n");
printf("********************************************\n");
}
int main(void)
{
List MakeEmpty();
int Potion_Find(List PtrL,ElementType X);
int FindKth(List PtrL,ElementType X);
ElementType Insert(List PtrL,ElementType X,int i);
ElementType Delete(List PtrL,int i);
int get_Length(List PtrL);
void DispList(List PtrL);
void Menu();
Menu();
int n = 0;
int location;
ElementType element;
int numbers;
int order_number;
printf("\n请输入序号执行相关操作!\n");
List L = MakeEmpty();
while(1){
scanf("%d",&n);
switch(n){
case 1://建立顺序表
printf("请输入建立线性表的元素个数:");
scanf("%d",&numbers);
L->Last = numbers-1;
printf("请输入%d个整数:",numbers);
for(int i = 0;i <= L->Last;i++)
scanf("%d",&L->Data[i]);
printf("\n创建成功!\n");
printf("\n继续输入序号执行操作\n");
break;
case 2://插入元素
printf("插入的元素是:");
scanf("%d",&element);
printf("\n插入的位置是(首序号是1):");
scanf("%d",&location);
if(Insert(L,element,location)==TRUE)
printf("\n插入成功!\n");
else
printf("\n插入失败!\n");
printf("\n继续输入序号执行操作\n");
break;
case 3://删除元素
printf("请输入要删除的元素序号(首序号是1):");
scanf("%d",&order_number);
if(Delete(L,order_number)==TRUE)
printf("\n删除成功!\n");
else
printf("\n删除失败!\n");
printf("\n继续输入序号执行操作\n");
break;
case 4://按位置查找元素
printf("请输入元素的位置(首位置是1):");
scanf("%d",&location);
printf("\n位置%d上的元素是 %d\n",location,FindKth(L,location));
printf("\n继续输入序号执行操作\n");
break;
case 5://按元素查找位置
printf("请输入元素值:");
scanf("%d",&element);
printf("该元素的位置是 %d (从1开始)\n",Potion_Find(L,element));
printf("\n继续输入序号执行操作\n");
break;
case 6://顺序表的长度
printf("该顺序表的长度是 %d\n",get_Length(L));
printf("\n继续输入序号执行操作\n");
break;
case 7://显示线性表
DispList(L);
printf("\n继续输入序号执行操作\n");
break;
case 0:
exit(0);
default:printf("请输入正确的序号!\n");
}
}
free(L);
return 0;
}
首先理解以下顺序存储方法的顺序结构
顺序存储的逻辑结构和物理结构存储方式是一样的,利用连续的空间存储数据。
连续的空间,自然就是数组了。
也就是说顺序存储,其实就是把数据放到数组里面,然后插入,删除等功能,就是对数组的操作。
插入的算法:
如果说是想把元素插到某个位置,就先把这个某个位置及后面的元素往后挪一位,再用新值覆盖某个位置上的那个元素。
考虑到插入的位置可以在最后一项,所以插入的范围应该是1~n+1
最后数组长度再+1
至于具体的挪位条件范围,要具体分析
总的来说就四步:检查,挪位,赋值,长度加一
插入的范围1~n+1
删除的算法:
和插入类似,也是挪元素,想删除某个位置上的元素,只需要把改位置后面的元素都往前挪一位,长度再-1就好了,删除是靠挪位的覆盖和长度的截取来实现的。比如说我要删除最后以为,我并不需要挪位,我只需要把指向最后元素的位置像前挪一下,这样,被删除的元素就没有机会被操作了,除非你又对位置+1指向了它咯。
删除的范围:1~n
查找的算法:
1)通过位置查找元素:
位置使用数组下标或者元素顺序都可以,具体细节只不过是转换的问题。
查找是通过遍历数组来实现的,在长度范围内寻找匹配项
2)通过元素查找位置
同样是遍历数组,在范围内查找匹配项
查找的范围是在1~n