您的位置:首页 > 理论基础 > 数据结构算法

线性表的各种操作实现

2015-03-07 14:26 239 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息