顺序表
1. 定义顺序表
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 20
typedef int datatype;
typedef struct list{
datatype data[MaxSize]; //MaxSize 是顺序表总长度-数组总元素个数
int length; // 顺序表的当前长度
}sequenlist;
2. 通过已知数组元素创建顺序表
//通过已知数组元素创建顺序表
void creatlist( sequenlist *seqlist )
{ int i;
int a[10]={34,23,67,43,23,87,23,67,92,12};
seqlist->length =0;
for(i=1;i<=10;i++)
{
if(Insert(seqlist,i,a[i-1])==-1) printf("error!\n");
}
}
3. 通过键盘输入创建顺序表
//通过键盘输入创建顺序表
void creatlist2( sequenlist *seqlist )
{ int i;int n;
datatype x;
seqlist->length =0;
printf("请输入要输入的元素个数:");
scanf("%d",&n);
printf("请输入各元素的值:");
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(Insert(seqlist,seqlist->length+1 ,x)==-1) printf("error!\n");
}
}
4. 显示顺序表中所有元素的值
//显示顺序表中所有元素的值
void displaylist(sequenlist *seqlist)
{ int i;
// 判断是否是空表
if(seqlist->length<=0)
{
printf("抱歉,目前表中没有元素!");
return ;
}
// 若是非空表,则输出各元素
printf("目前的数据元素有:");
for(i=0;i<seqlist->length;i++)
{
if(i%10==0) printf("\n");
printf("%d ",seqlist->data[i]);
}
printf("\n\n");
}
5. 在指定位置插入
//在位置index位置上插入值为x的元素 ,插入异常则返回-1
int Insert(sequenlist *seqlist, int index, datatype x)
{
int j;
if (seqlist->length>=MaxSize) return -1;
if (index<1 || index>(seqlist->length+1)) return -1;
for (j=seqlist->length; j>=index; j--)
seqlist->data[j]=seqlist->data[j-1];
seqlist->data[index-1]=x;
seqlist->length++;
return 1;
}
6. 删除指定位置元素
//删除位置index上的元素
int Delete(sequenlist *seqlist, int index)
{
int j;
if (seqlist->length<=0) return -1;
if (index<1 || index>(seqlist->length)) return -1;
for (j=index; j<=seqlist->length; j++)
seqlist->data[j-1]=seqlist->data[j];
seqlist->length--;
return 1;
}
7. 查看指定位置元素
//查看位置index上的元素的值
datatype getItem(sequenlist *seqlist, int index)
{
if (index>=1 && index<=(seqlist->length))
return (seqlist->data[index-1]);
}
8. 查找指定元素
//查找值为x的元素是否存在,若存在返回其位置,否则给出提示信息
int Locate(sequenlist *seqlist, datatype x)
{
int i; //下标
for (i=0; i<seqlist->length; i++)
if (seqlist->data[i]==x) return (i+1);
return 0;
}
记忆小结
本系列所指的“位置”,都是按日常习惯,从1开始。
- 顺序表虽然是数组实现的,但实际上是在结构体中保存的数组和长度
- 插入算法:先将插入位置后的所有元素逐一后移,然后插入。
- 插入位置不合法:
a. seqlist->length >= MaxSize 表满
b. index<1 || index > (seqlist->length+1) 小于1显然不合法,超出实际长度后两个显然也不行 - 删除算法:将被删除位置之后的元素逐一往前覆盖
- 删除位置不合法
a. seqlist->length < 1 表空
b. index<1 || index>(seqlist->length) 小于1肯定不合法,超出表长自然也不合法 - 凡是涉及用户输入的,都需要对用户输入进行合法性检验