void Sort1(VexNode* t, Message* s, int VexNum) //按各学期负担均匀输出并保存教学计划 { FILE* fp = fopen("E:/sjjg/作业/结果.txt", "w"); int c = 0; //用于输出课程信息 for (int i = 0; i < s->SemesterNum; i++) { int b = 0; //累计每学期学分 printf("\n第%d个学期的课程为:", i + 1); fprintf(fp, "\n第%d个学期的课程为:", i + 1); for (int j = 0; j < VexNum / s->SemesterNum; j++) { if (b + t[c].Credit <= s->MaxCredit) //判断是否超过最大学分 { if (c == VexNum)break; printf("%s ", t[c].Date); //输出课程 fprintf(fp, "%s ", t[c].Date); b = b + t[c].Credit; //学分累计 c++; //指向下一课程 } } if (i < VexNum % s->SemesterNum) //加入平均后多余的课程 { if (c == VexNum)break; printf("%s ", t[c].Date); //输出课程 fprintf(fp, "%s ", t[c].Date); b = b + t[c].Credit; //学分累计 c++; //指向下一课程 } } }代码实现流程
时间: 2024-01-28 22:02:51 浏览: 91
这段代码实现了按照各学期负担均匀输出并保存教学计划的功能。具体实现流程如下:
1. 打开一个名为"结果.txt"的文件,以便将输出结果保存在该文件中。
2. 定义一个变量c,用于输出课程信息。
3. 对于每一个学期,先输出该学期的序号,然后依次输出该学期中的每一门课程。
4. 对于每一门课程,判断该课程的学分是否超过了最大学分s->MaxCredit。如果没有超过,则输出该课程的名称t[c].Date,并将该课程的学分加入到学分累计变量b中,然后将指针c指向下一门课程。如果超过了最大学分,则跳过该课程。
5. 如果该学期的课程数目不足以平均分配给每个学期,则将多余的课程加入到前几个学期中。
6. 最后将输出结果保存到文件中,关闭文件。
相关问题
#define MAXVER 10 #define MAXEDG 13 typedef char VertexType; typedef struct EdgeNode { int v_id; struct EdgeNode* next_edge; }ENode; typedef struct VertexNode { VertexType val; ENode* first_edge; }VNode; typedef struct Graph { int vexnum; //顶点数 int edgenum; //边数 VNode vertexs[MAXVER]; }Graph; void creatGraph(Graph* G, VertexType ver[], VertexType edge[][2]); void DFS(Graph* G, int k, int*_visit, char** res); void BFS(Graph* G, int*_visit, char res[]); void DestroyGraph(Graph*G); void Print(Graph*G);根据初始条件补全下方函数代码,要求使用c语言
根据初始条件,下面是这些函数的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXVER 10
#define MAXEDG 13
typedef char VertexType;
typedef struct EdgeNode {
int v_id;
struct EdgeNode* next_edge;
} ENode;
typedef struct VertexNode {
VertexType val;
ENode* first_edge;
} VNode;
typedef struct Graph {
int vexnum; // 顶点数
int edgenum; // 边数
VNode vertexs[MAXVER];
} Graph;
// 创建图
void creatGraph(Graph* G, VertexType ver[], VertexType edge[][2]) {
int i, j, k;
G->vexnum = sizeof(ver) / sizeof(VertexType);
G->edgenum = sizeof(edge) / sizeof(VertexType) / 2;
for (i = 0; i < G->vexnum; i++) {
G->vertexs[i].val = ver[i]; // 顶点数组赋值
G->vertexs[i].first_edge = NULL; // 初始化邻接表
}
for (k = 0; k < G->edgenum; k++) {
i = j = -1;
// 查找边的两个顶点在顶点数组中的下标
for (int l = 0; l < G->vexnum; l++) {
if (edge[k][0] == G->vertexs[l].val) {
i = l;
}
if (edge[k][1] == G->vertexs[l].val) {
j = l;
}
}
if (i != -1 && j != -1) {
// 创建边节点插入邻接表
ENode* p = (ENode*)malloc(sizeof(ENode));
p->v_id = j;
p->next_edge = G->vertexs[i].first_edge;
G->vertexs[i].first_edge = p;
p = (ENode*)malloc(sizeof(ENode));
p->v_id = i;
p->next_edge = G->vertexs[j].first_edge;
G->vertexs[j].first_edge = p;
}
}
}
// 深度优先遍历
void DFS(Graph* G, int k, int*_visit, char** res) {
int i;
res[*_visit] = &(G->vertexs[k].val); // 将遍历到的顶点存入 res 数组
*_visit += 1;
_visit[k] = 1; // 标记该顶点已被访问
ENode* p = G->vertexs[k].first_edge;
while (p) {
if (!_visit[p->v_id]) {
DFS(G, p->v_id, _visit, res); // 递归访问邻接顶点
}
p = p->next_edge;
}
}
// 广度优先遍历
void BFS(Graph* G, int*_visit, char res[]) {
int i, j, k;
int queue[MAXVER], front = 0, rear = 0;
for (i = 0; i < G->vexnum; i++) {
if (!_visit[i]) {
res[rear++] = G->vertexs[i].val; // 将未被访问的顶点加入队列
_visit[i] = 1; // 标记该顶点已被访问
}
while (front < rear) {
k = queue[front++]; // 出队一个顶点
ENode* p = G->vertexs[k].first_edge;
while (p) {
if (!_visit[p->v_id]) {
res[rear++] = G->vertexs[p->v_id].val; // 将邻接顶点加入队列
_visit[p->v_id] = 1; // 标记该顶点已被访问
}
p = p->next_edge;
}
}
}
}
// 销毁图
void DestroyGraph(Graph*G) {
G->vexnum = 0;
G->edgenum = 0;
for (int i = 0; i < G->vexnum; i++) {
ENode* p = G->vertexs[i].first_edge;
while (p) {
ENode* q = p;
p = p->next_edge;
free(q); // 释放邻接表节点
}
}
}
// 打印图
void Print(Graph*G) {
int i;
printf("顶点数:%d,边数:%d\n", G->vexnum, G->edgenum);
printf("顶点数组:");
for (i = 0; i < G->vexnum; i++) {
printf("%c ", G->vertexs[i].val);
}
printf("\n邻接表:\n");
for (i = 0; i < G->vexnum; i++) {
ENode* p = G->vertexs[i].first_edge;
printf("%c -> ", G->vertexs[i].val);
while (p) {
printf("%c ", G->vertexs[p->v_id].val);
p = p->next_edge;
}
printf("\n");
}
}
```
第1关:创建无向图的邻接表表示,并求无向图 #include <iostream> #include <stdio.h> using namespace std; #define MVNum 100 /*预定义图的最大顶点数*/ typedef char VerTexType; /*顶点信息数据类型*/ typedef struct ArcNode /*边表结点*/ { int adjvex; /*邻接点*/ struct ArcNode *nextarc; //指向下一条边的指针 } ArcNode; typedef struct VNode /*头结点类型*/ { VerTexType data; /*顶点信息*/ ArcNode *firstarc; /*邻接链表头指针*/ } VNode, AdjList[MVNum]; typedef struct /*邻接表类型*/ { AdjList vertices; /*存放头结点的顺序表*/ int vexnum, arcnum; /*图的顶点数与边数*/ } ALGraph; void Create(ALGraph &G); //建立无向图的邻接表,G是邻接表引用变量; void Print(ALGraph G); //输出邻接表存储结构 int Degree(ALGraph G,VerTexType v); /* 返回以邻接表为存储结构的无向图G中顶点v的度,若该顶点不存在返回-1 */ void Destroy(ALGraph &G);//销毁图的邻接表 //完成以下两个函数的编写 /**************void Create(ALGraph &G) //建立无向图的邻接表********/ /******************begin **********/ /******************end **********/ /**************int Degree(ALGraph G,VerTexType v)********/ /****************
### C++ 实现无向图的邻接表表示及计算顶点度数
在 C++ 中,可以通过数组模拟链式前向星结构来构建无向图的邻接表表示,并通过遍历该邻接表来统计指定顶点的度数。以下是详细的实现方法:
#### 邻接表存储方式
邻接表是一种常见的图数据结构表示法,适合稀疏图场景下的内存优化。对于无向图而言,每条边 `(u, v)` 应当被记录两次:`u -> v` 和 `v -> u`。
可以使用如下变量定义:
- **`h[]`**: 记录每个节点的第一条边的位置索引。
- **`e[]`**: 存储当前边的目标节点编号。
- **`ne[]`**: 存储下一条边的位置索引(形成链表)。
- **`idx`**: 边的数量计数器,用于动态分配新的边位置。
初始化时需将 `h[]` 数组置为 `-1` 表示初始状态为空链表。
#### 添加边的操作
为了高效地添加边到邻接表中,可设计函数 `add(int a, int b)` 来完成操作。每次调用此函数会更新两个方向上的连接关系[^1]。
```cpp
void add(int a, int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
```
#### 主程序逻辑
主程序部分负责读取输入数据、建立邻接表以及查询目标顶点的度数。具体流程如下:
1. 输入顶点数量 `n` 和边数量 `m`;
2. 初始化头指针数组 `h[]` 的值均为 `-1`;
3. 接收所有顶点名称字符串作为辅助信息(本题未实际利用这些字符);
4. 循环接收所有的边信息并调用 `add()` 函数分别加入正反两条路径;
5. 最终根据给定的顶点序号 `k` 进行度数统计并通过循环访问其对应的链表长度得出结果。
完整代码展示如下所示:
```cpp
#include <iostream>
using namespace std;
const int N = 1e5 + 10; // 定义最大可能结点数目加缓冲区大小
int n, m; // 结点总数与边数
int h[N], e[N], ne[N], idx;
// 构建无向图中的单条边(双向往返)
void add(int a, int b){
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
// 获取基本参数
cin >> n >> m;
// 初始化头部标记为无效(-1代表空链接)
for (int i = 0; i < n; ++i) h[i] = -1;
// 忽略掉具体的字母标签仅做示意作用
string labels;
cin >> labels;
// 处理各条边的关系录入工作
while(m--){
int from, to;
cin >> from >> to;
// 双向绑定两者的关联性
add(from, to);
add(to, from);
}
// 查询特定结点的度量情况
int targetNode;
cin >> targetNode;
int degreeCount = 0;
// 统计对应结点所连通其他结点的实际个数即为其度数
for(int i=h[targetNode]; ~i; i=ne[i]){
degreeCount +=1 ;
}
cout << degreeCount;
return 0;
}
```
以上代码实现了基于邻接表形式的无向图构建过程,并能够快速定位任意指定顶点的度数值输出功能。
---
阅读全文
相关推荐

















