目录
执行结果 :
1.定义结构体
typedef struct //定义结构体 { int data[MAXSIZE];//顺序表中元素 int len;//表长 }Seqlist;
因为顺序表是利用数组来存储的,所以对于定义顺序表的结构体,一共是两个内容:一个是定义一个数组data[MAXSIZE],数组大小为MAXSIZE,另一个是int类型的len,用来表示顺序表的长度。
2. 初始化顺序表
Seqlist* Init_Seqlist()//顺序表初始化 { Seqlist* L; L = (Seqlist*)malloc(sizeof(Seqlist)); L->len=0; return L; }
对顺序表进行初始化也是两个部分,首先对L申请动态空间,其次将L->len赋值为0。函数返回值是数组指针。
3.建立顺序表
void CreatList(Seqlist* L)//建立顺序表 { printf("请输入顺序表长度:"); scanf_s("%d", &L->len); printf("按顺序输入表元素"); for (int i = 1; i <= L->len; i++) { scanf_s("%d", &L->data[i]); } }
对于建立顺序表,我们首先确定要输入元素的个数,也就是L->len的长度,然后以L->len的长度做for循环,对L->data[i]进行赋值操作。
4.打印顺序表
void print(Seqlist* L)//打印顺序表 { for (int i = 1; i <= L->len; i++) { printf("%d ", L->data[i]); } printf("\n"); }
对于打印操作与建立顺序表相同, 以L->len的长度做for循环,对L->data[i]进行输出操作。
5.插入元素x
void Insert_Seqlist(Seqlist* L, int i, int x)//向表L中的第i个位置插入x { int j; if (L->len == MAXSIZE) { printf("表满"); } else { if (i<1 || i>L->len + 1) { printf("插入位置非法"); } else { for (j = L->len; j >= i; j--) { L->data[j + 1] = L->data[j]; } L->data[i] = x; L->len++; } } }
对于顺序表的插入操作,我们需要对函数传入三个值,分别为:待插入数组L, 插入位置i,插入内容x。对于函数内的内容,首先我们判断顺序表是否表满。如果不为满,则再进行插入位置是否合理的判断。因为表的存储容量是从1~L->len,所以再这范围之外的插入位置都为非法。如果插入位置合法,则进行下面的插入操作。将待插入位置以后包括待插入位置本身的元素往后移一位,为将要插入的元素空出位置,然后将元素插入待插入位置即可。
注:
1.在执行插入操作时,我们应该注意,应先将表尾的元素往后移,因为如果先移前面的元素的话,则会将后面的元素覆盖导致操作失败。
2.在插入结束之后不要忘记对表长执行L->len++操作。
6.删除元素i
void Delete_Seqlist(Seqlist* L, int i)//删除元素i { int j; if (L->len == 0) { printf("表空"); } else { if (i<1 || i>L->len) { printf("删除位置非法"); } else { for (j = i+1; j <= L->len; j++) { L->data[j-1] = L->data[j]; } L->len--; } } }
对于顺序表的删除操作,我们需要对函数传入两个值,分别为:待执行删除操作的数组L, 删除位置i。 对于函数内的内容,首先我们判断顺序表是否为空。如果不为空,则再进行删除位置是否合理的判断。因为表的存储容量是从1~L->len,所以再这范围之外的删除位置都为非法。如果删除位置合法,则进行下面的插入操作。将data[j]的值赋给data[j-1]即可。
注:
1.在执行删除操作时,我们应该注意,操作顺序与插入相反,实从待删除端开始往后执行。
2.在插入结束之后不要忘记对表长执行L->len--操作。
7.查找元素x的位置下标
int Location_Seqlist(Seqlist* L, int x)//查找元素x的位置下标 { int i=0; while (i < L->len && L->data[i] != x) { i++; } if (L->data[i] == x) { return i; } else { return 0; } }
对于查找元素x的位置下标操作,只需对数组data[i]进行遍历,如果找到x则返回其下标即可。
源代码:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef struct //定义结构体
{
int data[MAXSIZE];//顺序表中元素
int len;//表长
}Seqlist;
Seqlist* Init_Seqlist()//顺序表初始化
{
Seqlist* L;
L = (Seqlist*)malloc(sizeof(Seqlist));
L->len=0;
return L;
}
void CreatList(Seqlist* L)//建立顺序表
{
printf("请输入顺序表长度:");
scanf_s("%d", &L->len);
printf("按顺序输入表元素");
for (int i = 1; i <= L->len; i++)
{
scanf_s("%d", &L->data[i]);
}
}
void print(Seqlist* L)//打印顺序表
{
for (int i = 1; i <= L->len; i++)
{
printf("%d ", L->data[i]);
}
printf("\n");
}
void Insert_Seqlist(Seqlist* L, int i, int x)//向表L中的第i个位置插入x
{
int j;
if (L->len == MAXSIZE)
{
printf("表满");
}
else
{
if (i<1 || i>L->len + 1)
{
printf("插入位置非法");
}
else
{
for (j = L->len; j >= i; j--)
{
L->data[j + 1] = L->data[j];
}
L->data[i] = x;
L->len++;
}
}
}
void Delete_Seqlist(Seqlist* L, int i)//删除元素i
{
int j;
if (L->len == 0)
{
printf("表空");
}
else
{
if (i<1 || i>L->len)
{
printf("删除位置非法");
}
else
{
for (j = i+1; j <= L->len; j++)
{
L->data[j-1] = L->data[j];
}
L->len--;
}
}
}
int Location_Seqlist(Seqlist* L, int x)//查找元素x的位置下标
{
int i=0;
while (i < L->len && L->data[i] != x)
{
i++;
}
if (L->data[i] == x)
{
return i;
}
else
{
return 0;
}
}
int main()
{
Seqlist* s;
int i, x;
s = Init_Seqlist();
CreatList(s);
print(s);
printf("请输入要插入的位置和数值");
scanf_s("%d %d", &i, &x);
Insert_Seqlist(s, i, x);
print(s);
printf("请输入要删除的位置");
scanf_s("%d", &i);
Delete_Seqlist(s, i);
print(s);
printf("请输入要查找的元素");
scanf_s("%d", &x);
i = Location_Seqlist(s, x);
if (i == 0)
{
printf("表中无该元素");
}
else
{
printf("该元素的位置下标为:%d", i);
}
return 0;
}
执行结果 :