数据结构
第一题 拓扑排序
1、有向图G(V,E),具有n个顶点,以领接表的形式存储,设计一个算法,判断图中是否存在回路
思路:
- 拓扑排序判断是否存在环,如果拓扑序列最后个数与顶点个数相等,则说明存在环
代码:
typedef struct ArcNode{ //边结点
int adjvex;
struct ArcNode *next;
}ArcNode;
typedef struct VNode{ //顶点节点
int data;
struct ArcNode *firstarc;
}VNode;
typedef struct AGraph{ //领接表
VNode adjlist[maxsize];
int vexnum, edgenum;
}AGraph;
//拓扑排序判断是否有回路
void Indgree(AGraph *G, int in[]){
for(int i=0; i < G->vexnum; i++){ //入度数组初始化
in[i] = 0;
}
for(int i=0; i <G->vexnum; i++){ //遍历领接表,计算入度
ArcNode *p = G->adjlist[i].firstarc;
while(p != NULL){
in[p->adjvex]++;
p = p->next;
}
}
}
bool iscicle(AGraph *G, int tp[]){ //tp记录拓扑序列
int in[G->vexnum];
int stack[G->vexnum];
int top = -1,i,count=0,k; //count记录拓扑序列个数
ArcNode *p;
Indgree(G, in); //计算入度
for(i=0; i < G->vexnum; i++){ //将入度为0的顶点入栈
if(in[i] == 0){
stack[++top] = i;
}
}
while(top != -1){ //栈不空,循环
k = stack[top--];
tp[count++] = k; //记录拓扑序列
p = G->adjlist[k].firstarc;
while(p!=NULL){ //将入度为0连接的边的入度减1
in[p->adjvex]--;
if(in[p->adjvex] == 0){ //入度为0,入栈
stack[++top] = p->adjvex;
}
p = p->next;
}
}
if(count == G->vexnum){ //不存在环
printf("不存在环");
return true;
}
else return false; //存在环
}
程序设计
第一题
1、将0元素移动到数组A的后面, 非0元素移动到数组A的前面
思路:
- 前移k个数不需要的数(0)
代码:
void move(int A[], int n){
int i,k=0; //k为非0元素个数
for(i=0; i < n; i++){
if(A[i]!=0){ //非0元素前移
A[k++] = A[i];
}
}
for(i=k; i < n; i++){
A[i] = 0;
}
}