#include<stdio.h>
#define MAXLEN 100 /*定义一个100的储量空间*/
typedef struct /*定义一个结构体类型,即顺序表储存类型*/
{
int array[MAXLEN]; /*存放顺序表的数组*/
int length; /*顺序表的长度*/
}SeqList;
/*顺序表的初试化*/
void InitList(SeqList *L)
{
//初试化顺序表的函数L
L->length = 0;
}
/*顺序表的建立*/
void CreateList(SeqList *L,int n)
{
//建立顺序表并输入多个元素函数
int i;
printf("请输入%d个整数:",n);
for (i = 0 ; i < n; i++)
{
scanf_s("%d",&L->array[i]);
}
L->length = i; /*顺序表的长度为i*/
}
/*顺序表的插入*/
int InsElem(SeqList* L, int i, int x) /* L代表存在,i代表表中的元素位置,x要插入的元素*/
{
/*在顺序表中第i个位置,插入元素x*/
int j;
if (L->length >= MAXLEN) //检查顺序表是否已满
{
printf("顺序表已满!");
return -1;
}
if (i<1 || i>L->length + 1) //检查插入位置的正确性,是否存在这个位置
{
printf("插入位置错误!");
return 0;
}
if (i == L->length + 1) //插入位置为表尾,直接插入,不用移动数组
{
L->array[i - 1] = x; //插入新元素
L->length++; //表长加1
return 1;
}
for (j = L->length - 1; j >= i - 1; j--) //插入位置不为表尾,插入点后各位置向后移
{
L->array[j + 1] = L->array[j];
}
L->array[i - 1] = x; //插入新元素
L->length++; //表长加1
return 1;
}
/*顺序表的删除*/
int DelElem(SeqList *L,int i,int *x) /* L代表存在,i代表表中的元素位置,x要删除的元素,即将要删除的元素给x*/
{
int j;
if (L->length == 0) //判断顺序表是否为空
{
printf("顺序表为空!");
return 0;
}
if (i<1 || i>L->length) //检查顺序表删除的位置是否正确
{
printf("不存在第i个元素!");
return 0;
}
*x = L->array[i - 1]; /*将要删除的元素给指针变量*x */
for (j = i; j < L->length; j++)
/*L->array[j] = L->array[j+1];*/ //这种写法是错误的,i+1的下标超界了
L->array[j-1] = L->array[j];
L->length--;
return 1;
}
/*顺序表的查找操作*/
int GetElem(SeqList* L, int i, int *x) //L顺序表存在, i表中元素的位置, x找到该元素并返回的值
{
//按位置查找
if (i<1 || i>L->length) //判断查找位置是否正确
{
return 0;
}
else
{
*x = L->array[i - 1]; //将表中第i个元素赋值给指针变量
return 1;
}
}
/*顺序表的查找操作*/
int Locate(SeqList* L, int x)
{
//按值查找
int i=0;
while (i < L->length && L->array[i] != x)
i++;
if (i >= L->length) //i大于表长返回失败
return 0;
else
return i + 1; // 返回元素的位置
}
void DispList(SeqList* L)
{
//显示顺序表中的每个元素
int i;
for (i = 0; i < L->length; i++)
{
printf("%4d",L->array[i]);
}
}
void Menu()
{
printf("\n\n1.建立顺序表");
printf("\n2.插入元素");
printf("\n3.删除元素");
printf("\n4.按位置查找元素");
printf("\n5.按值查找元素");
printf("\n6.求顺序表的长度");
printf("\n7.返回");
printf("请输入菜单号(1-7):");
}
int main()
{
SeqList L; /*定义一个顺序表*/
int x; //元素的值
int i; //线性表元素的位置
int ch2,ch1='y';
int n; //线性表的个数
int loc;
int a;
while (ch1 == 'y') {
Menu();
scanf_s("%d", &ch2);
getchar();
switch (ch2)
{
case 1:
InitList(&L);
printf("请输入建立线性表的个数:");
scanf_s("%d", &n);
CreateList(&L, n);
printf("建立的线性表为:");
DispList(&L);
break;
case 2:
printf("请输入要插入的位置:");
scanf_s("%d",&i);
printf("请输入要的元素:");
scanf_s("%d",&x);
if (InsElem(&L, i, x))
{
printf("已成功在第%d的位置上插入元素%d,插入后的线性表为:\n", i, x);
DispList(&L);
}
else
printf("插入的参数错误!");
break;
case 3:
printf("请输入要删除元素的位置:");
scanf_s("%d",&i);
if (DelElem(&L, i, &x))
{
printf("已成功在第%d的位置上删除%d,删除后的线性表为:\n", i, x);
DispList(&L);
}
else
printf("删除的参数错误!");
break;
case 4:
printf("请输入要查看的表中元素的位置(从1开始):");
scanf_s("%d",&i);
if (GetElem(&L, i, &x))
{
printf("当前线性表的第%d个位置是:%d", i, x);
}
else
printf("输入的位置错误!");
break;
case 5:
printf("请输入要查找的元素值为:");
scanf_s("%d",&x);
loc = Locate(&L, x);
if (loc)
{
printf("查找元素值为%d的位置为:%d",x,loc);
}
else
printf("表中无此元素!");
break;
case 6:
printf("当前线性表的长度为:%d",L.length);
break;
case 7:
ch1 = 'n';
break;
default:printf("请在1-7之间进行输入!");
}
}
return 0;
}
效果图: