顺序表:逻辑上连续,物理结构上也连续

实现一个具有“增、删(根据位置删除,根据元素删除)、查、初始化、输入、打印”等简单功能的顺序表:

源码:

头文件部分("sequence.h"):#define _CRT_SECURE_NO_WARNINGS 1#include 
     
      #include
      
       #define MAXSIZE 20typedef int ElemType;typedef struct{
       
ElemType data[MAXSIZE];
int last;}SeqList;void creat(SeqList *L);                               //创建顺序表int InsertSList(SeqList  *L, int i, int x);          //在i位置插入xint DeleteList(SeqList  *L, int i);                 //删除i位置的元素int GetData(SeqList *L, int  x);                          //查找值为x的下标int GetLength(SeqList *L);           //求顺便长度int InitSList(SeqList *L);       //初始化顺序表,释放整个顺表void output(SeqList * L);                 //打印整个顺序表void reverse_list(SeqList *L);        //反转整个顺序表void sortrank(SeqList *L);                  //对顺序表进行排序//封装函数部分("sequence.c"):#include"sequence.h"void creat(SeqList *L)                          //创建一个顺序表{
printf("请输入顺序表:\n");
for (int n = 0; n <= L->last; n++)
{
scanf("%d", &(L->data[n]));
}
printf("输入成功\n");}int InsertSList(SeqList  *L, int i, int x)         //将x插入到i位置上,成功返回1{
if ((i<1) || i>(L->last + 2))
return -1;
if ((L->last) == (MAXSIZE - 1))
return -1;
for (int n = L->last; n >= i - 1; n--)
L->data[n + 1] = L->data[n];
L->data[i - 1] = x;
L->last++;
return 1;}int DeleteList(SeqList  *L, int i)                     //删除i位置上的元素,成功返回1{
if ((i > L->last + 1) || (i < 1))
return -1;
if (L->last == -1)
return -1;
for (int n = i - 1; n  last; n++)
{
L->data[n] = L->data[n + 1];
}
L->last--;
return 1;}int GetData(SeqList *L, int  x)                      //查找x元素的所在的位置{
int i = 0;
if (L->last<0)
return -1;
while (i <= L->last)
{
if (L->data[i] == x)
return i + 1;
i++;
}
return -1;}int GetLength(SeqList *L)                           //求取表的长度{
return (L->last + 1);}int InitSList(SeqList *L)                          //初始化顺序表,将当前顺序表释放{
L->last = -1;
return 1;}void output(SeqList * L)                   //打印顺序表{
if (L->last==-1)
{
printf("请先创建顺序表\n");
}
else
{
for (int n = 0; n <= L->last; n++)
printf("%d  ", L->data[n]);
printf("\n");
}}void reverse_list(SeqList *L){
if (L->last == -1)
printf("请先创建顺序表\n");
else
{
ElemType *left = L->data;
ElemType *right = left + L->last;
while (left
{
ElemType tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
printf("逆序成功\n");
}}void sortrank(SeqList *L)                               //对顺序表进行排序{
ElemType tmp;
int i = 0;
int j = 0;
for (i = 0; i <= L->last; i++)
{
for (j = 0; j <(L->last - i); j++)
{
if (L->data[j]>L->data[j + 1])
{
tmp = L->data[j];
L->data[j] = L->data[j + 1];
L->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");}主函数部分:#include"sequence.h"int main(){
int m = 0;
int n = 0;
int i = 0;
int ret=0;
ElemType x;
SeqList L;
L.last = -1;
printf("***********************************************\n");
printf("***********************************************\n");
printf("********0.exit             1.Creat*************\n");
printf("********2.InsertSList      3.ListDelete********\n");
printf("********4.FindData         5.GetLength*********\n");
printf("********6.InitSList        7.output************\n");
printf("********8.ReverseList      9.Sortrank**********\n\n\n");
while (1)
{
printf("请选择功能:  ");
scanf("%d", &n);
switch (n)

 case 0:
 exit(1);
 break;
 case 1:
 while (1)
 {
 printf("请输入顺序表长度:");
 scanf("%d", &L.last);
 if (L.last < 1)
 printf("输入无效,请重新输入\n");
 else
 break;
 }
 L.last = L.last - 1;
 creat(&L);
 break;
 case 2:
 printf("请输入要插入的位置:  和要插入的元素:\n");
 scanf("%d%d", &i, &x);
 ret = InsertSList(&L, i, x);
 if (ret == 1)
 printf("插入成功\n");
 else
 printf("插入失败\n");
 break;
 case 3:
 printf("****1、位置删除   2、元素删除****\n");
 printf("请选择删除方式:");
 while (1)
 {
 scanf("%d", &m);
 if (m==1||m==2)
 break;
 else
 printf("选择无效,请重新选择\n");
 }
 switch (m)                                     //开始执行删除的方式
 {
 case 1:
 {
   printf("请输入要删除的位置:");
   scanf("%d", &i);
   ret = DeleteList(&L,i);
   break;
 }
 case 2:
 {
   int i = 0;
   printf("输入要删除的元素:");
   scanf("%d", &x);
   while (1)
   {
   i = GetData(&L, x);
   if (i ==-1)
   break;
   ret =DeleteList(&L, i);
   }
   break;
  }                                                        //删除结束
 }
 if (ret == 1)
 printf("删除成功\n");
 else
 printf("删除失败\n");
 break;
 case 4:
 printf("请输入要查找的元素:");
 scanf("%d",&x);
 ret=GetData(&L,x);
 if (ret==-1)
 printf("查询无果\n");
 else
 
         printf("查找成功:%d\n",ret);
 break;
 case 5:
 ret=GetLength(&L);
 printf("顺序表长度:%d\n", ret);
 break;
 case 6:
 InitSList(&L);
 printf("初始化成功\n");
 break;
 case 7:
 printf("打印顺序表:");
 output(&L);
 break;
 case 8:
 reverse_list(&L);
 break;
 case 9:
 sortrank(&L);
 break;
 default:
 printf("选择无效,请重新选择\n");
 break;
}
 ret = 0;
}
system("pause");
return 0;}