#include<cstdio>
#include <cstdlib>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAX_SIZE 50
#define INCREMENT_SIZE 10
typedef int ElemType;
typedef int Status;
typedef struct List
{
ElemType* elem;
int length;
int listsize;
}SqList;
//初始化顺序表
Status InitSqList(SqList* L)
{
L->elem=(ElemType*)malloc(sizeof(ElemType)*MAX_SIZE);
if(!L)
{
printf("内存分配失败!\n");
exit(ERROR);
}
L->length=0;
L->listsize=MAX_SIZE;
return OK;
}
//销毁顺序表
Status DestroySqlist(SqList* L)
{
if(!L)
{
printf("线性表不能为空!\n");
return ERROR;
}
free(L->elem);
L->elem=NULL;
return OK;
}
//清空顺序表
Status ClearSqlist(SqList* L)
{
if(L->length==0)
{
printf("线性表为空!\n");
return ERROR;
}
L->length=0;
return OK;
}
//是否为空
Status IsEmpty(SqList* L)
{
if(L->length==0)
{
return TRUE;
}
else
{
return FALSE;
}
}
//获得顺序表长度
Status SqListLength(SqList* L)
{
if(IsEmpty(L))
{
printf("顺序表为空\n");
return 0;
}
else
{
return L->length;
}
}
//依据位置查询元数值
Status GetElem(SqList* L,int i,ElemType* e)
{
if(i<1||i>L->length)
{
printf("输入的 i=%d值有误,该表只有 %d 个元数,请确认后重试!\n",i,L->length);
return ERROR;
}
*e=L->elem[i-1];
return OK;
}
//修改或插入元数在 i位置
Status SqListInsert(SqList* L,int i,ElemType e)
{
ElemType* nptr=NULL;
ElemType* p=NULL;
if(i<1||i>L->listsize)
{
printf("输入的 i=%d值有误,该表只有 %d 个元数,请确认后重试!\n",i,L->length);
return ERROR;
}
if(L->length>=L->listsize)
{
if(!(nptr=(ElemType*)realloc(L->elem,(L->length+INCREMENT_SIZE)*sizeof(ElemType))))
{
printf("内存分配失败!\n");
exit(ERROR);
}
L->elem=nptr;
L->length+=INCREMENT_SIZE;
}
for(p=(L->elem+L->length-1);p>=&L->elem[i-1];p--)
{
*(p+1)=*p;
}
L->elem[i-1]=e;
(L->length)++;
return OK;
}
//删除 i前面的元数
Status SqListDelete(SqList* L,int i,ElemType* e)
{
ElemType* nptr=NULL;
ElemType* p=NULL;
if(i<1||i>L->listsize)
{
printf("输入的 i=%d值有误,该表只有 %d 个元数,请确认后重试!\n",i,L->length);
return ERROR;
}
*e=L->elem[i-1];
for(p=&(L->elem[i-1]);p<(L->elem+L->length);p++)
{
*p=*(p+1);
}
(L->length)--;
return OK;
}
//返回 e 的前驱
Status PriorElem(SqList* L,ElemType cur_e,ElemType* pre_e)
{
int i=2;
ElemType* ptemp;
ptemp=&(L->elem[2]);
while(ptemp++<(L->elem+L->length))
{
if(cur_e==*ptemp)
{
*pre_e=*(--ptemp);
return TRUE;
}
}
printf("元数: %d 不存在或者它没有前驱!\n",cur_e);
return FALSE;
}
//返回 e 的后继
Status NextElem(SqList* L,ElemType cur_e,ElemType* next_e)
{
int i=0;
while((i)<L->length-1)
{
if(cur_e==(L->elem[i]))
{
*next_e=(L->elem[i+1]);
return TRUE;
}
i++;
}
printf("元数: %d 不存在或者它没有后继!\n",cur_e);
return FALSE;
}
//是否相等
int Equal(ElemType a,ElemType b)
{
return a==b;
}
//判断元数位置函数
Status LocateElem(SqList* L,ElemType e,Status(*Compre)(ElemType,ElemType))
{
int i=0;
ElemType* pstr=NULL;
pstr=L->elem;
while((i++)<L->length && !(*Compre)(*(pstr++),e));
if(i<=L->length)
{
return i;
}
else
{
return FALSE;
}
}
//打印函数
Status Put(ElemType e)
{
printf(" %d ",e);
return OK;
}
//元数遍历函数
Status SqListTraverse(SqList* L,Status(*Fun)(ElemType))
{
ElemType* pstr=NULL;
pstr=L->elem;
printf("\n该表的元数依次为:\n");
while(pstr<(L->elem+L->length))
{
Fun(*(pstr++));
}
printf("\n");
return OK;
}
//主界面函数
int LoopCommand(SqList* L)
{
char com;
ElemType cur_e=0;
ElemType pre_e=0;
ElemType g_e=0;
int flag=TRUE;
int Flag=TRUE;
ElemType i=0;
ElemType e=0;
//system("cls");
printf("\n *********请选择功能代号*********\n");
printf("\n 1-显示表信息 5-查询元数值\n");
printf("\n 2-插入元数 6-查询元数位置\n");
printf("\n 3-删除元数 7-列举前驱\n");
printf("\n 4-清空表 8-列举后继\n");
printf("\n *****其他任意键退出***** \n");
fflush(stdin);
com=getchar();
switch(com)
{
case '1':
if(L->length==0)
{
printf("这还是一个空表哦亲!添加点元数吧!\n");
}
else
{
SqListTraverse(L,Put);
}
break;
case '2':
while(flag)
{
printf("请输入要插入的位置i,元数值e:i,e!\n");
scanf("%d,%d",&i,&e);
SqListInsert(L,i,e);
printf("元数:%d 已插入!\n",e);
printf("继续添加请按 1,退出请按 0 !\n");
scanf("%d",&flag);
}
break;
case '3':
while(flag)
{
printf("请输入要删除的位置:i!\n");
scanf("%d,%d",&i,&e);
if(SqListDelete(L,i,&e))
{
printf("元数:%d 已删除!\n",e);
printf("继续删除请按 1,退出请按 0 !\n");
}
scanf("%d",&flag);
}
break;
case '4':
ClearSqlist(L);
break;
case '5':
printf("请输入要查询的位置:!\n");
scanf("%d",&i);
if(GetElem(L,i,&g_e))
{
printf("查询成功,位置 %d的值为:%d!\n",i,g_e);
}
break;
case '6':
printf("请输入要查询的元数:!\n");
scanf("%d",&g_e);
if(e=LocateElem(L,g_e,Equal))
{
printf("查询成功,元数 %d的位置为:%d!\n",g_e,e);
}
else
{
printf("查询失败,该元数不存在!\n");
}
break;
case '7':
printf("请输入要查询前驱的元素:!\n");
scanf("%d",&cur_e);
if(PriorElem(L,cur_e,&pre_e))
{
printf("查询成功,元数 %d的前驱为:%d!\n",cur_e,pre_e);
}
break;
case '8':
printf("请输入要查询后继的元素:!\n");
scanf("%d",&cur_e);
if(NextElem(L,cur_e,&pre_e))
{
printf("查询成功,元数 %d的后继为:%d!\n",cur_e,pre_e);
}
break;
default :
Flag=FALSE;
break;
}
return Flag;
}
//主函数
int main()
{
int i=1;
SqList L;
InitSqList(&L);
//循环初始化
for(;i<13;i++)
{
SqListInsert(&L,i,i);
}
while(LoopCommand(&L));
DestroySqlist(&L);
return 0;
}
线性表的各种操作实现
最新推荐文章于 2024-03-21 15:24:18 发布