引言
定义
顺序表是线性表的顺序存储结构。形如A_1 、A_2…….A_n的表,这个表的大小为N;并且,我们称大小为0的表为空表。
原理
<1> 其实顺序表的实现就是简单的数组实现,对表的所有操作都是通过使用数组来实现的。
<2> 顺序表中的第一个元素只有一个后继节点,最后一个元素只有一个前驱节点,中间元素均只有一个前驱节点和一个后继节点。
实现过程及结果
C语言实现顺序表的所有函数操作。
代码
#include<stdio.h>
#include<stdlib.h>
//宏定义
#define MAXSIZE 50
#define ERROR 0
typedef int Elemtype;
typedef struct
{
Elemtype x[MAXSIZE];
int length;
}sqlist;
//顺序表的初始化、增删查改以及输出操作函数的声明
void Initlist(sqlist *L);
void Outlist(sqlist *L);
void Insertlist(sqlist *L,int i,Elemtype e);
void Deletelist(sqlist *L,int i);
void Foundlist(sqlist *L,Elemtype e);
void Amendlist(sqlist *L,int i,Elemtype e);
//主函数
void main()
{
Elemtype e;
int i;
char ch;
sqlist a;
int t;
printf(" 《 Welcome to use the founction 》\n");
printf(" The founction can offer following service\n");
printf(" *******Please first Initlist*******\n\n");
printf(" 1、Initlist ->初始化线性表\n");
//初始条件:顺序表已存在
printf(" 2、Insertlist ->插入操作\n");
printf(" 3、Deletelist ->删除操作\n");
printf(" 4、Foundlist ->查找操作\n");
printf(" 5、Amendlist ->更改操作\n");
printf(" 0、Exitlist ->退出操作\n\n\n");
do
{
printf("Enter your choice:");
scanf("%d",&t);
switch(t)
{
case 1:
{
Initlist(&a);
Outlist(&a);
}break;
case 2:
{
printf("Enter Insert data:");
scanf("%d",&e);
printf("Enter the position of Insert:");
scanf("%d",&i);
Insertlist(&a,i,e);
Outlist(&a);
}break;
case 3:
{
printf("Enter the position of Delete:");
scanf("%d",&i);
Deletelist(&a,i);
Outlist(&a);
}break;
case 4:
{
printf("Enter Found data:");
scanf("%d",&e);
Foundlist(&a,e);
}break;
case 5:
{
printf("Enter the position of amend:");
scanf("%d",&i);
printf("Enter data of amending:");
scanf("%d",&e);
Amendlist(&a,i,e);
Outlist(&a);
}break;
case 0:
{
ch = getchar();
}break;
}
}while(t!=0);
ch = getchar();
}
//初始化操作
void Initlist(sqlist *L)
{
int i;
printf("Enter the length of the List: ");
scanf("%d",&L->length);
printf("\n");
for(i=0;i<L->length;i++)
{
printf("Data %d:",i+1);
scanf("%d",&L->x[i]);
printf("\n");
}
}
//输出操作
void Outlist(sqlist *L)
{
int i;
printf("Output current List:");
for(i=0;i<L->length;i++)
{
if(i<L->length-1)
{
printf("%d ->",L->x[i]);
}
else
{
printf("%d ",L->x[i]);
}
}
printf("\n");
}
//插入操作
void Insertlist(sqlist *L,int i,Elemtype e)
{
int j;
if(L->length==MAXSIZE)
{
printf("List full!!!!!!\n");
exit(0);
}
if(i<0||i>L->length+1)
{
printf("The position is illegal!!!!!!\n");
exit(0);
}
for(j = L->length-1;j>=i;j--)
{
L->x[j+1]=L->x[j];
}
L->x[i]=e;
L->length++;
}
//删除操作
void Deletelist(sqlist *L,int i)
{
int j;
if(L->length==0)
{
printf("List empty!!!!!!\n");
exit(0);
}
if(i<0||i>L->length+1)
{
printf("The position is illegal!!!!!!\n");
exit(0);
}
for(j = i+1;j<L->length;j++)
{
L->x[j-1]=L->x[j];
}
L->length--;
}
//查找操作
void Foundlist(sqlist *L,Elemtype e)
{
int j;
for(j=0;j<L->length;j++)
{
if(L->x[j] == e)
printf("The element you're looking for is in the %d position\n",j+1);
}
}
//修改操作
void Amendlist(sqlist *L,int i,Elemtype e)
{
if(L->length==0)
{
printf("List empty!!!!!!\n");
exit(0);
}
if(i<0||i>L->length+1)
{
printf("The position is illegal!!!!!!\n");
exit(0);
}
L->x[i] = e;
}
运行结果
总结
<1> 虽然数组是动态指定的,但是还是需要把表的大小的最大值进行估计。估计的与实际的偏差,也就是所造成的空间浪费。
<2> 倘若表中数据过大,插入和删除操作的时间花费有点昂贵。
上述所谓的空间和时间开销,可以通过线性表的链式存储结构来避免。