1、 WORD 完美格式 专业知识编辑整理 /*【题目】试写一算法,如果三个整数 a,b 和 c 的值不是依次非递增的,则通过交换,令其为非递增。*/void Descend(int for(int i=1;iMAXINT)return ERROR;return OK;/*【题目】假设有 A、B、C、D、E 五个高等院校进行田径对抗赛,各院校的单项成绩均以存入计算机并构成一张表,表中每一行的形式为:项目名称 性别 校名 成绩 得分编写算法,处理上述表格,以统计各院校的男、女总分和团体总分,并输出。*/void Scores(ResultType *result, ScoreType *score)
2、/* 求各校的男、女总分和团体总分, 并依次存入数组 score */* 假设比赛结果已经储存在 result 数组中, */* 并以特殊记录 “, male, , “, 0 (域 scorce=0)*/* 表示结束 */int i=0;while(resulti.sport!=NULL) switch(resulti.schoolname) case A: score0.totalscore+=resulti.score;if(resulti.gender=male)score0.malescore+=resulti.score;elsescore0.femalescore+=resulti
3、.score; break;case B: score1.totalscore+=resulti.score;if(resulti.gender=male)score1.malescore+=resulti.score;elseWORD 完美格式 专业知识编辑整理 score1.femalescore+=resulti.score; break;case C: score2.totalscore+=resulti.score;if(resulti.gender=male)score2.malescore+=resulti.score;elsescore2.femalescore+=result
4、i.score; break;case D: score3.totalscore+=resulti.score;if(resulti.gender=male)score3.malescore+=resulti.score;elsescore3.femalescore+=resulti.score; break;case E: score4.totalscore+=resulti.score;if(resulti.gender=male)score4.malescore+=resulti.score;elsescore4.femalescore+=resulti.score; break; i+
5、;/*【题目】试写一算法,对序列 S 的第 i 个元素赋以值 e。序列的类型定义为:typedef struct ElemType *elem;int length; Sequence;*/Status Assign(Sequence elseS.elemi=e;return OK; /*【题目】试写一算法,由长度为 n 的一维数组 a 构建一个序列 S。WORD 完美格式 专业知识编辑整理 序列的类型定义为:typedef struct ElemType *elem;int length; Sequence;*/Status CreateSequence(Sequence return p;
6、WORD 完美格式 专业知识编辑整理 /*【题目】链表的结点和指针类型定义如下typedef struct LNode ElemType data;struct LNode *next; LNode, *LinkList;试写一函数,构建长度为 2 且两个结点的值依次为 x 和 y 的链表。*/LinkList CreateLinkList(ElemType x, ElemType y) /* 构建其两个结点的值依次为 x 和 y 的链表。*/* 若构建失败,则返回 NULL。 */LNode * p;p=(LNode*)malloc(sizeof(LNode);if(p=NULL)retur
7、n NULL;elsep-next=(LNode*)malloc(sizeof(LNode);if(p-next=NULL)return NULL;p-data=x;p-next-data=y;p-next-next=NULL;return p;/*【题目】链表的结点和指针类型定义如下typedef struct LNode ElemType data;struct LNode *next; LNode, *LinkList;试写一函数,构建长度为 2 的升序链表,两个结点的值分别为 x 和 y,但应小的在前,大的在后。*/LinkList CreateOrdLList(ElemType x,
8、 ElemType y)/* 构建长度为 2 的升序链表。 */* 若构建失败,则返回 NULL。 */LNode * p;p=(LNode*)malloc(sizeof(LNode);WORD 完美格式 专业知识编辑整理 if(p=NULL)return NULL;elsep-next=(LNode*)malloc(sizeof(LNode);if(p-next=NULL)return NULL;p-data=(xnext-data=(xy)?x:y;p-next-next=NULL;return p;/*【题目】试写一算法,实现顺序栈的判空操作StackEmpty_Sq(SqStack S
9、)。顺序栈的类型定义为:typedef struct ElemType *elem; / 存储空间的基址int top; / 栈顶元素的下一个位置,简称栈顶位标int size; / 当前分配的存储容量int increment; / 扩容时,增加的存储容量 SqStack; / 顺序栈*/Status StackEmpty_Sq(SqStack S)/* 对顺序栈 S 判空。 */ /* 若 S 是空栈,则返回 TRUE;否则返回 FALSE */if(S.top=0)return TRUE;return FALSE;/*【题目】试写一算法,实现顺序栈的取栈顶元素操作GetTop_Sq(Sq
10、Stack S, ElemType / 存储空间的基址int top; / 栈顶元素的下一个位置,简称栈顶位标int size; / 当前分配的存储容量int increment; / 扩容时,增加的存储容量 SqStack; / 顺序栈WORD 完美格式 专业知识编辑整理 */Status GetTop_Sq(SqStack S, ElemType e=S.elemS.top-1;return OK;/*【题目】试写一算法,实现顺序栈的出栈操作Pop_Sq(SqStack / 存储空间的基址int top; / 栈顶元素的下一个位置,简称栈顶位标int size; / 当前分配的存储容量in
11、t increment; / 扩容时,增加的存储容量 SqStack; / 顺序栈*/Status Pop_Sq(SqStack e=S.elem-S.top;return OK;/*【题目】若顺序栈的类型重新定义如下。试编写算法,构建初始容量和扩容增量分别为 size 和 inc 的空顺序栈 S。typedef struct ElemType *elem; / 存储空间的基址ElemType *top; / 栈顶元素的下一个位置int size; / 当前分配的存储容量int increment; / 扩容时,增加的存储容量 SqStack2;*/Status InitStack_Sq2(S
12、qStack2 if(S.elem=NULL|sizeS.size)p=(ElemType*)realloc(S.elem,(S.size+S.increment)*sizeof(ElemType);if(p=NULL)return ERROR;S.elem=p;S.size+=S.increment;*(S.top+)=e;return OK;/*【题目】若顺序栈的类型重新定义如下。试编写算法,实现顺序栈的出栈操作。typedef struct ElemType *elem; / 存储空间的基址ElemType *top; / 栈顶元素的下一个位置int size; / 当前分配的存储容量i
13、nt increment; / 扩容时,增加的存储容量 SqStack2;*/Status Pop_Sq2(SqStack2 e=*(-S.top);return OK;/*【题目】试写一算法,借助辅助栈,复制顺序栈 S1 得到 S2。顺序栈的类型定义为:typedef struct ElemType *elem; / 存储空间的基址int top; / 栈顶元素的下一个位置,简称栈顶位标int size; / 当前分配的存储容量int increment; / 扩容时,增加的存储容量 SqStack; / 顺序栈WORD 完美格式 专业知识编辑整理 可调用顺序栈接口中下列函数:Status
14、InitStack_Sq(SqStack / 初始化顺序栈 SStatus DestroyStack_Sq(SqStack / 销毁顺序栈 SStatus StackEmpty_Sq(SqStack S); / 栈 S 判空,若空则返回 TRUE,否则 FALSEStatus Push_Sq(SqStack / 将元素 e 压入栈 SStatus Pop_Sq(SqStack / 栈 S 的栈顶元素出栈到 e*/Status CopyStack_Sq(SqStack S1, SqStack return TRUE; S2.elem=S1.elem;S2.top=S1.top;return TR
15、UE;/*【题目】试写一算法,求循环队列的长度。循环队列的类型定义为:typedef struct ElemType *base; / 存储空间的基址int front; / 队头位标int rear; / 队尾位标,指示队尾元素的下一位置int maxSize; / 最大长度 SqQueue;*/int QueueLength_Sq(SqQueue Q)/* 返回队列 Q 中元素个数,即队列的长度。 */ if(Q.rear-Q.frontB。试写一个比较 A 和 B 大小的算法。 (注意:在算法中,不要破坏原表 A和 B,也不一定先求得 A和 B才进行比较) 。WORD 完美格式 专业知识
16、编辑整理 顺序表类型定义如下:typedef struct ElemType *elem;int length;int size;int increment; SqList;*/char Compare(SqList A, SqList B)/* 比较顺序表 A 和 B, */* 返回, 若 AB */int i=0;while(iB.elemi)return ;elsereturn next=S)return TRUE;return FALSE;/*【题目】试写一算法,实现链栈的取栈顶元素操作。链栈的类型定义为:typedef struct LSNode ElemType data; / 数
17、据域struct LSNode *next; / 指针域 LSNode, *LStack; / 结点和链栈类型*/Status GetTop_L(LStack S, ElemType */* 若 S 是空栈,则失败,返回 ERROR。 */if(S=NULL|S-next=S)return ERROR; e=S-data;return OK;/*【题目】试写一算法,实现链队列的判空操作。链队列的类型定义为:typedef struct LQNode ElemType data; struct LQNode *next; LQNode, *QueuePtr; / 结点和结点指针类型typedef
18、 struct QueuePtr front; / 队头指针QueuePtr rear; / 队尾指针WORD 完美格式 专业知识编辑整理 LQueue; / 链队列类型*/Status QueueEmpty_LQ(LQueue Q)/* 判定链队列 Q 是否为空队列。 */* 若 Q 是空队列,则返回 TRUE,否则 FALSE。*/if(Q.front!=NULL|Q.front-next!=NULL)return FALSE;return TRUE;/*【题目】试写一算法,实现链队列的求队列长度操作。链队列的类型定义为:typedef struct LQNode ElemType dat
19、a; struct LQNode *next; LQNode, *QueuePtr; / 结点和结点指针类型typedef struct QueuePtr front; / 队头指针QueuePtr rear; / 队尾指针 LQueue; / 链队列类型*/int QueueLength_LQ(LQueue Q)/* 求链队列 Q 的长度并返回其值 */ if(Q.front=NULLint len= 0;LQNode * p=Q.front;while(p!=NULL)p=p-next;len+;return len;/*【题目】假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元
20、素结点(注意不设头指针) ,试编写相应的队列初始化、入队列和出队列的算法。带头结点循环链队列 CLQueue 的类型定义为:typedef struct LQNode WORD 完美格式 专业知识编辑整理 ElemType data;struct LQNode *next; LQNode, *CLQueue;*/Status InitCLQueue(CLQueue if(!rear) return FALSE;rear - next = rear;return TRUE; Status EnCLQueue(CLQueue head = rear - next;p = (CLQueue)mall
21、oc(sizeof(LQNode);if(!p)return FALSE; p - data = x;p - next = head;rear - next = p; rear = p; return TRUE;Status DeCLQueue(CLQueue head = rear - next; /头结点if(head = rear)return FALSE;p = head - next; /将欲删除的队头结点暂存给 px = p - data; /将欲删除的队头结点的值赋给 xhead - next = p - next;/将原队头结点的后继 p-next 赋值给头结点后继free(p
22、);return TRUE;/*【题目】试写一算法,实现带头结点单链表的判空操作。单链表的类型定义为:typedef struct LNode ElemType data; WORD 完美格式 专业知识编辑整理 struct LNode *next; LNode, *LinkList; / 结点和结点指针类型*/Status ListEmpty_L(LinkList L)/* 判定带头结点单链表 L 是否为空链表。 */* 若 L 是空链表,则返回 TRUE,否则 FALSE。*/if(L=L-next|!L-next)return TRUE;return FALSE;/*【题目】试写一算法,
23、实现带头结点单链表的销毁操作。单链表的类型定义为:typedef struct LNode ElemType data; struct LNode *next; LNode, *LinkList; / 结点和结点指针类型*/Status DestroyList_L(LinkList return OK; LNode * p=L-next, *pt;while(p!=NULL)pt=p-next;free(p);p=pt;free(L);return OK;/*【题目】试写一算法,实现带头结点单链表的清空操作。单链表的类型定义为:typedef struct LNode WORD 完美格式 专业
24、知识编辑整理 ElemType data; struct LNode *next; LNode, *LinkList; / 结点和结点指针类型*/Status ClearList_L(LinkList LNode * p=L-next, *pt;while(p!=NULL)pt=p-next;free(p);p=pt; L-next=NULL;return OK;/*【题目】试写一算法,实现带头结点单链表的求表长度操作。单链表的类型定义为:typedef struct LNode ElemType data; struct LNode *next; LNode, *LinkList; / 结点
25、和结点指针类型*/int ListLength_L(LinkList L)/* 求带头结点单链表 L 的长度,并返回长度值。*/* 若 L 不是带头结点单链表,则返回-1。 */if(L=NULL) return -1;LinkList p=L-next;int count=0;while(p!=NULL)count+;p=p-next;return count;WORD 完美格式 专业知识编辑整理 /*【题目】试写一算法,在带头结点单链表 L 插入第 i 元素 e。带头结点单链表的类型定义为:typedef struct LNode ElemType data;struct LNode *n
26、ext; LNode, *LinkList;*/Status Insert_L(LinkList L, int i, ElemType e)/* 在带头结点单链表 L 插入第 i 元素 e,并返回 OK。*/* 若参数不合理,则返回 ERROR。 */if(inext;count+; if(!p|counti-1)return ERROR; /这步很重要LinkList ptr;ptr= (LNode*)malloc(sizeof(LNode); ptr-data=e;ptr-next=p-next;p-next=ptr;return OK;/*【题目】试写一算法,在带头结点单链表删除第 i
27、元素到 e。带头结点单链表的类型定义为:typedef struct LNode ElemType data;struct LNode *next; LNode, *LinkList;*/Status Delete_L(LinkList L, int i, ElemType count+;if(p-next=NULL|counti-1) return ERROR; /这步很重要pt=p-next;p-next=p-next-next;e=pt-data;free(pt);return OK;/*【题目】试写一算法,在带头结点单链表的第 i 元素起的所有元素从链表移除,并构成一个带头结点的新链表
28、。带头结点单链表的类型定义为:typedef struct LNode ElemType data;struct LNode *next; LNode, *LinkList;*/Status Split_L(LinkList L, LinkList LinkList p= L, ptr;while(p!=NULL /P 指向第 i-1 号元素count+;if(ii-1|p-next=NULL)Li=NULL;return ERROR; /查错 ptr=(LinkList)malloc(sizeof(LNode);if(ptr=NULL) /为新链表开辟储存空间return ERROR;Li=
29、ptr;WORD 完美格式 专业知识编辑整理 Li-next=p-next;p-next=NULL;return OK; /*【题目】试写一算法,在带头结点单链表删除第 i 元素起的所有元素。带头结点单链表的类型定义为:typedef struct LNode ElemType data;struct LNode *next; LNode, *LinkList;*/Status Cut_L(LinkList L, int i)/* 在带头结点单链表 L 删除第 i 元素起的所有元素,并返回 OK。*/* 若参数不合理,则返回 ERROR。 */int count= 0;LinkList p=
30、L, pt; while(p!=NULL /P 指向第 i-1 号元素count+;if(ii-1|p-next=NULL) return ERROR; /查错if(i=1)free(L-next);L-next=NULL;return OK;pt=p-next; /pt 指向将第 i 号元素p-next=NULL;while(pt!=NULL)p=pt-next;free(pt);pt=p; return OK; WORD 完美格式 专业知识编辑整理 /*【题目】试写一算法,删除带头结点单链表中所有值为 x 的元素,并释放被删结点空间。单链表类型定义如下:typedef struct LNo
31、de ElemType data;struct LNode *next; LNode, *LinkList;*/Status DeleteX_L(LinkList L, ElemType x)/* 删除带头结点单链表 L 中所有值为 x 的元素, */* 并释放被删结点空间,返回实际删除的元素个数。*/int count= 0;LinkList p= L-next, pf=L, q;while(p!=NULL) if(p-data=x) q=p; p=p-next;free(q);pf-next=p;count+;elsepf=p;p=p-next;return count;/*【题目】试写一
32、算法,删除带头结点单链表中所有值小于 x 的元素,并释放被删结点空间。单链表类型定义如下:typedef struct LNode ElemType data;struct LNode *next;WORD 完美格式 专业知识编辑整理 LNode, *LinkList;*/Status DeleteSome_L(LinkList L, ElemType x)/* 删除带头结点单链表 L 中所有值小于 x 的元素, */* 并释放被删结点空间,返回实际删除的元素个数。*/int count= 0;LinkList p= L-next, pf=L, q;while(p!=NULL)if(p-dat
33、anext;free(q);pf-next=p;count+;elsepf=p;p=p-next;return count;/*【题目】试以顺序表 L 的 L.rcdL.length+1作为监视哨,改写教材 3.2 节中给出的升序直接插入排序算法。顺序表的类型 RcdSqList 定义如下:typedef struct KeyType key; . RcdType;typedef struct RcdType rcdMAXSIZE+1; / rcd0闲置int length; RcdSqList;*/void InsertSort(RcdSqList for(i=0;i L.rcdj-1.ke
34、y 时终止 while()/*【题目】如下所述,改写教材 1.3.2 节例 1-10 的冒泡排序算法:将算法中用以起控制作用的布尔变量 change 改为一个整型变量,指示每一趟排序中进行交换的最后一个记录的位置,并以它作为下一趟起泡排序循环终止的控制值。顺序表的类型 RcdSqList 定义如下:typedef struct KeyType key; . RcdType;typedef struct RcdType rcdMAXSIZE+1; / rcd0闲置int length; RcdSqList;*/void BubbleSort(RcdSqList 比较:“ */* void Swa
35、p(RedType 交换 */int i = L.length-1;int change=i,j;for(;(i=1)i-)change = 0;for(j=1;jL.rcdj.key)ci+; /统计序列中关键字比其他大的个数,存入 cifor(i=1;iL.length+1;i+)tempci+1=L.rcdi.key; /根据 ci的值 直接插入对应位置for(j=1;jL.length+1;j+)WORD 完美格式 专业知识编辑整理 L.rcdj.key=tempj; /把排序完的数据返回到原始序列/*【题目】已知某哈希表的装载因子小于 1,哈希函数 H(key)为关键字(标识符 )的
36、第一个字母在字母表中的序号,处理冲突的方法为线性探测开放定址法。试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法。哈希表的类型 HashTable 定义如下:#define SUCCESS 1#define UNSUCCESS 0#define DUPLICATE -1typedef char StrKeyType4;typedef struct StrKeyType key; / 关键字项int tag; / 标记 0:空;1:有效; -1:已删除void *any; / 其他信息 RcdType;typedef struct RcdType *rcd; / 存储空间基址int size; / 哈希表容量int count; / 表中当前记录个数 HashTable;*/void PrintKeys(HashTable ht, void(*print)(StrKeyType)/* 依题意用 print 输出关键字 */int n,i;for(char c=A;c=Z;c+)n = (c-A)% ht.size;i = n;while(n+1)% ht.size!=i)if(ht.rcdn.tag!=-1n = (n+1)% ht.size;/*