元素所占空间和表长合并为C语言的一个结构类型 #define maxleng 10 typedef struct Elem Type elem maxlengI:∥下标.0,1,, maxing-1 int length ∥表长 其中: typedef-别名定义, Sqlist-结构类型名 La--结构类型变量名 La length-表长 La elem[o]----al La elem La lengt 算法举例: #include"stdio. h" #define OVERFLOW -2 #define OK #define error typedef int ElemType; 假定数据元素为int #define maxlen 100 线性表最大容量 typedef struct Elem Type elem(maxlen]:/连续存储单元* int length: /线性表长度 Sqlist;:/" Sqlist为结构类型,用其说明的变量在程序中作为线性表* /***亲率幸本***幸本**亲*率本幸本*****亲率本 ★功能:线性表插入操作,将某数据元素插入到线性表 的第i个数据元素之前 输入:线性表指针L、位置i、待插入的数据元素e 输出:成功时返回OK 本本本*幸举*幸**幸本本本******本本幸*客*本*****/ int insert sq(sqlist*L, int i, Elem Type e if(iL-> ength+1) return error,/*i的合法取值为1至n+1 if(L-> length>= maxlen)/溢出* { printi(“超过线性表最大容量”) return ERROR; for(=L-> length-1j>=i-1j-)陣*向后移动元素,空出第i个元素的分量elem[i-1]/ L->elem[j+1=L->elemnT L->elem[i-1=e 新元素插入*
元素所占空间和表长合并为 C 语言的一个结构类型: #define maxleng 100 typedef struct { ElemType elem[maxleng];//下标:0,1,...,maxleng-1 int length; //表长 } SqList; SqList La; 其中:typedef---别名定义,SqList----结构类型名 La----结构类型变量名 La.length---表长 La.elem[0]----a1 La.elem[La.length-1]---an 算法举例: #include "stdio.h" #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int ElemType; /*假定数据元素为 int*/ #define maxlen 100 /*线性表最大容量*/ typedef struct { ElemType elem[maxlen];/*连续存储单元*/ int length; /*线性表长度*/ } SqList; /*SqList 为结构类型,用其说明的变量在程序中作为线性表*/ /********************************************************** ** 功能:线性表插入操作,将某数据元素插入到线性表 ** ** 的第 i 个数据元素之前 ** ** 输入:线性表指针 L、位置 i、待插入的数据元素 e ** ** 输出: 成功时返回 OK ** **********************************************************/ int insert_sq(SqList *L,int i, ElemType e) { int j; if (iL->length+1) return ERROR; /*i 的合法取值为 1 至 n+1*/ if (L->length>=maxlen) /*溢出*/ {printf(“超过线性表最大容量”); return ERROR; } for(j=L->length-1;j>=i-1;j--) /*向后移动元素,空出第 i 个元素的分量 elem[i-1]*/ L->elem[j+1]=L->elem[j]; L->elem[i-1]=e; /*新元素插入*/
L->length++ /*线性表长度加1* 功能:线性表删除操作,删除线性表的第i个数据元素 输入:线性表指针L、位置i 输出:成功时返回OK 客*幸率**幸率幸*客春幸***幸*幸**幸*幸**/ int delete sq(sqlist "L, int i) if(iL->length) return ERROR; for(j=ij length j++)/向前移动元素* L->elem[j-1=L->elem jil L->length- /*线性表长度减1*/ ★功能:显示线性表的所有数据元素 输入:线性表L 输出:无 率本本*率举本***亲幸本本客本本本**率幸本幸**春率本****幸*/ void display(sqlist L) for(i=0; K<L length,; i++) intf("na[%d]=%od", i+l, L elem[) maino Sqlist La La length=0; /*初始化线性表La,表长度设置为0*/ insert so(&Lan1,1);/*数据元素1插入到线性表La的第1个数据元素之前* Insert_sq(&La1,2);,/*数据元素2插入到线性表La的第1个数据元素之前* Insert_sq(&La1,3),/数据元素3插入到线性表La的第1个数据元素之前* Insert sq&La4,5);/*数据元素5插入到线性表La的第4个数据元素之前* delete sq(&La,1);/删除线性表La的第1个数据元素* display (La) /*显示线性表La的数据元素*
L->length++; /*线性表长度加 1*/ return OK; } /********************************************************** ** 功能:线性表删除操作,删除线性表的第 i 个数据元素 ** ** 输入:线性表指针 L、位置 i ** ** 输出: 成功时返回 OK ** **********************************************************/ int delete_sq(SqList *L,int i) { int j; if (iL->length) return ERROR; for(j=i;jlength;j++) /*向前移动元素*/ L->elem[j-1]=L->elem[j]; L->length--; /*线性表长度减 1*/ return OK; } /********************************************************** ** 功能:显示线性表的所有数据元素 ** ** 输入:线性表 L ** ** 输出: 无 ** **********************************************************/ void display(SqList L) { int i; for (i=0;i<L.length;i++) printf("\na[%d]=%d",i+1,L.elem[i]); } main() { SqList La; clrscr(); La.length=0; /*初始化线性表 La, 表长度设置为 0*/ insert_sq(&La,1, 1); /*数据元素1插入到线性表 La 的第1个数据元素之前*/ insert_sq(&La,1, 2); /*数据元素 2 插入到线性表 La 的第1个数据元素之前*/ insert_sq(&La,1, 3); /*数据元素 3 插入到线性表 La 的第1个数据元素之前*/ insert_sq(&La,4 , 5); /*数据元素 5 插入到线性表 La 的第 4 个数据元素之前*/ delete_sq(&La,1); /*删除线性表 La 的第1个数据元素*/ display(La) /*显示线性表 La 的数据元素*/;
2单链表 算法举例(带表头结点的单链表 typedef int Elem Type typedef struct LNod i Elem Type data; struct lnode /*可理解为定义两个类型 LNode 结构类型; Linklist---结点指针类型,指向结点 由于头指针是结点指针,所以该类型变量可定义为链表 LNode*p等价于 Linklist p*/ ***客水客客宗水客客水水水水**亦水客容水客水市客水称水*涂**水*客水 索六功能:初始化单链表,产生头结点 六输入:无 六输出:成功时返回头结点指针 涂本涂*凇称水水客水客水水容水 LinkList ListlnitO L Node *s. LinkList) malloc( sizeof( L Node),/*产生头结点* s->data=0: s->next=NULL return S, /*返回头结点指针* /容****幸亲**春本*****春本李春本**幸春本**春春** 功能:线性表插入操作,将某数据元素插入到单链表* 的第i个数据元素之前 输入:单链表的头指针L、位置i、待插入的数据元素e☆ 六输出:成功时返回OK 本客家本**亲*本*举***本李*本***幸**家率*家幸幸本*本率*亲**本*家*/ int ListInsert(LinkList L, int 1, Elem Type e) LNode"p, s, J p=(LNode *)L; /*p指向链表头结点* while(p &&jnext; ++3; 3 /*执行i-1次定位第i-1个结点*
} 2 单链表 算法举例(带表头结点的单链表): typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; } LNode, *LinkList; /*可理解为定义两个类型: LNode ----- 结构类型; LinkList ----- 结点指针类型,指向结点, 由于头指针是结点指针,所以该类型变量可定义为链表 LNode *p 等价于 LinkList p */ /**************************************************** ** 功能:初始化单链表,产生头结点 ** ** 输入:无 ** ** 输出: 成功时返回头结点指针 ** ****************************************************/ LinkList ListInit() { LNode *s; s=(LinkList) malloc(sizeof(LNode)); /*产生头结点*/ s->data=0;s->next=NULL; return s; /*返回头结点指针*/ } /********************************************************** ** 功能:线性表插入操作,将某数据元素插入到单链表 ** ** 的第 i 个数据元素之前 ** ** 输入:单链表的头指针 L、位置 i、待插入的数据元素 e ** ** 输出: 成功时返回 OK ** **********************************************************/ int ListInsert(LinkList L,int i, ElemType e) { LNode *p,*s; int j; p=(LNode *) L; /*p 指向链表头结点*/ j=0; while (p && jnext;++j;} /* 执行 i-1 次定位第 i-1 个结点 */
f(pj>i-1) return ERROR,/*p为NULL时表示没有第i-1个结点 j-1表示inext=p-next p->next=s, /*s所指新结点插入p所指第i-1个结点之后 /***幸家**幸春**率***幸*率春*率本幸幸* 功能:线性表删除操作,删除单链表的第i个结点 输入:单链表的头指针L、位置i 六输出:成功时返回OK int List Delete( LinkList L, int 1) LNode "p, "q Int J; p=( LNode*)L;,/*p指向链表头结点* while(p->next &&jnext++j;}/*执行i-l次,使p定位第i-1个结点* p->next指向结点第i个结点, search for ith node* if(!(p->next)lP>i-1)return ERROR; free(q) return OK /*****本*容*本*****客春**幸*幸本布*****本幸*率*****本** 功能:读取线性表第i个结点的值 ★输入:单链表的头指针L、位置 输出:成功时返回OK、通过指针e返回第i个结点的值 失败返回 ERROR int Get Elem(LinkList L, int i, Elem Type *e) lode*p, 's Int j; p=( LNode*)L->next,/p指向链表第1个结点* while(p &&jnext;++j;}/*执行i-1次,使p定位第i个结点* if(plj>i) return ERROR; return OF 客*称水*客水容水*称水容水水容客*客客水客客*客水*客水水*称水*凇称水*水客客水*水客水水水*
if (!p || j>i-1) return ERROR; /*p 为 NULL 时表示没有第 i-1 个结点 j>i-1 表示 idata=e; s->next=p->next;p->next=s; /*s 所指新结点插入 p 所指第 i-1 个结点之后*/ return OK; } /********************************************************** ** 功能:线性表删除操作,删除单链表的第 i 个结点 ** ** 输入:单链表的头指针 L、位置 i ** ** 输出: 成功时返回 OK ** **********************************************************/ int ListDelete(LinkList L,int i) { LNode *p,*q; int j; p=(LNode *) L; /*p 指向链表头结点*/ j=0; while (p->next && jnext;++j;} /* 执行 i-1 次,使 p 定位第 i-1 个结点 */ p->next 指向结点第 i 个结点, search for ith node*/ if (!(p->next)||j>i-1) return ERROR; q=p->next;p->next=q->next; free(q); return OK; } /********************************************************** ** 功能:读取线性表第 i 个结点的值 ** ** 输入:单链表的头指针 L、位置 i ** ** 输出: 成功时返回 OK、通过指针 e 返回第 i 个结点的值 ** ** 失败返回ERROR ** **********************************************************/ int GetElem(LinkList L,int i, ElemType *e) { LNode *p,*s; int j; p=(LNode *) L->next; /*p 指向链表第 1 个结点*/ j=1; while (p && jnext;++j;} /* 执行 i-1 次,使 p 定位第 i 个结点 */ if (!p||j>i) return ERROR; *e=p->data; return OK; } /**********************************************************
★功能:显示单链表表示的线性表的所有数据元素 输入:线性表L ★输出:无 void display (LinkList L) while(p) printf("\n%d",p->data) p=p->next maino LinkList La, Lb, /only define head pointer, no head node*/ int a La=distinto Lb=listlnito ListInsert(La, 1, 7) ListInsert(La, 2, 9) ListInsert(La, 3, 12) ListDelete(La, 1) Get Elem( La, 3, &a) printf("a=%od", a) display (La);
** 功能:显示单链表表示的线性表的所有数据元素 ** ** 输入:线性表 L ** ** 输出: 无 ** **********************************************************/ void display(LinkList L) { LNode *p; p=L->next; while (p) { printf("\n%d",p->data); p=p->next; } } main() { LinkList La,Lb; /*only define head pointer,no head node*/ int a; clrscr(); La=ListInit(); Lb=ListInit(); ListInsert(La,1, 7); ListInsert(La,2, 9); ListInsert(La,3, 6); ListInsert(La,3, 12); ListDelete(La,1); GetElem(La,3,&a); printf("a=%d",a); display(La); }
3.顺序栈 /*静态分配栈空间,大小固定,不能扩充* #define TRUe 1 #define False 0 #define oK #define ERRoR 0 typedef int Elem Type typedef struct Elem Type elem[ marlene+1]/*栈元素空间* Int top /*顶指针* i SqStack 客*水*称*水客*水客水*客*水****客水凇客水客水*客水**容**水客 SqStack为结构类型 例: SqStack s;说明s为结构类型变量,可表示一个栈 其中:stop-顶指针; selem[stop-顶元素 未用元素 selem[oj *水*水涂水水客客*客水*客客客*水水**涂水*客*幸水*水*客水*水*水水客*水水客客*涂水*客水 *功能:测试栈是否为空 输入:栈对象S 输出:空时返回TRUE,非空时返回 FALSE int Stack Empty (sqstack S) f if(.top==0) return TRUE else return false **水客水凇客容水*称***客水本*水*称客本本客客*客水称本涂*水*客水凇客本容水*称本*客 功能:进栈操作 输入:栈对象S的指针,数据元素e 输出:成功时返回OK int Push(Sqstack*S, Elem Type e)
3. 顺序栈 /* 静态分配栈空间,大小固定,不能扩充*/ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define maxleng 10 typedef int ElemType; typedef struct { ElemType elem[maxleng+1]; /*栈元素空间*/ int top; /*顶指针*/ }SqStack; /****************************************************** SqStack 为结构类型 例:SqStack s;说明 s 为结构类型变量,可表示一个栈 其中: s.top----顶指针;s.elem[s.top]----顶元素 未用元素 s.elem[0] ******************************************************/ /********************************************************** ** 功能:测试栈是否为空 ** ** 输入:栈对象 S ** ** 输出: 空时返回 TRUE, 非空时返回 FALSE ** **********************************************************/ int StackEmpty(SqStack S) { if (S.top==0) return TRUE; else return FALSE; } /********************************************************** ** 功能:进栈操作 ** ** 输入:栈对象 S 的指针,数据元素 e ** ** 输出: 成功时返回 OK ** **********************************************************/ int Push(SqStack *S,ElemType e) {
Intj; f(S->top== maxing)/*栈溢出* printf("OVERFLOW") return ERROR: S->top++, 栈顶加1*/ S-elem[S->topl=e,/*新元素进栈*/ return O 功能:退栈操作 输入:栈对象S的指针 输出:成功时返回OK、通过数据元素指针e返回栈顶元素的值* 空栈时返回 ERROR 幸本幸*李**举本率***亲率本幸***家春家春***亲幸本本幸**家举幸本**亲*幸本幸****/ int Pop(Sqstack*S, Elem Type 'e) if( StackEmpty(*S) return error,倖*空栈失败返回* e=S-elem[S->top]/*取栈顶元素* S->top=S->top-1;/栈顶减1*/ return OF 成功返回* maino int i; Elem Type elem /定义栈对象s* *初始化栈对象s* clrscro for(i=1;<=5,+)/输入5个数据元素并进栈* printf("No%d? " 1) scanf("%d", &elem) Push(&s, elem) } for(i=1;i<=7,i++)/*退栈操作* f(Pop(&s&elem)=OK)/*正确退栈时,可通过elem输出数据元素* printf("No%d=%d ",i, elem); else*若栈已空,结束,此时elem的值无意义,* i printf("stack has been empty! ") break;
int j; if (S->top==maxleng) /*栈溢出*/ { printf("OVERFLOW"); return ERROR; } S->top++; /*栈顶加 1*/ S->elem[S->top]=e; /*新元素进栈*/ return OK; } /******************************************************************* ** 功能:退栈操作 ** ** 输入:栈对象 S 的指针 ** ** 输出: 成功时返回 OK、通过数据元素指针 e 返回栈顶元素的值 ** ** 空栈时返回ERROR ** *******************************************************************/ int Pop(SqStack *S,ElemType *e) { if(StackEmpty(*S)) return ERROR; /*空栈,失败返回 */ *e=S->elem[S->top];/*取栈顶元素*/ S->top=S->top-1; /*栈顶减 1*/ return OK; /*成功返回 */ } main() { int i; ElemType elem; SqStack s; /*定义栈对象 s*/ s.top=0; /*初始化栈对象 s*/ clrscr(); for(i=1;i<=5;i++) /*输入 5 个数据元素并进栈*/ { printf("No%d? ",i); scanf("%d",&elem); Push(&s,elem); }; for(i=1;i<=7;i++) /*退栈操作*/ { if (Pop(&s,&elem)==OK) /*正确退栈时,可通过 elem 输出数据元素*/ printf("No%d=%d ",i,elem); else /*若栈已空,结束,此时 elem 的值无意义,*/ { printf("stack has been empty!"); break;} };
4链式队列 定义结点类型 (1)存放元素的结点类型 typedef int elemType typedef struct QNode I Elem Type data struct QNod 半next F QNode, *QueuePtr /*可理解为定义两个类型 链式队列结点的结构类型; QueuePt 链式队列结点指针类型,指向链式队列结点, (2)由头、尾指针组成的结点类型 typedef struct t QueuePtr front;/*队头指针*/ QueuePtr rear;/队尾指针*/ 1 LinkQueue /*结构类型 LinkQueue的变量为队列对象*/ **水客水容***水容水*涂水客水*客**客客水***水常客水涂水*水客***水*水*客***常客水幸客 功能:初始化队列 输入:队列对象S的指针 ★输出:成功时返回OK int Init Queue (LinkQueue *Q Q->front=Q->rear=(QueuePtr) malloc(sizeof (QNode)) if (Q->front=nULL return ERROR Q->front->nex t=NULL return OK 水涂布客水凇客 功能:测试队列是否为空 输入:队列对象Q 输出:空时返回TRUE,非空时返回 FALSE* 幸幸幸客*客幸本**亲幸本客春*幸本率**/ int Queue Empty (Link Queue Q)
} 4 链式队列 定义结点类型 (1)存放元素的结点类型 typedef int ElemType; typedef struct QNode { ElemType data; struct QNode *next; } QNode, *QueuePtr; /*可理解为定义两个类型: QNode ----- 链式队列结点的结构类型; QueuePtr ----- 链式队列结点指针类型,指向链式队列结点, */ (2)由头、尾指针组成的结点类型 typedef struct { QueuePtr front; /*队头指针*/ QueuePtr rear; /*队尾指针*/ } LinkQueue; /*结构类型LinkQueue的变量为队列对象*/ /********************************************************** ** 功能:初始化队列 ** ** 输入:队列对象 S 的指针 ** ** 输出: 成功时返回 OK ** **********************************************************/ int InitQueue(LinkQueue *Q) { Q->front=Q->rear=(QueuePtr) malloc(sizeof(QNode)); if (Q->front==NULL) return ERROR; Q->front->next=NULL; return OK; } /********************************************************** ** 功能:测试队列是否为空 ** ** 输入:队列对象 Q ** ** 输出: 空时返回 TRUE, 非空时返回 FALSE ** **********************************************************/ int QueueEmpty(LinkQueue Q)
if (Q front==Q rear) return TRUE e⊥se return False 功能:进队列操作 ★输入:队列对象Q的指针,数据元素e 输出:成功时返回OK int EnQueue( LinkQueue*Q, ElemType e)/*进队列*/ Q-rear->next=( QueuePtr) malloc( sizeof( QNode);/*创建新结点* if(Q->rear->next=nULL exit(OVERFLOW) Q->rear=Q->rear->next /*修改尾结点指针* Q-rear->data=e;Q-rear->next=NUL;/*新结点赋值* return oK /*亲幸春家**幸幸*幸亲***幸*容春幸*幸*亲亲幸幸*****春率亲幸*亲幸* 功能:出队操作 输入:队列对象S的指针 ★输出:成功时返回OK、通过数据元素指针e返回队首元素的值 空队列时返回 ERROR 本本本*幸举*幸**幸本本本**本****本本幸*客*家本率******幸本***/ int DeQueue( LinkQueue*Q, ElemType*e)/出队列*/ if( QueueEmpty(*Q)) return error;/*空队列,返回错误* p=Q->front->next /*p指向删除结点*/ *e=p->data /*取数据*/ Q-> front->next=p->next;/*修改队头指针*/ f(Q->rear==p)Q->rear=Q-> front;/*若删除结点为队尾结点 设置为空队列*/ free(p) return OK maino ElemType LinkQueue que /*定义队列对象que*/
{ if (Q.front==Q.rear) return TRUE; else return FALSE; } /********************************************************** ** 功能:进队列操作 ** ** 输入:队列对象 Q 的指针,数据元素 e ** ** 输出: 成功时返回 OK ** **********************************************************/ int EnQueue(LinkQueue *Q, ElemType e) /*进队列*/ { Q->rear->next=(QueuePtr) malloc(sizeof(QNode)); /*创建新结点*/ if(Q->rear->next==NULL) exit(OVERFLOW); Q->rear=Q->rear->next; /*修改尾结点指针*/ Q->rear->data=e; Q->rear->next=NULL; /*新结点赋值*/ return OK; } /******************************************************************* ** 功能:出队操作 ** ** 输入:队列对象 S 的指针 ** ** 输出: 成功时返回 OK、通过数据元素指针 e 返回队首元素的值 ** ** 空队列时返回ERROR ** *******************************************************************/ int DeQueue(LinkQueue *Q, ElemType *e) /*出队列*/ { QueuePtr p; if (QueueEmpty(*Q)) return ERROR; /*空队列,返回错误*/ p=Q->front->next; /*p指向删除结点*/ *e=p->data; /*取数据*/ Q->front->next=p->next; /*修改队头指针*/ if (Q->rear==p) Q->rear=Q->front;/*若删除结点为队尾结点, 设置为空队列*/ free(p); return OK; } _ main() { int i; ElemType elem; LinkQueue que; /*定义队列对象que*/
InitQueue(&que) /*队列que初始化*/ EnQueue(&que, 1) /*元素1进队列*/ /*元素2进队列*/ EnQueue(&que, 3) /*元素3进队列* DeQueue(&que,&elem); printf("%d",elem);/*1出队列*/ De Queue(&que,&elem); printf("%d",elem);/*2出队列*/ DeQueue(&que,&elem); printf("%d",eem);/*3出队列*/ DeQueue(&que, &elem): printf (%d", elem) /*队列已空,由于未检查返回结果,取出的还是3,产生错误*/ 5.顺序队列 #define MAXQSIZE 100 /*首次分配连续存储单元的大小,可存储 MAXQSIZE个元素*/ typedef int elemType typedef struct sqlist ElemType*base;/*连续存储单元首地址*/ int front /*队列头指针,若队列不空,指向队头元素*/ Int rear /*队列尾指针,若队列不空,指向队尾元素的下一个位置* 1 SqQueue /* Sqqueue为结构类型,用其说明的变量在程序中作为队列*/ /率容率本本*本******本**********率幸春幸率幸** 功能:初始化队列 六输入:队列对象S的指针 输出:成功时返回OK 水本水*客水水水*涂 int Init Queue(sqQueue *Q) Q->base=(Elem Type *)malloc(MAXQSIZE*sizeof(ElemType)) if (!Q->base) exit(OVERFLOW) ear return OK 功能:进队列操作 输入:队列对象Q的指针,数据元素e 输出:成功时返回OK *幸*本**幸幸**率幸***率本*率***/ int En Queue (SqQueue *Q, Elem T ype e)
InitQueue(&que); /*队列que初始化*/ EnQueue(&que,1); /*元素1进队列*/ EnQueue(&que,2); /*元素2进队列*/ EnQueue(&que,3); /*元素3进队列*/ DeQueue(&que,&elem); printf("%d",elem); /*1 出队列*/ DeQueue(&que,&elem); printf("%d",elem); /*2 出队列*/ DeQueue(&que,&elem); printf("%d",elem); /*3 出队列*/ DeQueue(&que,&elem); printf("%d",elem); /*队列已空,由于未检查返回结果,取出的还是3,产生错误*/ } 5.顺序队列 #define MAXQSIZE 100 /*首次分配连续存储单元的大小,可存储MAXQSIZE个元素*/ typedef int ElemType; typedef struct SqList { ElemType *base; /*连续存储单元首地址*/ int front; /*队列头指针,若队列不空,指向队头元素*/ int rear; /*队列尾指针,若队列不空,指向队尾元素的下一个位置*/ } SqQueue; /*SqQueue为结构类型,用其说明的变量在程序中作为队列*/ /********************************************************** ** 功能:初始化队列 ** ** 输入:队列对象 S 的指针 ** ** 输出: 成功时返回 OK ** **********************************************************/ int InitQueue(SqQueue *Q) { Q->base=(ElemType *) malloc(MAXQSIZE*sizeof(ElemType)); if (!Q->base) exit(OVERFLOW); Q->front=Q->rear=0; return OK; } /********************************************************** ** 功能:进队列操作 ** ** 输入:队列对象 Q 的指针,数据元素 e ** ** 输出: 成功时返回 OK ** **********************************************************/ int EnQueue(SqQueue *Q,ElemType e) {