已知树采用孩子-兄弟链存储,编写算法求树的高度
int Height(CSTree bt) {
//递归求以孩子链表表示树的深度
int hc, hs;
if (bt = NULL)
return 0;
else//否则,高度取子女高度+1和兄弟子树高度的大者
{
hc = Height(bt->firstchild);//第一子女树高
hs = Height(bt->nextsibling);//兄弟树高
if (hc + 1 > hs)
return hc + 1;
else
return hs;
}
}
利用栈,判断给定的字符串是否是回文串
int ispalindrome(char str[]){
Stack S;
char c;
InitStack(&S);
int length = strlen(str);
for (int i = 0; i < length; ++i)
Push(&S, str[i]);
for (int i = 0; i < length / 2; ++i)
{
Pop(&S, &c);
if (str[i] != c)
return 0;
}
return 1;
}
已知无向连通图采用邻接表方式存放,求从一点vi到另一点vj(vi不等于vj)所经结点数目最少的路径
typedef char VertexData;
#define MaxSizevexnum 20
typedef struct ArcNode//边表
{
int adjvex;
struct ArcNode* nextarc;
//int info;权值
}ArcNode;
typedef struct VertexNode//顶点表
{
VertexData data;
ArcNode* firstarc;
}VertexNode;
typedef struct
{
VertexNode vertex[MaxSizevexnum];
int vexnum, arcnum;
}AdjList;//基于邻接表的图
typedef struct
{
int data;//顶点编号
int parent;//前一个顶点编号
}Queue;
void shortpath(AdjList G, int vi, int vj)
{
Queue Q[Maxvexnum];
int front = -1, rear = -1;
ArcNode* p;
int w, i;
int visited[Maxvexnum];
for (i = 0; i < G.vexnum; i++)
visited[i] = 0;
rear++;
Q[rear].data = vi;
Q[rear].parent = -1;
visited[vi] = 1;
while (front != rear)
{
front++;
w = Q[front].data;
if (w == vj)
{
i = front;
while (Q[i].parent != -1)
{
printf("%d", Q[i].data);
i = Q[i].parent;
}
printf("%d", Q[i].data);
break;
}
p = G.vertex[w].firstarc;
while (p != NULL)
{
if (visited[p->adjvex] == 0)
{
visited[p->adjvex] = 1;
rear++;
Q[rear].data = p->adjvex;
Q[rear].parent = front;
}
p = p->nextarc;
}
}
}
在一个顺序表中,编写算法删除所有值介于x ,y之间的所有元素(x<=y)的高效算法
算法思想:从前向后扫描顺序表L,用k记录下元素值在s和t之间的元素的个数(初始时k=0),对于当前扫描的元素,若其值不在s和t之间,则前移k个位置,否则执行k++。由于这样每个不在s到t之间的元素仅移动一次,因此算法频率高
int delxy(SeqList L, int x, int y)
{
int i, k = 0;
if (L.length == 0 || x > y)
return 0;//顺序表为空或者输入x,y不合法
for (i = 0; i < L.length; i++)
{
if (L.data[i] >= x && L.data[i] <= y)
k++;
else
L.data[i - k] = L.data[i];//当前元素前移k个位置
}
L.length -= k;//长度减小
return 1;
}