顺序表的结构就是数组结构,基本操作比较简单。
结构如图
顺序表的增加,删除,查询,也是对不同下标的元素进行操作。
顺序表的增加:若顺序表在i位置增加,则将i以后的所以数组元素向后移动,将原来i位置的数值用增加数值代替。
顺序表的删除:若顺序表在i位置删除,则直接将i位置之后的所以元素向前移动,覆盖要删除的数组元素。
顺序表的查询:按照数组下标,对每一个下标的元素进行访问,直到找到需要查询的元素。
代码实现:(主函数增加了一个可供选择操作的清单)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 50
typedef struct sqlist
{
int data[N];
int lenght;
}Sqlist;
Sqlist L;
/**输出顺序表**/
void putSqlist()
{
int j;
printf("\n线性表为:\n");
for(j=0;j<L.lenght;j++)
{
printf(" %d ",L.data[j]);
}
}
/**创建线性表**/
void initlist()
{
int i;
L.lenght=0;
srand(time(NULL));
for(i=0; i<10; i++)
{
L.data[i]=0+rand()%100;//随机生成顺序表的元素数值
L.lenght++;
}
system("cls");
putSqlist();
system("pause");
}
/**判断线性表是否为空**/
int isEnpty()
{
if(L.lenght==0)//由顺序表的长度来对顺序表中是否为空进行判断
{
printf("\n该线性表为空!\n");
return 1;
}
else
{
system("cls");
printf("\n该线性表不为空!\n");
putSqlist();
system("pause");
return 0;
}
}
/**插入结点**/
int insItem(int i,int e)
{
int j=0;
if(i<0||i>N)
return -1;//如果插入位置小于0,或者超出数组范围,则插入不成功
if(i>L.lenght)//如果插入位置大于数组长度,则直接在数组最末尾进行插入
{
j=L.lenght;
L.data[j]=e;
L.lenght++;
}
else
{
for(j=L.lenght-1; j>=i-1; --j)//如果插入位置小于数组长度
{
L.data[j+1]=L.data[j];//将该位置之后的数都向后移动一位
}
L.data[i-1]=e;//用插入的元素数值代替原来数值
L.lenght++;
}
putSqlist();
return 1;
}
/**删除结点**/
int DleSqlist(int i)//i代表要查找的元素序号
{
int j=0;
if(i<L.lenght)//删除时,将i元素后面的元素全部向前移一位,直接将i覆盖
{
for(j=i; j<L.lenght; j++)
{
L.data[j-1]=L.data[j];
}
L.lenght--;//长度减一
}
if(i>L.lenght)//如果删除的元素序号大于顺序表长度,操作不能进行
{
printf("\n要删除的元素不存在!\n");
return -1;
}
putSqlist();
return 1;
}
/**查找结点**/
void seekSq1(int x)//x代表要查找的元素
{
int j=0;
int k=0;
while(j<L.lenght)
{
if(L.data[j]==x)
{
printf("\n该元素是第%d个元素\n",j+1);
}
j++;
}
if(j>L.lenght)
{
printf("\n元素不存在!\n");
}
}
/**查找结点的前后继**/
void seekSq2(int x)//查找前后继类似于查找结点,只不过找到对应节点后,输出前后继
{
int j=0;
int k=0;
while(j<L.lenght)
{
if(L.data[j]==x)
{
if(j>0)
{
printf("\n该元素的前驱是%d 后继为%d \n",L.data[j-1],L.data[j+1]);
break;
}
if(j=0)
{
printf("\n后继为%d \n",L.data[j+1]);
break;
}
}
j++;
}
if(j>=L.lenght)
{
printf("\n元素不存在!\n");
}
}
int main (void)
{
L.lenght=0;
int i,x,a;
while(1)
{
printf("\n请输入想要进行的操作\n");
printf("\n1、创建线性表\n");
printf("2、判断线性表是否为空\n");
printf("3、增加信息\n");
printf("4、删除信息\n");
printf("5、查找元素位置\n");
printf("6、查找元素前驱、后继\n");
printf("7、查询全部信息\n");
scanf("%d",&a);
switch (a)
{
case 1:
initlist();
break;
case 2:
isEnpty();
break;
case 3:
printf("请输入想要插入的位置\n");
scanf("%d",&i);
printf("请输入插入的元素\n");
scanf("%d",&x);
insItem(i,x);
break;
case 4:
printf("请输入想要删除的位置\n");
scanf("%d",&i);
DleSqlist(i);
break;
case 5:
printf("请输入想要查找的元素名称");
scanf("%d",&x);
seekSq1(x);
break;
case 6:
printf("请输入想要查找的元素名称");
scanf("%d",&x);
seekSq2(x);
break;
case 7:
printf("线性表为:\n");
putSqlist();
break;
default :
break;
}
}
printf("\n-----------------OVER-------------------\n");
return 0;
}
运行实现: