void Method1(ALGraph G, Stack S) { int TotalCreadit = 0; for (int i = 0; i < G.VexNum; i++) TotalCreadit += G.Vertics[i].Credit; int EachSemCredit = TotalCreadit / G.ExtraInfo->SemesterNum; FILE* fp = fopen(TeachPlanPath, "w"); for (int i = 0; i < G.ExtraInfo->SemesterNum; i++) { int tmp = 0; printf("\n第%d个学期的课程:", i + 1); fprintf(fp, "\n第%d个学期的课程:", i + 1); do { printf("%s ", G.Vertics[S.Vertics[S.pos]].Date); fprintf(fp, "%s ", G.Vertics[S.Vertics[S.pos]].Date); tmp += G.Vertics[S.Vertics[S.pos++]].Credit; } while (tmp < EachSemCredit && S.pos < G.VexNum); } fclose(fp); }代码流程思路
时间: 2024-01-27 14:05:24 浏览: 15
该函数的主要功能是根据给定的有向图G和栈S,将课程按照学期平均分配,并输出到文件中。
具体流程如下:
1. 计算总学分TotalCreadit,用于计算每个学期平均需要修多少学分。
2. 计算每个学期平均需要修多少学分,存储在变量EachSemCredit中。
3. 打开文件TeachPlanPath,用于输出每个学期的课程。
4. 通过循环,依次输出每个学期的课程。
5. 在每个学期中,通过循环和指针操作,依次输出课程名称,并计算该学期已修学分数。
6. 当该学期已修学分数达到平均值EachSemCredit或者所有课程都已输出时,退出循环。
7. 将该学期的课程输出到文件中。
8. 关闭文件。
相关问题
void BFS(ALGraph *G,int i);
好的,这是一个关于图的广度优先遍历的问题,需要实现一个函数BFS来进行广度优先遍历。以下是一段可能的C++代码实现:
```
struct QueueNode {
int data;
QueueNode* next;
};
struct Queue {
QueueNode* front;
QueueNode* rear;
};
void InitQueue(Queue* Q) {
Q->front = Q->rear = new QueueNode;
Q->front->next = nullptr;
}
void EnQueue(Queue* Q, int data) {
QueueNode* node = new QueueNode;
node->data = data;
node->next = nullptr;
Q->rear->next = node;
Q->rear = node;
}
int DeQueue(Queue* Q) {
if (Q->front == Q->rear) {
return -1;
}
QueueNode* node = Q->front->next;
int data = node->data;
Q->front->next = node->next;
if (Q->rear == node) {
Q->rear = Q->front;
}
delete node;
return data;
}
void BFS(ALGraph *G, int i) {
bool visited[G->vexnum]; //记录每个顶点是否被访问过
memset(visited, false, G->vexnum * sizeof(bool));
visited[i] = true; //标记起点i已被访问过
cout << G->adjlist[i].data << " "; //输出起点i的值
Queue Q;
InitQueue(&Q); //初始化队列Q
EnQueue(&Q, i); //将起点i入队
while (Q.front != Q.rear) {
int j = DeQueue(&Q); //取出队头元素,即当前遍历到的顶点
for (EdgeNode* p = G->adjlist[j].firstedge; p != nullptr; p = p->next) {
int k = p->adjvex; //取出当前顶点的邻接点
if (!visited[k]) { //如果该邻接点未被访问过
visited[k] = true; //标记该邻接点已被访问过
cout << G->adjlist[k].data << " "; //输出该邻接点的值
EnQueue(&Q, k); //将该邻接点入队
}
}
}
}
```
上述代码使用了队列来实现广度优先遍历,遍历到每个顶点时将其值输出。函数BFS的参数是一个指向图的指针G和一个起点i。函数内部使用了邻接表来表示图,visited数组来记录每个顶点是否被访问过,Queue结构体来实现队列。函数先将起点i标记为已访问,输出其值,然后将其入队。之后进入循环,每次取出队头元素j,遍历其所有邻接点,如果邻接点k未被访问过,则标记为已访问,输出其值,然后将其入队。直到队列为空,遍历结束。
void InitGraph(ALGraph *G) { int i; G->vexnum = G->arcnum = 0; for (i = 0; i < MAX; i++) { G->vertices[i].data =0; G->vertices[i].firstarc = NULL; } }画一个这段代码的流程图
好的,让我来画一个流程图:
```
开始
初始化G的顶点数和边数为0
for循环,i从0到MAX-1:
将G中第i个顶点的数据置为0
将G中第i个顶点的第一个邻接点指针置为NULL
结束
```
流程图如下:
```
+---------+
| 开始 |
+---------+
|
|
v
+-----------------------------------+
| 初始化G的顶点数和边数为0 |
+-----------------------------------+
|
|
v
+-----------------------------------+
| for循环,i从0到MAX-1: |
| 将G中第i个顶点的数据置为0 |
| 将G中第i个顶点的第一个邻接点 |
| 指针置为NULL |
+-----------------------------------+
|
|
v
+---------+
| 结束 |
+---------+
```
希望这个流程图能够帮助您理解代码的执行流程。
相关推荐
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)