//http://www.cskaoyan.com/thread-756-1-1.html
/*-------------------------------------------------------C语言部分------------------------------------------------------------------*/
/*二.输入N个数,编写一个递归函数,求出N个数中的最大值。*/
int findMax(int n)
{
int max; //记录前n-1个数中的最大值
int num; //读取的第n个值
if(n == 1) //求前1个数中的最大值
{
scanf("%d",&num);
return num;
}
else
{
//求前n个数的最大值
max = findMax(n - 1); //step1:求前n-1个数的最大值
scanf("%d",&num); //step2:读取第n个数
if(num > max) //step3:返回num ,max之间的最大值
max = num;
else
return max;
}
}
/*三.编写函数str(s,t),返回字符串s在t中出现的次数。*/
#include <stdio.h>
#include <stdlib.h>
int findsub(char* src, char* s)
{
char *ptr = src, *p = s; //定义两个指针
char *ptr2 = src+strlen(src), *prev=NULL; //ptr2为src的末位置指针
int len = strlen(s), n = 0; //子串的长度和计数器
for(;*ptr;ptr++) //循环整个串
{
if(ptr2-ptr < len) //如果一开始子串就大于src,则退出
break;
for(prev = ptr;*prev == *p;prev++,p++) //寻找第一个相等的位置,然后从此位置开始匹配子串
{
if(*(p+1) == 0 || *(p+1) == 10) //如果已经到了子串的末尾
{
n++; //自增
p=s; //重新指向子串
break;//退出
}
}
}
return n;
}
int main(void)
{
char a[81],b[81]; //定义两个字符数组
printf("输入原字符串:");
fgets(a,81,stdin); //输入
printf("输入子字符串:");
fgets(b,81,stdin);
printf("找到:%d\n",findsub(a,b));
return 0;
}
/*四.N个班参加比赛,每个班人数不同,要求输入人名和分数,按照每班平均分排序。*/
/*--------------------------------------------------------数据结构部分---------------------------------------------------------------*/
/*二.已知一个带头结点的双向链表L,包括以下几个域,data存放数据,prior指向前一结点,next指向后一结点,freq记录结点访问
频度,初始化为0,每访问一次加一。
编写函数Locate(L,x)访问链表中数据为X的结点,并对该结点调整,使其位于频度大于它的之后,小于它的之前,使频度越大的
越靠近头结点。*/
typedef struct DLinkList //双链表结点类型
{
ElemType data;
struct DLinkList *prior;
struct DLinkList *next;
int freq;
}DLinkList;
int Locate(DLinkList *L,int x)
{
DLinkList *p = L->next,*q;
while(p != NULL && p->data != x)
p = p->next;
if(p == NULL)
return 0;
else
{
p->freq++;
q = p->prior;
if(q != L)
{
while(q != L && q->freq < p->freq)
q = q->prior;
p->prior->next = p->next;
if(p->next != NULL)
p->next->prior = p->prior;
p->next = q->next;
if(q->next != NULL)
q->next->prior = p;
q->next = p;
p->prior q;
}
return 1;
}
}
/*三.树的每一层的结点数为此层的宽度,二叉树的宽度定义为各层宽度的最大值。要求写一算法,返回二叉树的宽度,并输出此层的叶
结点。对树只能遍历一次。*/
//采用分层遍历的方法求出所有结点的层编号,然后求出各层的结点总数,通过比较找出层结点总数最多的值。
int BTWidth(BTNode *b)
{
struct
{
int lno; //结点的层次编号
BTNode *p; //结点指针
}Qu[MaxSize]; //定义顺序非环形队列
int front = 0,rear = 0; //定义队首队尾指针
int lnum,max,i,n;
if(b != NULL)
{
rear++;
Qu[rear].p = b; //根结点指针入队
Qu[rear].lno = 1; //根结点的层次编号为1
while(rear != front) //队列不为空
{
front++;
b = Qu[front].p; //队头出队
lnum = Qu[front].lno;
if(b->lchild != NULL) //左孩子入队
{
rear++;
Qu[front].p = b->lchild;
Qu[front].lno = lnum + 1;
}
if(b->rchild != NULL) //右孩子入队
{
rear++;
Qu[front].p = b->rchild;
Qu[front].lno = lnum + 1;
}
}
printf("各结点的层编号:\n");
for(i = 1;i <= rear;i++)
printf(" %c,%d\n",Qu[i].p->data,Qu[i].lno);
max = 0; lnum = 1;i = 1;
while(i <= rear)
{
n = 0;
while(i <= rear && Qu[i].lno == lnum)
{
n++;
i++;
}
lnum = Qu[i].lno;
if(n > max)
max = n;
}
return max;
}
else
return 0;
}
/*四.无向图以邻接表存储,删除结点I到J的一条弧。*/
void DeletEdge(AdjList g,int i,j)
{
//先删除顶点i的边(i,j)
p = g[i].firstarc;
pre = NULL; //pre是前驱指针
while (p)//删顶点i 的边结点(i,j)
if (p->adjvex == j)
{
if(pre == NULL)
g[i].firstarc = p->next;
else
pre->next = p->next;
free(p);//释放结点空间
}
else
{
pre = p;
p = p->next;//沿链表继续查找
}
//删顶点j 的边结点(j,i)
p = g[j].firstarc;
pre = NULL;
while(p)
if (p->adjvex == i)
{
if(pre == NULL)
g[j].firstarc = p->next;
else
pre->next = p->next;
free(p);//释放结点空间
}
else
{
pre = p;
p = p->next;//沿链表继续查找
}
}