目录
本文章不添加判断用户输入错误的代码,纯粹讲解顺序表。
完整代码在最后面。
1,结构体:
typedef struct sqlist
{
int* arr;
int length;
}sqlist;
1.int* arr;定义指针数组,当然也可以定义为arr[10],静态开辟内存空间,定义为指针数组只是为了可以根据我们的需要分配空间大小,称为动态开辟内存空间,也就是创建函数里的L.arr = (int*)malloc(10 * sizeof(int));
2.int length;为表的长度,插入时表长度+1,删除时表长度-1。
2,创建函数:
void listcreat(sqlist& L)
{
L.arr = (int*)malloc(10 * sizeof(int));
int i;
printf("请输入创建的顺序表的长度");
scanf("%d", &L.length);
printf("请输入数字:");
for (i = 0; i < L.length; i++)
{
scanf("%d", &L.arr[i]);
}
printf("创建链表成功!\n");
}
1.sqlist& L;表示引用的意思,就是把sqlist取了一个名字叫L,后续就可以用L.什么什么去操作sqlist里的变量。
2.L.arr = (int*)malloc(10 * sizeof(int));10*代表开辟了十个int大小的内存空间。
3,插入函数:
void listinsert(sqlist& L)
{
int i, j, e;
printf("请输入需要插入的位置\n");
scanf("%d", &i);
printf("请输入需要插入的数\n");
scanf("%d", &e);
for (j = L.length - 1; j >= i - 1; j--)
{
L.arr[j + 1] = L.arr[j];
}
L.arr[i] = e;
L.length++;
printf("插入成功\n");
}
1.j=L.length-1;数组从最后一位依次往后移动。
2.j >= i-1;如果输入需要插入的位置是2,实际上是让1号位后面的数向后移,所以控制for循环的条件为j>=i-1。
3.L.arr[j+1]=L.arrlj];最后一个数先后移,最后一个数的前一个数移到最后一个数的原位置,以此类推,注意L.arr[j+1]=L.arr[j]的顺序是不可换的。
4.L.arr[i] = e;因为控制for循环的条件为j>=i-1,所以跳出for循环时的i就为我们需要插入的位置。
5.L.length++;表的长度+1。
4,删除函数:
void listdetel(sqlist& L)
{
int i, e;
printf("请输入需要删除的位置");
scanf("%d", &i);
int j;
if (i < 0 || i > L.length)
exit(1);
e = L.arr[i];
for (j = i + 1; j <= L.length; j++)
{
L.arr[j - 1] = L.arr[j];
}
L.length--;
printf("%d删除成功!\n", e);
}
1.j=i+1;如果数组为1 2 3 4 5,要删除的位置为2,也就是1号位,那就要把2号位移到1号位,后面的同理依次往前移动,所以j=i+1。
int e;记录删除的数。
2.L.arr[j - 1] = L.arr[j];需要删除的后一位数向前移动把需要删除的数覆盖掉,然后后面的数依次向前移动注意顺序L.arrlj-1]=L.arr[j]。
拿出草稿画一画。
3.最后表的长度-1。
接下来是查找函数与取值函数。
首先得了解两者的区别:
查找是输入一个数,输出对应的位置。
取值是输入一个位置,输出对应的数 。
核心都为用循环,把表里的每一个数都与输入的数进行比较,相等时输出结果。
5,查找函数:
void listsearch(sqlist& L)
{
int e;
int i;
printf("请输入需要查找位置的数:");
scanf("%d", &e);
for (i = 0; i <= L.length; i++)
{
if (e == L.arr[i])
printf("%d的位置为%d", e, i);
}
}
用表里的数依次和e比较,可与下面的取值函数进行对比。
6,取值函数:
void listget(sqlist& L)
{
int i, e;
printf("请输入需要取值数的位置:");
scanf("%d", &e);
for (i = 0; i < L.length; i++)
{
if (e == i)
printf("%d号位是%d", e, L.arr[i]);
}
}
用表里数的位置依次和e比较。可以注意到两者的区别就在e==L.arr[i],还是e==i,这也是查找和取值的主要区别。
7,输出函数:
void listinput(sqlist& L)
{
printf("顺序表里的元素有:\n");
int i;
for (i = 0; i < L.length; i++)
{
printf("%d ", L.arr[i]);
}
}
8,退出函数:
void listout(sqlist& L)
{
free(L.arr);
printf("退出成功!\n");
}
9,菜单函数:
void menu()
{
printf("\n****************************************************************\n");
printf("\n*********** 请输入你的选择 ***********\n");
printf("\n*********** 1 ---- 建表 ***********\n");
printf("\n*********** 2 ---- 插入 ***********\n");
printf("\n*********** 3 ---- 删除 ***********\n");
printf("\n*********** 4 ---- 查找 ***********\n");
printf("\n*********** 5 ---- 取值 ***********\n");
printf("\n*********** 6 ---- 输出顺序表 ***********\n");
printf("\n*********** 0 ---- 退出 ***********\n");
printf("\n****************************************************************\n");
}
10,主函数:
int main()
{
sqlist L;
while (1)
{
menu();
int choice, i, e;
scanf("%d", &choice);
switch (choice)
{
case 1:
listcreat(L);
break;
case 2:
listinsert(L);
break;
case 3:
listdetel(L);
break;
case 4:
listsearch(L);
break;
case 5:
listget(L);
break;
case 6:
listinput(L);
break;
case 0: listout(L);
break;
}
}
return 0;
}
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1//不用VS删除这一行
#include<stdio.h>
#include<stdlib.h>
typedef struct sqlist
{
int* arr;
int length;
}sqlist;
void menu()
{
printf("\n****************************************************************\n");
printf("\n*********** 请输入你的选择 ***********\n");
printf("\n*********** 1 ---- 建表 ***********\n");
printf("\n*********** 2 ---- 插入 ***********\n");
printf("\n*********** 3 ---- 删除 ***********\n");
printf("\n*********** 4 ---- 查找 ***********\n");
printf("\n*********** 5 ---- 取值 ***********\n");
printf("\n*********** 6 ---- 输出顺序表 ***********\n");
printf("\n*********** 0 ---- 退出 ***********\n");
printf("\n****************************************************************\n");
}
void listcreat(sqlist& L)
{
L.arr = (int*)malloc(10 * sizeof(int));
int i;
printf("请输入创建的顺序表的长度:");
scanf("%d", &L.length);
printf("请输入数字:");
for (i = 0; i < L.length; i++)
{
scanf("%d", &L.arr[i]);
}
printf("创建顺序表成功!\n");
}
void listinsert(sqlist& L)
{
int i;
printf("请输入需要插入的位置\n");
scanf("%d", &i);
if (i < 0 || i>L.length + 1)
{
printf("插入失败!\n");
exit(1);
}
int j;
int e;
printf("请输入需要插入的数\n");
scanf("%d", &e);
for (j = L.length - 1; j >= i - 1; j--)
{
L.arr[j + 1] = L.arr[j];
}
L.arr[i] = e;
L.length++;
printf("插入成功\n");
}
void listdetel(sqlist& L)
{
int i, e;
printf("请输入需要删除的位置");
scanf("%d", &i);
int j;
if (i < 0 || i > L.length)
exit(1);
e = L.arr[i];
for (j = i + 1; j <= L.length; j++)
{
L.arr[j - 1] = L.arr[j];
}
L.length--;
printf("%d删除成功!\n", e);
}
void listsearch(sqlist& L)
{
int e;
int i;
printf("请输入需要查找位置的数:");
scanf("%d", &e);
for (i = 0; i <= L.length; i++)
{
if (e == L.arr[i])
printf("%d的位置为%d", e, i);
}
}
void listget(sqlist& L)
{
int e;
int i;
printf("请输入需要取值数的位置:");
scanf("%d", &e);
if (e < 0 || e >= L.length)
{
printf("输入位置错误!");
exit(1);
}
for (i = 0; i < L.length; i++)
{
if (e == i)
printf("%d号位是%d", e, L.arr[i]);
}
}
void listinput(sqlist& L)
{
printf("顺序表里的元素有:\n");
int i;
for (i = 0; i < L.length; i++)
{
printf("%d ", L.arr[i]);
}
}
void listout(sqlist& L)
{
free(L.arr);
printf("退出成功!\n");
}
int main()
{
sqlist L;
while (1)
{
menu();
int choice, i, e;
scanf("%d", &choice);
switch (choice)
{
case 1:
listcreat(L);
break;
case 2:
listinsert(L);
break;
case 3:
listdetel(L);
break;
case 4:
listsearch(L);
break;
case 5:
listget(L);
break;
case 6:
listinput(L);
break;
case 0: listout(L);
break;
}
}
return 0;
}