顺序表的相关操作和说明都放在代码里面了
/*顺序表的相关操作
* 2021-4-11
* 顺序的创建,查找,插入,删除,增加
* //TKOTW
*/
#include <stdio.h>
#include <stdlib.h>
#define Jnum 10 //静态创建,最大字符
typedef struct {
int data[Jnum];
int length;
}SQL; //定义静态顺序表结构体
/*初始化静态顺序表*/
void Jlistinit(SQL *sql) {
for (int i = 0; i < Jnum; i++) {
sql->data[i] = 0;
}
sql->length = 0;
}
//、、、、、、、、、、、、、、、、、、、、、
#define init 20
typedef struct {
int *data;
int MaxSize;
int length;
}SeqList; //动态顺序表结构体创建
/*初始化动态顺序表*/
void InitList(SeqList* L) {
L->data = (int*)malloc(init * sizeof(int)); //malloc函数,前面是要开辟的数据类型,后面是大小。一个int占的字符乘上最大值
L->length = 3;
for (int i = 0; i < L->length; i++) {
L->data[i] = 1;
}
L->MaxSize = init;
}
/*扩容操作*/
void IncreaseList(SeqList* L, int len) { //两个参数,第一个是顺序表指针,第二个是要增加的长度
int* p = L->data; //将表内数据移动的p里
L->data = (int*)malloc((init + len) * sizeof(int)); //扩容
int i = 0;
for (i = 0; i < L->length; i++) L->data[i] = p[i]; //把之前的值返回去
L->MaxSize = L->MaxSize + len; //最大的长度增加
free(p); //释放指针
}
/*插入操作*/
_Bool ListInsert(SeqList* L, int i, int e) { //c里面好像没布尔类型,这个是返回0为假,返回1为真
//i表示要插入的位序,是数组下标+1,e表示要插入的值
if(i<1|| i>L->length + 1) {
printf("超出所能查的位序");
return 0;
} //进行判断在范围之内
else if (L->length + 1 > L->MaxSize) {
printf("顺序表已达最大长度");
return 0;
} //进行判断顺序表长度够用
else for (int j = L->length; j >= i; j--)//减减式for循环
L->data[j] = L->data[j - 1]; //将i之后的每一个元素全都往后退一个
L->data[i - 1] = e;
L->length++;
return 1;
}
/*删除操作*/
_Bool ListDelete(SeqList* L, int i) { //i表示要删除的位序,是数组下标+1,e是工具人
if (i<1 || i>L->length ) {
return 0;
} //进行判断在范围之内
for (int j = i; j < L->length; j++)
L->data[j-1] = L->data[j];
L->length--;
return 1;
}//这边没有保留删除的值,有想法的可以尝试将删除的值保留下来
/*按值查找操作*/
int LocateElem(SeqList* L, int e) { //e是要查找的值
int i;
for (i = 0; i < L->length; i++) {
if (e == L->data[i]) {
return i+1; //输出第一个位序
}
}
printf("无");
return 0;
}//这里只能输出第一个查找值的位序,若是想输出所有查找值的位序,可以尝试改用void型函数,并且循环输出
/*按位查找操作*/
int GetElem(SeqList* L, int i) {
return L->data[i - 1];
}
/*输出顺序表*/
int input(SeqList* L) {
printf("顺序表:\n");
for (int i = 0; i < L->length; i++) {
printf("%d\n",L->data[i]);
}
}
int main() {
SQL l;
Jlistinit(&l);
for (int i = 0; i < Jnum; i++) {
printf("%d\n", l.data[i]);
}
//以上为静态顺序表
int h=1, f=1;
int k;
SeqList S;
InitList(&S);//初始化
input(&S);
while (1)
{
printf("请选择操作: 1.插入 2.删除 3.按值查找 4.按位查找 5.扩容 6,输出顺序表\n");
scanf_s("%d",&k); //由于版本原因不能使用scanf
switch (k)
{
case 1:
printf("请输入位序 值\n");
scanf_s("%d %d", &h, &f);
printf("执行操作插入:\n位序为 %d 数值为 %d\n", h, f);
ListInsert(&S, h, f);
input(&S);
break;
case 2:
printf("请输入位序\n");
scanf_s("%d", &h);
printf("执行操作删除:\n位序为 %d\n", h);
ListDelete(&S, h);
input(&S);
break;
case 3:
printf("请输入要查找的值\n");
scanf_s("%d", &h);
printf("执行操作按值查找:\n所查值为 %d\n", h);
printf("%d\n",LocateElem(&S, h));//int型,输出的是第一个位序
input(&S);
break;
case 4:
printf("请输入位序\n");
scanf_s("%d", &h);
printf("执行操作按位查找:\n位序为 %d\n", h);
printf("按位查找的值:%d",GetElem(&S, h));
break;
case 5:
printf("请输入扩容大小\n");
scanf_s("%d", &h);
printf("执行操作扩容:\n大小为 %d\n", h);
printf("【原】顺序表最大长度:%d\n", S.MaxSize);
IncreaseList(&S, h);
printf("顺序表最大长度:%d\n", S.MaxSize);
break;
case 6:
input(&S);
break;
default:
printf("没有该指令,请输入1到6!");
break;
}
}
return 0;
}
(个人总结,如有问题,还望指出)