资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第一章 绪论 1.16 void print_descending(int x,int y,int z)/按从大到小顺序输出三个数 scanf(“%d,%d,%d“,if(xy; /为表示交换的双目运算符,以下同if(yz;if(xy; /冒泡排序printf(“%d %d %d“,x,y,z); /print_descending 1.17 Status fib(int k,int m,int if(ka.length) return INFEASIBLE;for(count=1;i+count-1va.listsize) return ERROR;va.length+;for(i=va.length-1;va.elemixi-)va.elemi+1=va.elemi;va.elemi+1=x;return OK; /Insert_SqList 2.12 int ListComp(SqList A,SqList B)/比较字符表 A 和 B,并用返回值表示结果,值为正,表 示 AB;值为负,表示 Anext;pp=p-next);return p; /Locate 2.14 int Length(LinkList L)/求链表的长度 for(k=0,p=L;p-next;p=p-next,k+);return k; /Length 2.15 void ListConcat(LinkList ha,LinkList hb,LinkList p=ha;while(p-next) p=p-next;p-next=hb; /ListConcat 2.16 见书后答案. 2.17 Status Insert(LinkList q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=1)q.next=p;L=q; /插入在链表头部elsewhile(-i1) p=p-next;q-next=p-next;p-next=q; /插入在第 i 个元素的位置 /Insert 2.18 Status Delete(LinkList /删除第一个元素elsep=L;while(-i1) p=p-next;p-next=p-next-next; /删除第 i 个元素 /Delete 2.19 Status Delete_Between(Linklist while(p-next-datanext; /p 是最后一个不大于 mink 的元素if(p-next) /如果还有比 mink 更大的元素q=p-next;while(q-datanext; /q 是第一个不小于 maxk 的元素p-next=q; /Delete_Between 2.20 Status Delete_Equal(Linklist q=p-next; /p,q 指向相邻两元素while(p-next)if(p-data!=q-data)p=p-next;q=p-next; /当相邻两元素不相等时,p,q 都向后推一步elsewhile(q-data=p-data) free(q);q=q-next; p-next=q;p=q;q=p-next; /当相邻元素相等时删除多余元素/else/while /Delete_Equal 2.21 void reverse(SqList iA.elemj; /reverse 2.22 void LinkList_reverse(Linklist 为简化算法,假设表长大于 2 p=L-next;q=p-next;s=q-next;p-next=NULL;while(s-next)q-next=p;p=q;q=s;s=s-next; /把 L 的元素逐个插入新表表头q-next=p;s-next=q;L-next=s; /LinkList_reverse 分析:本算法的思想是,逐个地把 L 的当前元素 q 插入新的链表头部,p 为新表表 头. 2.23 void merge1(LinkList q=B-next;C=A;while(pp-next=q; /将 B 的元素插入if(s)t=q-next;q-next=s; /如 A 非空,将 A 的元素插入p=s;q=t;/while /merge1 2.24 void reverse_merge(LinkList pb=B-next;pre=NULL; /pa 和 pb 分别指向 A,B 的当前元素while(pa|pb)if(pa-datadata|!pb)pc=pa;q=pa-next;pa-next=pre;pa=q; /将 A 的元素插入新表elsepc=pb;q=pb-next;pb-next=pre;pb=q; /将 B 的元素插入新表pre=pc;C=A;A-next=pc; /构造新表头 /reverse_merge 分析:本算法的思想是,按从小到大的顺序依次把 A 和 B 的元素插入新表的头部 pc 处,最后处理 A 或 B 的剩余元素. 2.25 void SqList_Intersect(SqList A,SqList B,SqList j=1;k=0;while(A.elemiif(A.elemi=B.elemj)C.elem+k=A.elemi; /当发现了一个在 A,B 中都存在的元素,i+;j+; /就添加到 C 中/while /SqList_Intersect 2.26 void LinkList_Intersect(LinkList A,LinkList B,LinkList q=B-next;pc=(LNode*)malloc(sizeof(LNode);while(pelse if(p-dataq-data) q=q-next;elses=(LNode*)malloc(sizeof(LNode);s-data=p-data;pc-next=s;pc=s;p=p-next;q=q-next;/whileC=pc; /LinkList_Intersect 2.27 void SqList_Intersect_True(SqList j=1;k=0;while(A.elemielse if(A.elemi!=A.elemk)A.elem+k=A.elemi; /当发现了一个在 A,B 中都存在的元素i+;j+; /且 C 中没有,就添加到 C 中/whilewhile(A.elemk) A.elemk+=0; /SqList_Intersect_True 2.28 void LinkList_Intersect_True(LinkList q=B-next;pc=A;while(pelse if(p-dataq-data) q=q-next;else if(p-data!=pc-data)pc=pc-next;pc-data=p-data;p=p-next;q=q-next;/while /LinkList_Intersect_True 2.29 void SqList_Intersect_Delete(SqList j=0;k=0;m=0; /i 指示 A 中元素原来的位置,m 为移动后的位置while(iC.elemk) k+;elsesame=B.elemj; /找到了相同元素 samewhile(B.elemj=same) j+;while(C.elemk=same) k+; /j,k 后移到新的元素while(inext;q=C-next;r=A-next;while(pelse if(p-dataq-data) q=q-next;elseu=p-data; /确定待删除元素 uwhile(r-next-datanext; /确定最后一个小于 u 的元素指针 rif(r-next-data=u)s=r-next;while(s-data=u)t=s;s=s-next;free(t); /确定第一个大于 u 的元素指针 s/whiler-next=s; /删除 r 和 s 之间的元素/ifwhile(p-data=u) p=p-next;while(q-data=u) q=q-next;/else/while /LinkList_Intersect_Delete 2.31 Status Delete_Pre(CiLNode *s)/删除单循环链表中结点 s 的直接前驱 p=s;while(p-next-next!=s) p=p-next; /找到 s 的前驱的前驱 pp-next=s;return OK; /Delete_Pre 2.32 Status DuLNode_Pre(DuLinkList !p-next-pre;p=p-next) p-next-pre=p;return OK; /DuLNode_Pre 2.33 Status LinkList_Divide(LinkList A=(CiList*)malloc(sizeof(CiLNode);p=A;B=(CiList*)malloc(sizeof(CiLNode);q=B;C=(CiList*)malloc(sizeof(CiLNode);r=C; /建立头结点while(s)if(isalphabet(s-data)p-next=s;p=s;else if(isdigit(s-data)q-next=s;q=s;elser-next=s;r=s;/whilep-next=A;q-next=B;r-next=C; /完成循环链表 /LinkList_Divide 2.34 void Print_XorLinkedList(XorLinkedList L)/从左向右输出异或链表的元素值 p=L.left;pre=NULL;while(p)printf(“%d“,p-data);q=XorP(p-LRPtr,pre);pre=p;p=q; /任何一个结点的 LRPtr 域值与其左结点指针进行异或运算即得到 其右结点指针 /Print_XorLinkedList 2.35 Status Insert_XorLinkedList(XorLinkedList pre=NULL;r=(XorNode*)malloc(sizeof(XorNode);r-data=x;if(i=1) /当插入点在最左边的情况p-LRPtr=XorP(p.LRPtr,r);r-LRPtr=p;L.left=r;return OK;j=1;q=p-LRPtr; /当插入点在中间的情况while(+jLRPtr,pre);pre=p;p=q;/while /在 p,q 两结点之间插入if(!q) return INFEASIBLE; /i 不可以超过表长p-LRPtr=XorP(XorP(p-LRPtr,q),r);q-LRPtr=XorP(XorP(q-LRPtr,p),r);r-LRPtr=XorP(p,q); /修改指针return OK; /Insert_XorLinkedList 2
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号