面试受挫,发粪土墙,狂啃数据结构,以至于有此代码,计划实现全书代码,陆续发帖...... util.h #include <stdio.h> #include <stdlib.h> //函数结构状态代码 #define TRUE -1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 //不可行的,办不到的 #define OVERFLOW -2 //定义单链表的数据元素的类型 typedef int ElemType; //定义函数返回值的数据类型 typedef int Status; //声明相关的辅助函数 Status Compare(ElemType,ElemType); void Elemfun(ElemType); //声明函数指针 typedef Status (*pCompare)(ElemType,ElemType); typedef void (*pElemfun)(ElemType); util.cpp #include "util.h" Status Compare(ElemType e1,ElemType e2){ //操作结果:比较e1和e2是否相等,若相等,返回TRUE;否则,返回FALSE if(e1==e2) return TRUE; else return FALSE; }//Compare void Elemfun(ElemType e){ //操作结果:将e的数据域在屏幕上输出 printf("%d ",e); }//Elemfun SequenceList.h #include "util.h" #define LIST_INIT_SIZE 100 #define LIST_INCREMENT 10 typedef struct{ ElemType *elem; int length; int listSize; }SqList; //声明顺序单链表的基本操作 Status InitList_Sq(SqList &L); Status Destroy_Sq(SqList &L); Status ClearList_Sq(SqList &L); int LocateElem_Sq(SqList L,ElemType e,pCompare comFun); Status ListInsert_Sq(SqList &L,int i,ElemType e); Status ListDelete_Sq(SqList &L,int i,ElemType &e); void Union_Sq(SqList &La,SqList Lb); void MergeList_Sq(SqList La,SqList Lb,SqList &Lc); void ListTraverse_Sq(SqList L,pElemfun elemfun); SequenceList.cpp #include "SequenceList.h" Status InitList_Sq(SqList &L){ //操作结果:构造一个空的线性表L L.elem = (ElemType *)malloc(LIST_INCREMENT * sizeof(ElemType)); if(!L.elem)exit(OVERFLOW); L.length = 0; //空表长度为0 L.listSize = LIST_INIT_SIZE; //初始储存容量 return OK; }//initList_Sq Status Destroy_Sq(SqList &L){ //初始条件:线性表L已存在 //操作结果:销毁线性表L L.length = 0; L.listSize = 0; free(L.elem); if(L.elem)return ERROR; return OK; }//Destroy_Sq Status ClearList_Sq(SqList &L){ //初始条件:线性表L已存在 //操作结果:将L重置为空表 ElemType *newbase = (ElemType *)realloc(L.elem,0); if(!L.elem)exit(OVERFLOW); L.elem = newbase; L.length = 0; //空表长度为0 L.listSize = LIST_INIT_SIZE; //初始储存容量 return OK; } int LocateElem_Sq(SqList L,ElemType e,pCompare comFun){ //初始条件:线性表L已存在,comFun是指向compare()函数的指针 //操作结果:返回L中第1个与e满足关系compare()的数据元素的位置。若这样的数据元素不存在,返回ERROR int i = 1; ElemType *p = L.elem; while(i <= L.length && !comFun(*p++,e))++i; if(i <= L.length) return i; else return 0; } //LocateElem_Sq Status ListInsert_Sq(SqList &L,int i,ElemType e){ //初始条件:线性表L已存在,1<=i<=ListLength(L)+1 //操作结果:在L中的第i个元素之前插入新的数据元素e,L的长度加1 if(i < 1 || i > L.length+1) return ERROR; if(L.length >= L.listSize){ //判断存储空间是否够用,不够增加分配空间 ElemType *newbase = (ElemType *)realloc(L.elem,(L.listSize + LIST_INCREMENT)*sizeof(ElemType)); if(!newbase)exit(OVERFLOW); L.elem = newbase; L.listSize += LIST_INCREMENT; } ElemType *q = &(L.elem[i-1]); for(ElemType *p = &(L.elem[L.length -1]);p>=q;--p)*(p+1)=*p; //i位置以后的元素依次往后推移一位,以便腾出空间插入新元素 *q = e; //插入新元素 ++L.length; //表长增加1 return OK; }//ListInsert_Sq Status ListDelete_Sq(SqList &L,int i,ElemType &e){ //初始条件:线性表L已存在且非空,1<=i<=ListLength(L) //操作结果:删除L的第i个元素,并用e返回其值,L的长度减1 if(i < 1 || i > L.length+1)return ERROR; ElemType *p = &(L.elem[i-1]); e = *p; ElemType *q = L.elem + L.length - 1; for(++p; p <= q ;++p) *(p-1) = *p; --L.length; return OK; }//ListDelete_Sq void Union_Sq(SqList &La,SqList Lb){ //将所有线性表Lb中但不在La中的数据元素插入到La中,属于普通的合并,Lb在La之后接着插入 for(int i = 1;i <= Lb.length;i++){ if(!LocateElem_Sq(La,Lb.elem[i-1],Compare))ListInsert_Sq(La,La.length+1,Lb.elem[i-1]); } }//Union_Sq void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){ //已知顺序线性表La和Lb的元素按值非递减排列(有序),归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列 ElemType *pa = La.elem; ElemType *pb = Lb.elem; Lc.listSize = Lc.length = La.length + Lb.length; ElemType *pc = Lc.elem = (ElemType *)malloc(Lc.listSize * sizeof(ElemType)); if(!Lc.elem)exit(OVERFLOW); ElemType *pa_Last = La.elem + La.length - 1; ElemType *pb_Last = Lb.elem + Lb.length - 1; while(pa <= pa_Last && pb <= pb_Last){ if(*pa <= *pb)*pc++ = *pa++; else *pc++ = *pb ++; } while(pa <= pa_Last)*pc++ = *pa++; while(pb <= pb_Last)*pc++ = *pb++; }//MergeList_Sq void ListTraverse_Sq(SqList L,pElemfun elemFun){ //初始条件:线性表L已存在 //操作结果:依次对L的每个数据元素调用函数Print() for(int i = 1;i <= L.length;i++){ elemFun(L.elem[i-1]); } printf("/n"); }