预定义常量和类型#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等*/#include<limits.h> /* INT_MAX等*/#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */三元组的表示及其基本操作表示方法:typedef ElemType *Triplet; /* 由InitTriplet分配3个元素存储空间*//* Triplet类型是ElemType类型的指针,存放ElemType类型的地址*/基本操作(8个):Status InitTriplet(Triplet *T,ElemType v1,ElemType v2,ElemType v3){ /* 操作结果:构造三元组T,依次置T的3个元素的初值为v1,v2和v3 */ *T=(ElemType *)malloc(3*sizeof(ElemType));if(!*T)exit(OVERFLOW);(*T)[0]=v1,(*T)[1]=v2,(*T)[2]=v3;return OK;Status DestroyTriplet(Triplet *T){ /* 操作结果:三元组T被销毁*/free(*T);*T=NULL;return OK;}Status Get(Triplet T,int i,ElemType *e){ /* 初始条件:三元组T已存在,1≤i≤3。
操作结果:用e返回T的第i元的值*/if(i<1||i>3)return ERROR;*e=T[i-1];return OK;}Status Put(Triplet T,int i,ElemType e){ /* 初始条件:三元组T已存在,1≤i≤3。
操作结果:改变T的第i元的值为e */if(i<1||i>3)return ERROR;T[i-1]=e;return OK;}Status IsAscending(Triplet T){ /* 初始条件:三元组T已存在。
操作结果:如果T的3个元素按升序排列,返回1,否则返回0 */return(T[0]<=T[1]&&T[1]<=T[2]);}Status IsDescending(Triplet T){ /* 初始条件:三元组T已存在。
操作结果:如果T的3个元素按降序排列,返回1,否则返回0 */return(T[0]>=T[1]&&T[1]>=T[2]);}Status Max(Triplet T,ElemType *e){ /* 初始条件:三元组T已存在。
操作结果:用e返回指向T的最大元素的值*/*e=T[0]>=T[1]?T[0]>=T[2]?T[0]:T[2]:T[1]>=T[2]?T[1]:T[2];return OK;Status Min(Triplet T,ElemType *e){ /* 初始条件:三元组T已存在。
操作结果:用e返回指向T的最小元素的值*/*e=T[0]<=T[1]?T[0]<=T[2]?T[0]:T[2]:T[1]<=T[2]?T[1]:T[2];return OK;}线性表的顺序表示及其基本操作表示方法:#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量*/#define LIST_INCREMENT 2 /* 线性表存储空间的分配增量*/typedef struct{ElemType *elem; /* 存储空间基址*/int length; /* 当前长度*/int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */}SqList;基本操作(9个):void InitList(SqList *L) /* 算法2.3 */{ /* 操作结果:构造一个空的顺序线性表L */(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!(*L).elem)exit(OVERFLOW); /* 存储分配失败*/(*L).length=0; /* 空表长度为0 */(*L).listsize=LIST_INIT_SIZE; /* 初始存储容量*/}Status ListEmpty(SqList L){ /* 初始条件:顺序线性表L已存在。
操作结果:若L为空表,则返回TRUE,否则返回FALSE */if(L.length==0)return TRUE;elsereturn FALSE;}int ListLength(SqList L){ /* 初始条件:顺序线性表L已存在。
操作结果:返回L中数据元素个数*/ return L.length;}Status GetElem(SqList L,int i,ElemType *e){ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)。
操作结果:用e返回L中第i个数据元素的值*/if(i<1||i>L.length)return ERROR;*e=*(L.elem+i-1);return OK;}int LocateElem(SqList L,ElemType e){ /* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) *//* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
*/ /* 若这样的数据元素不存在,则返回值为0。
算法2.6 */ElemType *p;int i=1; /* i的初值为第1个元素的位序*/p=L.elem; /* p的初值为第1个元素的存储位置*/while(i<=L.length&& *p++!=e)++i;if(i<=L.length)return i;elsereturn 0;}Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 *//* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ ElemType *newbase,*q,*p;if(i<1||i>(*L).length+1) /* i值不合法*/return ERROR;if((*L).length>=(*L).listsize) /* 当前存储空间已满,增加分配*/{newbase=(ElemType*)realloc((*L).elem,((*L).listsize+LIST_INCREMENT)*sizeof(ElemType));if(!newbase)exit(OVERFLOW); /* 存储分配失败*/(*L).elem=newbase; /* 新基址*/(*L).listsize+=LIST_INCREMENT; /* 增加存储容量*/}q=(*L).elem+i-1; /* q为插入位置*/for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之后的元素右移*/*(p+1)=*p;*q=e; /* 插入e */++(*L).length; /* 表长增1 */return OK;}Status ListDelete(SqList *L,int i,ElemType *e) /* 算法2.5 */{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) *//* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */ ElemType *p,*q;if(i<1||i>(*L).length) /* i值不合法*/return ERROR;p=(*L).elem+i-1; /* p为被删除元素的位置*/*e=*p; /* 被删除元素的值赋给e */q=(*L).elem+(*L).length-1; /* 表尾元素的位置*/for(++p;p<=q;++p) /* 被删除元素之后的元素左移*/*(p-1)=*p;(*L).length--; /* 表长减1 */return OK;}void Union(SqList *La,SqList Lb) /* 算法2.1 */{ /* 将所有在线性表Lb中但不在La中的数据元素插入到La中*/ElemType e;int La_len,Lb_len;int i;La_len=ListLength(*La);/* 求线性表的长度*/Lb_len=ListLength(Lb);for(i=1;i<=Lb_len;i++){GetElem(Lb,i,&e); /* 取Lb中第i个数据元素赋给e */if(!LocateElem(*La,e)) /* La中不存在和e相同的元素,则插入之*/ListInsert(La,++La_len,e);}}void MergeList(SqList La,SqList Lb,SqList *Lc) /* 算法2.2 */{ /* 已知线性表La和Lb中的数据元素按值非递减排列。
*//* 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列*/ int i=1,j=1,k=0;int La_len,Lb_len;ElemType ai,bj;InitList(Lc); /* 创建空表Lc */La_len=ListLength(La);Lb_len=ListLength(Lb);while(i<=La_len&&j<=Lb_len) /* 表La和表Lb均非空*/{GetElem(La,i,&ai);GetElem(Lb,j,&bj);if(ai<=bj){ListInsert(Lc,++k,ai);++i;}else{ListInsert(Lc,++k,bj);++j;}} /* 以下两个while循环只会有一个被执行*/while(i<=La_len) /* 表La非空且表Lb空*/{GetElem(La,i++,&ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len) /* 表Lb非空且表La空*/{GetElem(Lb,j++,&bj);ListInsert(Lc,++k,bj);}}线性表的链式表示及其基本操作带头结点链表的表示方法(不带头结点的单链表不再总结,在书上28页):typedef struct LNode /* 结点类型*/{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct LinkList /* 链表类型*/{Link head,tail; /* 分别指向线性链表中的头结点和最后一个结点*/ int len; /* 指示线性链表中数据元素的个数*/}LinkList;基本操作(24个):void MakeNode(Link *p,ElemType e){ /* 分配由p指向的值为e的结点。