第一篇博客,以后继续努力!
//线性表的顺序存储结构
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配值
#define LISTINCREMENT 20 // 线性表存储空间的分配增量
typedef struct
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量
}SqList;
Status Init_SqList(SqList &L)
{//顺序线性表初始化
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW); //存储分配失败
L.length=0; //空表长度为0
L.listsize=LIST_INIT_SIZE; //初始存储容量
printf("初始化成功!请继续操作\n");
return OK;
}
Status Insert_SqList(SqList &L,int i,ElemType e)
{//顺序线性表的插入 在顺序线性表L中第i个位置之前插入新的元素
//i的合法值为1<=i<=ListLength.Sq(L)+1
int *newbase;
int *p;
int *q;
if(i<1||i>L.length+1) return ERROR;//i值不合法
if(L.length>=L.listsize)
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);//存储分配失败
L.elem=newbase; //新基址
L.listsize+=LISTINCREMENT; //增加存储容量
}
q=&(L.elem[i-1]); //q为插入位置
for(p=&(L.elem[L.length-1]);p>=q;--q)
*(p+1)=*p; //插入位置及之后的元素右移
*q=e; //插入e
L.length++; //表长增1
printf("插入成功!请继续操作\n");
return OK;
}
Status Delete_SqList(SqList &L,int i,ElemType &e)
{//在顺序线性表L中删除第i个元素,并用e返回其值
int *p,*q;
if(L.length==0)//线性表为空
{
printf("线性表为空!\n");
return ERROR;
}
else if(i<1||i>L.length)//i值不合法
{
printf("要删除的数据元素不存在!\n");
return ERROR;
}
p=&L.elem[i-1]; //p为被删除元素位置
e=*p; //被删除元素的值赋给e
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p) //被删除元素之后的元素左移
*(p-1)=*p;
L.length--; //表长减1
printf("删除成功!删除数据为:%d,请继续操作\n",e);
return OK;
}
Status Locate_Delete_SqList(SqList &L,ElemType x)
{//删除线性表L中值为x的第一个结点
int i,k;
for(i=0;i<L.length;i++)
{
if(L.elem[i]!=x)i++;
else
{
for(k=i;k<L.length;k++)
L.elem[k-1]=L.elem[k];
L.length--;
break;
}
}
if(i>=L.length)
{
printf("要删除的数据元素不存在!\n");
return ERROR;
}
else printf("删除成功!请继续操作\n");
return OK;
}
void Display_SqList(SqList L)
{//打印线性表L
if(L.length==0)printf("线性表为空!您可以向线性表中插入数据,请输入数字2\n");
else{
printf("线性表如下:\n");
for(int i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n打印结束!请继续操作\n");
}
}
void Enter()
{//功能
printf("1.顺序线性表初始化\n");
printf("2.在顺序线性表L中第i个位置之前插入新的元素\n");
printf("3.在顺序线性表L中删除第i个元素\n");
printf("4.删除线性表L中值为x的第一个结点\n");
printf("5.打印该线性表\n");
printf("6.在顺序线性表L中查找第1个值与e满足compare()的元素的位序\n");
}
int LocateElem_Sq(SqList L,ElemType e)
{//在顺序线性表L中查找第1个值与e满足compare()的元素的位序
//若找到则返回其在L中的位序,否则返回0
int i=1; //i的初值为第一个元素的位序
int *p=L.elem;
while(i<=L.length&&!(*p++==e))++i;
if(i>L.length) return ERROR;
else return i;
}
int main()
{
printf("请选择功能:");
Enter();
int n;
SqList L;
while(~(scanf("%d",&n)))
{
switch(n)
{
case 1: {
Init_SqList(L);
break;
}
case 2: {
printf("请输入插入位置和数据:");
int i,e;
scanf("%d%d",&i,&e);
Insert_SqList(L,i,e);
break;
}
case 3: {
printf("请输入要删除的位置:");
int j,e;
scanf("%d",&j);
Delete_SqList(L,j,e);
break;
}
case 4:{
printf("请输入要删除的值:");
int x;scanf("%d",&x);
Locate_Delete_SqList(L,x);
break;
}
case 5:{
Display_SqList(L);
break;
}
case 6:{
printf("请输入要查找的值:");
int e;scanf("%d",&e);
if(!LocateElem_Sq(L,e)) printf("未找到!");
printf("第1个值与e相同的元素的位序为:%d",LocateElem_Sq(L,e));
break;
}
}
}
return 0;
}