什么是顺序表?
按顺序方式存储的线性表称为顺序表,通过创建数组来建立。顺序表中的每个数据元素按其顺序有唯一的索引值,称为下标值,可以方便的访问数据元素内容。
顺序表的结构类型定义:
#define MAXSIZE 1024 typedef int elemtype; typedef struct { elemtype data[MAXSIZE]; int last; }sequenlist;/*结构类型名*/
可能有初学者不懂typedef什么意思,我个人理解是一种对类型的重命名,比如每个人都可以有个小名,typedef就是将其后面的类型用另一个名字命名,方便后面类型的更换,比如typedef int elemtype,后面如果要定义一个整型的变量a,直接elemtype a就行,如果要更换a的类型,就把int改成想要的类型,就不用一个个去改。
顺序表的基本操作:
顺序表的初始化
sequenlist* Init_sequenlist()/*初始化顺序表*/
{
sequenlist* L;
L = (sequenlist*)malloc(sizeof(sequenlist));/*申请分配内存空间*/
if (L != NULL)/*如果不为空指针*/
{
L->last= -1;/*设置顺序表长度为-1,表示顺序表为空*/
printf("初始化顺序表成功\n");
}
return L;/*返回顺序表首地址*/
}
sequenlist 是类型名
sequenlist*L;是定义顺序表指针变量
last是顺序表最后一个元素的下标位置,顺序表长度为last+1,当顺序表为空时,其last=-1;
顺序表的创建:
sequenlist* Create_sequenlist()
{
sequenlist* L;
L = (sequenlist*)malloc(sizeof(sequenlist));
printf("请输入元素个数\n");
scanf("%d", &L->last);
printf("请输入顺序表元素:\n");
for (int i = 0; i < L->last; i++)
{
scanf("%d", &L->data[i]);
}
for (int j = 1; j <= L->last; j++)
{
printf("arr[%d]=%d ",j-1,L->data[j-1]);
}
printf("\n");
printf("创建顺序表成功!");
return L;
}
求顺序表的长度:
顺序表结构类型成员last指向顺序表中的最后一个元素的下标位置,所以顺序表的长度为
L->last+1. (->的意思是引用结构类型中的成员)
int sequenlist_length(sequenlist*L)
{
return(L->last+1);
}
顺序表的插入运算:
int Insert_Sequenlist(Sequenlist*L,elemtype x,int i)
/*在顺序表指定位置插入值为x的结点*/
/*L是Sequenlist类型的指针变量*/
/*x是待插入结点的数据元素值,i是在顺序表中的插入位置*/
{
int j;/*定义一个j变量*/
if (L->last >= MAXSIZE - 1)/*检查顺序表是否已满*/
{
printf("顺序表已满\n");
return 0;
}
if (i<1 || i>L->last+2)/*检查插入位置是否合法*/
{
printf("插入元素顺序表范围超出\n");
return -1;
}
for (j = L->last; j >= i - 1; j--)
L->data[j + 1] = L->data[j];/*位置后移*/
L->data[i - 1] = x;/*将x的值赋到当前位置*/
L->last = L->last + 1;/*表长加1*/
return 1;
}
位置后移这步操作可能比较难懂,简单来讲就是你要在第i个位置插入元素,就要将i位置的元素赋给i+1位置,从后面依次往前,这里要画图来帮助理解。
顺序表的删除运算:
elemtype Delete_sequenlist(sequenlist* L, int i)/*顺序表的删除*/
{
int j = 0;
if (i < 1 || i > L->last + 1)
{
printf("这个元素不存在\n");
return 0;
}
else
for (j = i; j <= L->last; j++)
{
L->data[j - 1] = L->data[j];/*结点向前移*/
}
L->last--;/*顺序表长度减一*/
return 1;/*删除成功,函数返回1*/
}
顺序表的判空和判满运算:
elemtype Ifnull_SequenList(sequenlist* L) //判空
{
if (L->last == -1)
{
printf("顺序表为空\n");
}
else
{
printf("顺序表不为空\n");
}
return 0;
}
elemtype Iffull_SequenList(sequenlist* L)//判满
{
if (L->last >= MAXSIZE)
{
printf("顺序表已满\n");
}
else {
printf("顺序表未满\n");
}
return 0;
}
主函数:
ca
主函数可以运用switch语句分别去调用各个操作
int main() { sequenlist* L=NULL; int n = 0; int m = 1; int k = 1; while (k) { menu(); scanf("%d", &n); if (n <= 0 || n > 10) { k = 0; printf("请输入正确的选项\n"); } switch (n) { case 1: Init_sequenlist(); break; case 2: L=Create_sequenlist(); break; case 3: { int data = 0; /*data为插入元素*/ int position;/*position为插入位置*/ printf("请输入插入数据和位置\n"); scanf("%d %d", &data, &position); int success = Insert_sequenlist(L, data, position); if (success == 1) { for (position = 0; position < L->last; position++) { printf("%d ", L->data[position]); } printf("插入成功\n"); } printf("\n"); break; } case 4: {int a = 0; int b; int k; printf("请输入要删除元素的位置\n"); scanf("%d", &a); k = Delete_sequenlist(L, a); if (k == 1) { for (a = 0; a <L->last; a++) { printf("%d ", L->data[a]); } printf("\n "); } break; } case 5:Ifnull_SequenList(L); break; case 6:Iffull_SequenList(L); break; } } }
void menu() { printf("1.顺序表的初始化\n"); printf("\n"); printf("2.顺序表的创建\n"); printf("\n"); printf("3.插入运算\n"); printf("\n"); printf("4.删除运算\n"); printf("\n"); printf("5.取值运算\n"); printf("\n"); printf("6.判满运算\n"); printf("\n"); printf("7.顺序表长度\n"); printf("\n"); printf("请输入选项:"); }
上面的为菜单栏函数
数据结构顺序表的操作简单来说就是先将各个算法自定义函数先设置好,再用主函数去调用他,以上是我的个人理解,如有错误请多多包含指正谢谢!!!