数据结构(C语言版),严蔚敏,吴伟明著。
线性表的顺序表示,C语言实现:
文件目录结构:
Define.h源码:
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define Status int #define LIST_INIT_SIZE 12 #define LISTINCREMENT 10
SqList.h源码:
#include "Define.h" #define ElemType int typedef struct{ ElemType* elem; int length; int listsize; }SqList; void SqListt_Menu(); Status InitList_SqList(SqList * L); //初始化线性表 Status ListInsert_Sq(SqList * L, int i, ElemType e);//将e插入L中,插入位置为i Status compare(ElemType p, ElemType e);//比较函数 int LocateElem_Sq(SqList *L, ElemType *e, Status(*compare)(ElemType,ElemType));//获取指定元素下标 Status ListDelete_Sq(SqList* L, int i, ElemType *e);//删除L中位置为i的元素 void MergeList_Sq(SqList La, SqList Lb, SqList *Lc);//合并La,Lb放入Lc中 Status DestroyList(SqList *L);//销毁线性表
SqList.c源码:
#include "SqList.h" #include "stdio.h" #include "stdlib.h" /*初始化顺序表 * 初始长度为12 */ Status InitList_SqList(SqList * L){ //初始化线性表 L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); //分配空间,初始化空间为12 if(!L->elem) //判断是否分配成功 exit(OVERFLOW); L->length = 0; //空表长度为0 L->listsize = LIST_INIT_SIZE; //初始化存储容量 return OK; } /*在线性表第i个位置插入元素e * */ Status ListInsert_Sq(SqList * L, int i, ElemType e){ int p = i - 1; //p为元素移动起始位 int q = (L->length) - 1;//q为元素移动终止位 if(i < 1 || i > L->length + 1){//判断插入位是否合法。 printf("插入位不合法 "); return ERROR; } if(L->length >= L->listsize){//当前存储空间已满,增加分配 ElemType * newbase; newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));//分配增量为10(LISTINCREMENT) if(!newbase){ printf("分配失败 "); exit(OVERFLOW); } L->elem = newbase;//增加分配后的新地址 L->listsize += LISTINCREMENT;//更新存储容量 } for(; q >= p; --q)//将插入位置及以后的元素右移 L->elem[q + 1] = L->elem[q]; L->elem[p] = e;//插入e ++L->length;//表长加1 return OK; } /*比较函数 * */ Status compare(ElemType p, ElemType e){ if(p == e) return TRUE; else return FALSE; } /*在线性表L中查找第一个满足computer()的元素的位置 *如果找到,则返回对应位置,反之返回0。 */ int LocateElem_Sq(SqList *L, ElemType *e, Status(*compare)(ElemType,ElemType)){ int i = 1; while(i <= L->length && !(*compare)(L->elem[i - 1], *e)) ++i;//遍历L中的元素,并判断是否符合条件 if(i <= L->length) //判断是否超出范围 return i; else return 0; } /*在线性表L中删除第i个元素,并用e返回其值。 * */ Status ListDelete_Sq(SqList* L, int i, ElemType *e){ int p = i - 1, q = L->length - 1;//i为插入位置从1开始,p为顺序表实际插入位置0开始 if(i < 1 || i > L->length) //q为顺序表中最后一个元素的下标。 return ERROR; *e = L->elem[i-1];//将需要删除的元素用e返回 for(; p < q; p++)//将第i个元素之后的元素右移一位。 L->elem[p] = L->elem[p + 1]; --L->length;//表长减1 return OK; } /*已知La,Lb按递增排列 *合并La,Lb放入Lc中,Lc也按递增排列。 */ void MergeList_Sq(SqList La, SqList Lb, SqList *Lc){ ElemType *pa = La.elem, *pb = Lb.elem, *pc;//pa,pb存放顺序表起始地址,用于遍历元素 ElemType *pa_last, *pb_last;//用于存放顺序表最后一个元素地址 pa = La.elem; pb = Lb.elem; Lc->listsize = Lc->length = La.length + Lb.length;//将Lc的存储容量设置为La和Lb当前长度之和 pc = Lc->elem = (ElemType *)malloc(Lc->length * sizeof(ElemType));//为Lc->elem分配空间 if(!Lc->elem)//存储分配失败则退出 exit(OVERFLOW); pa_last = La.elem + La.length - 1;//pa_last为顺序表中最后一个元素的地址 pb_last = Lb.elem + Lb.length - 1; while(pa <= pa_last && pb <= pb_last){ if(*pa <= * pb) //将La,Lb中的元素按递增排列插入Lc中 *pc++ = *pa++; else *pc++ = *pb++; } while(pa <= pa_last)//将剩余未插入的元素插入Lc中 *pc++ = *pa++; while(pb <= pb_last) *pc++ = *pb++; } Status DestroyList(SqList *L){ if(L){ free(L->elem); return OK; }else return ERROR; }
Main.c源码
#include "stdio.h" #include "stdlib.h" #include "SqList.h" #define MenuFun 6 void SqList_Menu(); int main(){ SqList_Menu(); return 0; } void SqList_Menu(){ int temp = -1;//第二组数据赋值使用 SqList L, La, Lb, Lc; int input; int i; ElemType e; printf("--------------数据结构-------------- "); printf("1.初始化线性表,初始长度为12. "); printf("2.在线性表第i个位置插入元素e "); printf("3.删除第i个元素 "); printf("4.查找第一个满足computer()的元素的位置 "); printf("5.合并La、Lb,放入Lc中 "); printf("6.销毁顺序表"); printf("------------------------------------ "); printf("请输入序号选择功能 "); scanf("%d", &input); for(;!CheckInput(input,CheckInit(input));){ scanf("%d", &input); } for(;;){ switch(input){ case 1:if(InitList_SqList(&L) && InitList_SqList(&La) && InitList_SqList(&Lb)){ /*/第一组初值 for(i = 1; i <= 12; i++){ ListInsert_Sq(&L,i,i); ListInsert_Sq(&La,i,i); ListInsert_Sq(&Lb,i,i); } //*/ //第二组初值 for(i = 1; i <= 12; i++) ListInsert_Sq(&L, i, (i*i+1)/2); for(i = 1; i <= 12; i++) ListInsert_Sq(&La,i,temp+=2); temp = 0; for(i = 1; i <= 12; i++) ListInsert_Sq(&Lb,i,temp+=2); //*/ printf("初始化成功 "); printf("分配初始值... "); printf("L :"); for(i = 0; i < L.length; i++) printf("%d ", L.elem[i]); putchar(' '); printf("La:"); for(i = 0; i < La.length; i++) printf("%d ", La.elem[i]); putchar(' '); printf("Lb:"); for(i = 0; i < Lb.length; i++) printf("%d ", Lb.elem[i]); putchar(' '); putchar(' '); }else printf("初始化失败 "); break; case 2:printf("插入前的线性表:"); for(i = 0; i < L.length; i++) printf("%d ",L.elem[i]); putchar(' '); printf("请输入插入位置(i)及插入元素(e)"); scanf("%d %d", &i, &e); if(ListInsert_Sq(&L, i, e) == OK) printf("插入成功 ",e); else{ printf("插入失败 "); break; } printf("插入后的线性表:"); for(i = 0; i < L.length; i++) printf("%d ",L.elem[i]); putchar(' '); putchar(' '); break; case 3:printf("删除前的线性表:"); for(i = 0; i < L.length; i++) printf("%d ",L.elem[i]); putchar(' '); printf("请输入需要删除元素的位置(i)"); scanf("%d", &i); if(ListDelete_Sq(&L, i, &e) == OK) printf("删除成功 ",e); else{ printf("删除失败 "); break; } printf("删除元素:%d",e); putchar(' '); printf("删除后的线性表:"); for(i = 0; i < L.length; i++) printf("%d ",L.elem[i]); putchar(' '); putchar(' '); break; case 4:printf("当前线性表:"); for(i = 0; i < L.length; i++) printf("%d ",L.elem[i]); putchar(' '); printf("请输入需要查找的元素(e)"); scanf("%d", &e); if(LocateElem_Sq(&L, &e, &compare) != 0) printf("查找成功 ",e); else{ printf("查找失败 "); break; } printf("查找元素的位置:%d ",LocateElem_Sq(&L, &e, &compare)); putchar(' '); break; case 5:printf("La:"); for(i = 0; i < La.length; i++) printf("%d ",La.elem[i]); putchar(' '); printf("Lb:"); for(i = 0; i < Lb.length; i++) printf("%d ",Lb.elem[i]); putchar(' '); MergeList_Sq(La, Lb, &Lc); printf("Lc:"); for(i = 0; i < Lc.length; i++) printf("%d ",Lc.elem[i]); putchar(' '); break; case 6:printf("销毁顺序表... "); if(DestroyList(&L) == OK && DestroyList(&La) == OK && DestroyList(&Lb) == OK){ printf("销毁成功 "); break; } else{ printf("销毁失败 "); break; } default:printf("输入不合法请重新输入"); } printf("请输入序号选择功能,退出请输入0 "); fflush(stdin);//清空键盘缓冲区 scanf("%d",&input); if(input == 0) break; } } Status CheckInit(int input){ if(input == 1) return TRUE; else return FALSE; } Status CheckInput(int input,int flag){ if(input <1 || input > MenuFun){ printf("输入不合法,请重新输入 "); return ERROR; } if(!flag){ printf("未初始化 "); return FALSE; } return TRUE; }
测试过程: