摘要: 思路:先递归调用本算法,反转打印除去第一个字符外的字符串,再打印出第一个字符即可。时间复杂度:设n为字符串的长度,该算法访问每个字符各一次,时间代价为O(n)。扩展:从键盘读入一个任意长的字符串,该字符串以“.”作为结尾,要求打印除出它的倒序字符串(不包含".")。程序代码1: void printRevString(char *s) { if(s[0] == '\0') //空串 return; if(s[1] == '\0') //只有一个字符 putchar(s[0]); else { printRevString(s... 阅读全文
posted @ 2012-09-09 21:44 毛毛hhmm 阅读(1934) 评论(0) 推荐(0) 编辑
摘要: 问题描述:编写一个实现通配符匹配的函数pattern_index(),其中通配符取"?",它可以和任一字符匹配成功,例如,pattern_index(“there",”?re")返回的结果是2。时间复杂度:最好情况是p的第一个字符与t的所有字符均不相同,则比较次数为O(n);最坏情况是每次比较p都要到最后一个字符失败,则总的比较次数为m*(n-m+1),当n足够大时,时间代价为O(n*m)。程序代码: int pattern_index(PSeqString t,PSeqString p) { int ti,pi; for(ti = 0;ti <= 阅读全文
posted @ 2012-09-09 21:39 毛毛hhmm 阅读(383) 评论(0) 推荐(0) 编辑
摘要: 思路:另外新建一个独立的链表作为合并的结果。设置两个指针,分布从两个表头开始,依次向后移动,并不断比较他们所指的元素的大小关系,每次把比较小的结点复制到新的循环链表中。时间复杂度:每个结点访问一次,时间代价为O(n)。其中,n为链表list1和list2长度的最大值。程序代码: LinkList combine_clink(LinkList list1,LinkList list2) { LinkList list3 = (LinkList)malloc(sizeof(struct Node)); PNode p1 = list1->link,p2 = list2->link,.. 阅读全文
posted @ 2012-09-09 21:24 毛毛hhmm 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 时间复杂度:每个节点各访问一次,时间复杂度为O(n)。程序代码: int length(LinkList llist) { if(llist == NULL) return 0; return 1+length(llist->link); } 阅读全文
posted @ 2012-09-09 20:58 毛毛hhmm 阅读(457) 评论(0) 推荐(0) 编辑
摘要: 问题描述:假设有一个循环链表的长度大于1,且表中既无头结点也无头指针,已知s为指向链表中某结点的指针,试编写算法在链表中删除s所指结点的前驱结点。思路:设置一个指针p,从s开始遍历整个表,停在s的前驱结点的前驱结点的位置,以便于删除s的前驱结点。程序代码: void deleteAheadElement(PNode s) { PNode p,q; p = s; while(p->link->link != s) p = p->link; q = p->link; p->link = s; free(q); } 阅读全文
posted @ 2012-09-09 17:02 毛毛hhmm 阅读(946) 评论(0) 推荐(0) 编辑
摘要: 思路:如果找到一个需要删除的元素就立即删除,可能会造成许多元素被多次向前移动,时间复杂度为O(n2)。为了提高效率,可以设置两个下标变量si和di。si指向源,di指向目标。先是si向后移,直到si指向的数不在(x,y)的范围内。然后将源复制到目标,直到si指向的数在(x,y)的范围内。时间复杂度:该每个元素都要检查一次,判断是否应该删除,最后情况下,第一个元素在(x,y)范围内,以后的元素都不在次范围内,此时需要移动n-1次,所以时间代价为O(n)。程序代码: void del_elem(PSeqList plist,int x,int y) { int si,di,n; s... 阅读全文
posted @ 2012-09-09 16:44 毛毛hhmm 阅读(1186) 评论(0) 推荐(0) 编辑
摘要: 思路:用三个指针p,q,r来帮助完成单链表的置逆,修改所有结点的指针,使头结点的指针指向最后一个结点,第一个结点的指针置空,其余结点的指针指向其前一个结点。时间复杂度:while循环中的语句最多执行n次,时间复杂度为O(n)。带头结点的链表: void rev_link(LinkList llist) { PNode p,q,r; p = llist->link; if(p == NULL) //空表 return; q = p->link; if(q == NULL) //只有一个结点 return; ... 阅读全文
posted @ 2012-09-09 16:20 毛毛hhmm 阅读(246) 评论(0) 推荐(0) 编辑
摘要: (1).在删除算法中,如果是不带头结点的链表,则首先需要判断头指针是否为空;(2).对插入或删除的参数x是否第一个结点需要增加特殊的判断和处理;(3).在函数传递参数时,Linklist必须改为Linklist*类型,才能保证把删除以后的链表正确返回。 阅读全文
posted @ 2012-09-09 16:00 毛毛hhmm 阅读(599) 评论(0) 推荐(0) 编辑