c_数据结构_顺序表
#define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define List_Increment 10 //线性表存储空间的分配增量 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ int *elem; //存储空间的基地址 int length; int listsize; //定义的一个大小 }SqList; //申请结构体变量SqList ,SqList作为类型可以声明新的结构体变量,如:SqList l,m[34],*n; //初始化 (构造空的线性表) InitList_Sq(SqList &L) { L.elem=(int *)malloc(LIST_INIT_SIZE * sizeof(int)); //存储空间的元素空间大小 if(!L.elem)exit(OVERFLOW); // 若没有表,则返回overflow L.length=0; L.listsize= LIST_INIT_SIZE; printf("------------------申请空间成功----------------\n"); return OK; } struct GetElem_Sq(SqList&L,int i, int &e){ //查找元素 printf("请输入查找位置:"); scanf("%d",&i); if(i<1 || i>L.length) { //判断查找元素是否在申请空间内 printf("元素不在空间位置内!!\n\n"); return ERROR; } e=L.elem[i-1]; // 逐个查找元素 printf("查找的元素为:%d\n\n",e); return OK; }; //在i位置插入元素 ListInsert_Sq(SqList&L,int i,int e){ int *p,*q; printf("请输入插入位置:"); scanf("%d",&i); printf("插入数据:"); scanf("%d",&e); if(i<1||i>L.length+1){ printf("插入位置不在顺序空间内!!!\n\n"); // 如果i值不合法(没有在申请空间内)则返回0 return ERROR; } if(L.length>=L.listsize){ //如果存储空间已满,则增加分配容量 int* newbase=(int*)realloc(L.elem,(L.listsize+List_Increment)*sizeof(int)); //再次申请空间 if(newbase==NULL) printf("存储空间分配失败\n\n"); //存储空间分配失败 L.elem=newbase; //新的基地址 L.listsize=L.listsize+List_Increment; //容量增加 } q=&L.elem[i-1]; //e元素在i处插入 for(p=&(L.elem[L.length-1]);p>=q;--p) //元素值整体后移 *(p+1)=*p; *q=e; //插入e元素 ++L.length; //表长加一 return OK; } ListDelete_Sq(SqList&L,int i,int &e){ // 删除列表中某个位置的元素 int *p,*q; printf("请选出删除元素位置:"); scanf("%d",&i); if(i<1 || i>L.length){ // 判断删除位置是否在存储空间内 printf("删除位置不在空间内!!!\n\n"); return ERROR; } p=&(L.elem[i-1]); //p为被删除的元素 e=*p; printf("删除值为:%d\n\n",e); q=L.elem+L.length-1; // 表长减一 for(++p;p<=q;p++) //删除元素后 后继元素整体前移 *(p-1)=*p; --L.length; return OK; } int creatnewlist(SqList &L) //创建列表 { int i,n; printf("\n\n请用户先存入数据\n\n请选择存入数据个数:"); scanf("%d",&n); while(n<=0){ printf("\n数据个数小于‘1’\n请重新存入数据个数:"); scanf("%d",&n); } printf("请输入%d个数据:\n",n); if(n>LIST_INIT_SIZE){ L.elem=(int *)realloc(L.elem,(n+List_Increment)*sizeof(int)); //再次申请空间 if(!L.elem)exit(OVERFLOW); //如果没有列表 则返回overflow 0 L.listsize=n+List_Increment; } for(i=0;i<n;i++) //将元素逐一写入列表 // printf("-----------\n"); scanf("%d",L.elem+i); L.length=n; return OK; } // 逐一打印列表中的元素 int pr(SqList &L){ int i; if(L.length<1){ printf("列表为空!!\n\n"); }else{ for(i=0;i<L.length;i++){ printf("表中元素第%d个元素为:%d\n\n",i,*(L.elem+i)); } } return OK; } void ClearList(SqList &L){ //释放已经申请的空间 free(L.elem); printf("释放空间成功!!\n\n"); InitList_Sq(L); //调用 InitList_Sq() 创建空的线性表 creatnewlist(L); //调用 createnewlist()建立新的列表 } void OperateMenu(){ //操作菜单 printf("--------------元素处理方式---------\n\n"); printf("0> 退出\n\n"); printf("1>: 查找给定位置的数据\n\n"); printf("2>: 插入元素\n\n"); printf("3>: 删除元素\n\n"); printf("4>: 打印元素\n\n"); printf("5>: 释放原列表,创建新列表\n\n"); printf("请选择对元素的处理:"); } void main(){ int i=1,e=0,k,boo=1,w=0; SqList L; //声明 printf("注:此测试过程输入值应全为数字\n\n"); printf("请用户选择存入数据或退出程序:\n\n"); printf("存入数据请输入:'1'\n\n"); printf("退出请选择'0'或 其它!!\n\n"); printf("请选择:"); scanf("%d",&w); if(w==1){ InitList_Sq(L); //调用 InitList_Sq() 创建空的线性表 creatnewlist(L); //调用 createnewlist()建立新的列表 OperateMenu(); //指令导向 scanf("%d",&k); while(k){ switch (k) { case 0:break; case 1:boo=GetElem_Sq(L,i,e); if(boo) printf("查询成功!!\n\n"); else printf("查询失败!!\n\n"); break; case 2:boo=ListInsert_Sq(L,i,e); if(boo) printf("插入成功!!\n\n"); else printf("插入失败!!\n\n"); break; case 3:boo=ListDelete_Sq(L,i,e); if(boo) printf("删除成功!!\n\n"); else printf("删除失败!!\n\n"); break; case 4:pr(L); break; case 5:ClearList(L);break; } OperateMenu(); scanf("%d",&k); } }else{ exit(OVERFLOW); } }