线性表的各种操作实现

来源:互联网 发布:java调用接口传递参数 编辑:程序博客网 时间:2024/05/17 22:54

#include<cstdio>#include <cstdlib>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define MAX_SIZE 50#define INCREMENT_SIZE 10typedef 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;}

0 0