实验一 顺序表
顺序表:在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
数组:把具有相同数据类型的若干变量按有序的形式组织起来,以便于程序处理,这些数据元素的集合就是数组。
从顺序表的定义来看,它和数组确实有很大的联系。首先,它是以数组的形式来保存的,其次,它和数组一样都是存储的元素物理地址相邻,具有很大的相似性。
#include <stdio.h>
#include <malloc.h>
#define ERROR 0
#define OK 1
#define INIT_SIZE 5 /*初始分配的顺序表长度*/
#define INCREM 5 /*溢出时,顺序表长度的增量*/
typedef int ElemType; /*定义表元素的类型*/
typedef struct Sqlist
{
ElemType *slist; /*存储空间的基地址*/
int length; /*顺序表的当前长度*/
int listsize; /*当前分配的存储空间*/
} Sqlist;
int InitList_sq(Sqlist *L); /*线性表的初始化*/
int CreateList_sq(Sqlist *L, int n); /*构造一个长度为n顺序表*/
int ListInsert_sq(Sqlist *L, int i, ElemType e); /*在表的第i个位置前插入一个元素e*/
int PrintList_sq(Sqlist *L); /*输出顺序表的元素*/
int ListDelete_sq(Sqlist *L, int i); /*删除第i个元素*/
int ListLocatevalue(Sqlist *L, ElemType e); /*查找值为e的元素*/
int ListLocatenumber(Sqlist *L, int i); /*查找序号为i的元素的值*/
int InitList_sq(Sqlist *L) /*线性表的初始化*/
{
L->slist = (ElemType *)malloc(INIT_SIZE * sizeof(ElemType));
if (!L->slist)
return ERROR; //存储分配失败退出
L->length = 0; //空表长度为0
L->listsize = INIT_SIZE;
return OK;
} /*InitList*/
int CreateList_sq(Sqlist *L, int n) /*构造一个长度为n顺序表*/
{
ElemType e;
int i;
for (i = 0; i < n; i++)
{
printf("输入数据第%d个数据:", i + 1);
scanf("%d", &e);
if (!ListInsert_sq(L, i + 1, e))
return ERROR;
}
return OK;
} /*CreateList*/
int PrintList_sq(Sqlist *L) /*输出顺序表的元素*/
{
int i;
for (i = 1; i <= L->length; i++)
printf("%5d", L->slist[i - 1]);
return OK;
} /*PrintList*/
int ListInsert_sq(Sqlist *L, int i, ElemType e) /*在表的第i个位置前插入一个元素e*/
{
int k;
if (i < 1 || i > L->length + 1) //i值不合法
return ERROR;
if (L->length >= L->listsize) //当前存储空间已满,增加分配
{
L->slist = (ElemType *)realloc(L->slist, (INIT_SIZE + INCREM) * sizeof(ElemType));
if (!L->slist)
return ERROR;
L->listsize += INCREM;
}
for (k = L->length - 1; k >= i - 1; k--) //元素后移
{
L->slist[k + 1] = L->slist[k];
}
L->slist[i - 1] = e; //在第i个位置上插入元素e
L->length++; //表长加1
return OK;
} /*ListInsert*/
int ListDelete_sq(Sqlist *L, int i) /*在顺序表中删除第i个元素*/
{
int j;
//在顺序表L中删除第i个元素,并用e返回其值
//i值的合法范围是1<=i<=L.length
if ((i < 1) || (i > L->length))
return ERROR; //i值不合法
for (int j = i; j <= L->length; j++) //元素后移
L->slist[j - 1] = L->slist[j]; //被删除元素之后的元素前移
--L->length; //表长减1
return OK;
}
/*在顺序表中查找指定值元素,返回其序号*/
int ListLocatevalue(Sqlist *L, ElemType e) /*查找值为e的元素*/
{
//顺序表的查找
for (int i = 0; i <= L->length; i++)
{
if (L->slist[i - 1] == e)
{
printf("%d", i);
// return i + 1//查找成功,返回序号i+1
}
else if (i > L->length)
{
printf("无此数据或查找失败!");
// return 0; //查找失败,返回0
}
}
}
int ListLocatenumber(Sqlist *L, int i) /*查找序号为i的元素*/
{
int e;
for (int j = 0; j <= L->length; j++)
if (j == i - 1)
{
e = L->slist[j];
printf("%d", e);
// return e; //查找成功,返回e
}
else if (i > L->length)
{
printf("无此数据或查找失败!");
// return 0; //查找失败,返回0
}
// return 0; //查找失败,返回0
}
int main()
{
Sqlist sl;
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\n");
int n = 0; //元素数量
int i = 0; //序号
int e; //元素值
int m, k; //插入时的序号和数据
int j; //删除的值的序号
int choose = -1; //选择
while (choose != 0)
{
printf("\n请输入要操作的选项编号:");
scanf("%d", &choose); //检测输入的choose
switch (choose)
{
case 1: //创建顺序表
printf("第一个功能:建立顺序表");
printf("1-输入顺序表的元素个数n:"); /*输入顺序表的元素个数*/
scanf("%d", &n);
if (n > 0)
{
printf("成功创建一个元素数量为%d的顺序表!\n", n);
}
else
{
printf("\n输入的数量数值有问题,请重新进入选项输入。");
break;
}
break;
case 2: //顺序表信息输入
printf("第二个功能:输入顺序表的值");
if (n > 0)
{
printf("1-您创建的顺序表可以储存%d个数据!\n", n);
printf("2-请输入顺序表的数据:\n");
InitList_sq(&sl); /*线性表的初始化*/
CreateList_sq(&sl, n); /*构造一个长度为n顺序表,这里会输入数据*/
printf("3-您输入的顺序表元素如下:\n");
PrintList_sq(&sl); //输出顺序表的元素
}
break;
case 3: //使用序号查询顺序表
printf("第三个功能:使用序号查询顺序表");
printf("1-请输入一个序号用来查找值:");
scanf("%d", &i);
if (i > 0)
{
printf("2-您查找的序号的值为:");
ListLocatenumber(&sl, i);
}
else
{
printf("\n输入的数值有问题,请重新进入选项输入。\n");
}
break;
case 4: //使用值查询顺序表
printf("第四个功能:使用值查询顺序表");
printf("1-请输入一个值用来查找序号::\n");
scanf("%d", &e);
if (e != ' ')
{
printf("2-您查找的值的序号为:");
ListLocatevalue(&sl, e);
}
else
{
printf("\n输入的数值有问题,请重新进入选项输入。\n");
}
break;
case 5: //顺序表的插入
printf("第五个功能:插入值到顺序表");
printf("1-您的顺序表如下:\n");
PrintList_sq(&sl); //输出顺序表的元素
printf("\n2-请输入插入的位置和数据:\n");
printf("位置,数据\n");
scanf("%d,%d", &m, &k);
ListInsert_sq(&sl, m, k);
printf("3-您的新的顺序表如下:\n");
PrintList_sq(&sl); //输出顺序表的元素
break;
case 6: //顺序表的删除
printf("第六个功能:从顺序表中删除值");
printf("1-您的顺序表如下:\n");
PrintList_sq(&sl); //输出顺序表的元素
printf("\n2-请输入删除的值的位置:");
scanf("%d", &j);
ListDelete_sq(&sl, j);
printf("\n3-您的新的顺序表如下:\n");
PrintList_sq(&sl); //输出顺序表的元素
break;
case 7: //顺序表的输出
printf("第七个功能:顺序表的输出");
printf("1-您的顺序表如下:\n");
PrintList_sq(&sl); //输出顺序表的元素
break;
}
}
}
用于教学作用,优化于此博主https://blog.csdn.net/weixin_30719711/article/details/98868048
至于代码根源,并未追溯。