顺序存储方式存储线性表,完成基本操作包括插入,删除,查询等
#include<stdio.h> //头文件
#include<stdlib.h>
#define LIST_INIT_SIZE 100 //定义存储容量
#define LISTINCREMNET 10 //扩展存储容量
#define OVERFLOW 0 //允许溢出为0
/*定义顺序表的结构*/
typedef struct listonde //自定义顺序表结构为struct
{
int *elem; //整型存储空间基地址
int length; //表长(数据元素个数)
int listsize; //存储容量为整型
} sqlist;
void intlist (sqlist *la) //构造一个空的线性表函数
{
la->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)) ; //开辟一个线性表存储空间
if(!la->elem) //判断la.elem是否在线性表空间内
exit(OVERFLOW); //表示存储空间分配失败
la->length=0; //数据元素个数为0
la->listsize= LIST_INIT_SIZE; //存储容量定义为链表长度
}
void inputlist(sqlist *la) //输入线性表中的元素函数
{
int i=0; //定义elem中元素下表从0开始
int x;
scanf("%d",&x); //输入语句
while (x!=0) //当输入数据不等于0时给elem中的元素赋值为x
{
la->elem[i]=x;
i=i+1;
scanf("%d",&x); //输入语句
}
la->length=i; //数据元素个数为i
}
void outputlist (sqlist *la) //输出 线性表中的元素 函数
{
int i;
printf("\nthe list is:");
for(i=0;i<la->length;i++) //输出线性表元素的循环
printf("%3d",la->elem[i]);
printf("\nthe length of the list is:%d\n",la->length);
}
int locatelist(sqlist *la,int e) //查找e元素并返回它的位序数
{
int i;
for(i=0;i<la->length;i++)
{
if(la->elem[i]==e)
return i+1;
}
return 0;
}
void ListInsert_Sq(sqlist *la,int i,int e) //插入一个元素i的合法值为1<=i<= ListInser_Sq(L)+1
{
int *p,*q;
if(i<1||i>la->length+1)
printf("i is error!");
q=&(la->elem[i-1]);
for(p=&la->elem[la->length-1];p>=q;--p)
*(p+1)=*p;
*q=e;
++la->length;
}
void ListDelete_Sq(sqlist *la,int i,int *e) //删除一个元素 i的合法值为1<=i<= ListInser_Sq(L)+1
{
int *p,*q;
if((i<1)||(i>la->length))//注意逻辑运算的优先级别
printf("i is error!");
p=&la->elem[i-1];
*e=*p;
q=la->elem+la->length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--la->length;
}
int main()
{
sqlist L;
printf("请输入线性表元素的值,以0结束:\n");
intlist (&L);
inputlist(&L);
outputlist (&L);
printf("请输入要查找的元素的值:\n");
int e,i;
scanf("%d",&e);
i= locatelist (&L,e);
if(i)
printf("%d在线性表中的位序是:%d\n",e,i);
else
printf("线性表中不存在元素%d\n",e);
printf("请输入插入的位置和元素的值:\n");
scanf("%d%d",&i,&e);
ListInsert_Sq(&L,i,e) ;
outputlist (&L);
printf("请输入要删除的位置:\n");
scanf("%d",&i);
ListDelete_Sq(&L,i,&e);
printf("要删除的位置上的值为:%d\n",e);
return 0;
}