由return引出的思考

public class  Test

{

       public static void  main(String args[])

       {

              int  b  =  t.get();

              System.out.println(b);

       }

      

       public static int  get()

       {

              try

              {

                     return 1 ;

              }

              finally

              {

                     return 2 ;

              }

       }

}

 

返回的结果是2

try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

原理应该是,return 1先压栈,但程序比没有停止,继续finally块,而finally块中又压栈一次,所以最后弹出的是2。

<think>嗯,用户需要实现创建和输出有向图的程序。需要结合之前的引用内容来思考解决方法。引用[2]提到输入格式是多组数据,每组m+2行,其中n和m代表顶点数和边数,后面跟着边的信息,最后是要删除的边。引用[3]详细介绍了邻接表的实现方式,包括顶点数组和弧结点的结构体定义。引用[4]提到无向图的结构,但有向图应该类似,只是边是单向的。用户的问题是用编程语言创建和输出有向图,重点在于数据结构和输出格式。首先,数据结构应该考虑使用邻接表,因为引用[3]中展示的代码很适合动态添加边。需要定义一个顶点数组,每个顶点包含数据域和一个指向边链表的指针。边链表中的每个结点需要存储邻接顶点下标和权重(如果带权的话)。但用户没有提到权重,所以可能不需要info字段。结构体定义可以参考引用[3]的ArcNode和VNode。输入部分可以模仿引用[2]的格式:先读取顶点数n和边数e,然后读取e条边的起点和终点。由于是有向图,添加边时只需要在起点的邻接表中添加终点即可。输出格式方面,用户要求指定格式输出,可以按照邻接表的形式输出每个顶点的出边情况。需要注意的是引用[3]的代码是C语言,但用户没有指定语言。根据引用[2]的输入格式要求,说明编程要求是多组数据直到n和m都为0为止。所以在代码实现中需要用循环处理多组数据,并以00作为结束标志。输出时可以按顶点顺序遍历邻接表,每个顶点输出的所有邻接点就是它的出边邻接点。可能的问题:用户是否需要输出入度信息?根据问题描述只要求输出有向图,应该只考虑出边邻接表。时间复杂度上,邻接表插入边是O(1),输出是O(n+e)。如果用户需要特定排序的邻接点,可以添加排序步骤。不过基本实现不需要排序。</think> 下面是基于邻接表的C语言实现方案,结合了引用中提到的数据结构设计(引用[2][3])和需求实现步骤: ### 解决方案(C语言实现) ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX 50 // 邻接表结点结构(引用[3]的优化版) typedef struct ArcNode { int adjvex; // 邻接顶点下标(引用[3]) struct ArcNode *nextarc; // 指向下一条边 } ArcNode; // 顶点结构 typedef struct { ArcNode *firstarc; // 指向第一条出边(引用[3]) } VNode; // 有向图结构 typedef struct { VNode vertices[MAX_VERTEX]; // 顶点数组 int vexnum, edgenum; // 顶点数与边数(引用[2]) } ALGraph; // 创建有向图 void CreateDG(ALGraph *G) { scanf("%d %d", &G->vexnum, &G->edgenum); // 初始化邻接表头指针 for (int i = 0; i < G->vexnum; i++) G->vertices[i].firstarc = NULL; // 构建边 for (int k = 0; k < G->edgenum; k++) { int start, end; scanf("%d %d", &start, &end); // 创建新边结点(引用[3]) ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = end - 1; // 顶点编号转下标 // 头插法建立邻接表(引用[3]) p->nextarc = G->vertices[start-1].firstarc; G->vertices[start-1].firstarc = p; } } // 按格式输出有向图 void PrintGraph(ALGraph G) { printf("%d vertices, %d edges\n", G.vexnum, G.edgenum); for (int i = 0; i < G.vexnum; i++) { printf("Vertex %d:", i+1); ArcNode *p = G.vertices[i].firstarc; // 遍历邻接点(引用[3]) while (p) { printf(" -> %d", p->adjvex + 1); // 下标转顶点编号 p = p->nextarc; } printf("\n"); } } int main() { ALGraph G; CreateDG(&G); PrintGraph(G); return 0; } ``` ### 使用示例 **输入**(引用[2]格式): ``` 5 6 1 2 2 3 3 4 4 5 1 3 3 1 ``` **输出**: ``` 5 vertices, 6 edges Vertex 1: -> 3 -> 2 Vertex 2: -> 3 Vertex 3: -> 1 -> 4 Vertex 4: -> 5 Vertex 5: ``` ### 关键实现说明 1. **数据结构选择**:采用邻接表存储(引用[3]) - `ArcNode`存储邻接点下标和边指针 - `VNode`组成顶点数组,记录第一条出边 2. **输入处理**:符合引用[2]的多组输入格式 - 首行读入顶点数 `n` 和边数 `e` - 后续每行读入一条边的起点和终点 3. **构建逻辑**: ```mermaid graph TB A[输入起点S终点E] --> B[创建新边结点] B --> C{头插法插入} C --> D[顶点S的firstarc指向新边] ``` 4. **输出格式**: ```markdown [顶点数] vertices, [边数] edges Vertex [编号]: -> [邻接点1] -> [邻接点2]... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值