两个EdgeNode夹一个Node

本文深入探讨了C语言中指针和结构体的使用,解释了指针类型如何决定有效数据范围,以及如何利用void*进行类型不确定的指针操作。通过实例展示了不同类型的结构体和链表的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C中,各种类型的指针本身只是一个地址值,长度都是一样的。但是只知道地址值,你是没法确定往后多少bit是你真正有效的数据范围,所以指针就要加类型来确定往后取得范围。

所以你的struct里面那个嵌套的东西只是一个地址, 不是struct结构本身。到这里你的编译器是可以确认你整个结构体的大小的,你的例子中就是一个int,一个EdgeType,加一个地址的长度。

其实这个struct地址你甚至可以不用给确定类型,你里面声明一个void *也可以,只是用的时候再转型成EdgeNode也可以。

例如:下面的例子,两个EdgeNode夹一个Node(next项void*,未指定类型)大小是一样的,也可以连成 链表,由头节点可以访问next项,遍历整个链表

#include<stdio.h>
struct EdgeNode{
	int a;
	int b;
	struct EdgeNode *next;
};

struct Node{
	int a;
	int b;
	void *next;
};
int main()
{ struct EdgeNode node1;
  struct Node node2;
  //%u   无符号10进制整数 
  printf("%u==%u\n",sizeof(node1),sizeof(node2));
//创建链表节点,其中头尾是EdgeNode类型,中间body为Node类型,将3个节点连起来。 
   struct EdgeNode head,tail;
   struct Node body;
   tail.a=10;
   tail.b=20;
   body.a=40;
   body.b=50;
   
   head.next=(struct EdgeNode *)&body;
   body.next=&tail;
   tail.next=NULL;
   // 由头部遍历链表
  struct EdgeNode *p=head.next;
  printf("body:%d %d\n",p->a,p->b);
  printf("tail:%d %d\n",p->next->a,p->next->b);   
}

如果有向图用邻接表表示,试设计算法判断图中是否存在回路。 函数接口定义: bool IsAcyclic( LGraph graph ); 其中邻接表表示的图 LGraph 的结构定义定义如下: typedef enum { false, true } bool; typedef int Vertex; /* 顶点编号类型 */ typedef char VertInfo; /* 顶点信息类型 */ typedef struct EdgeNode *Position; /* 指针即结点位置 */ struct EdgeNode { Vertex dest; /* 边的另一端点编号 */ Position next; /* 线性表中下一个元素的位置 */ }; typedef struct HeadNode *AdjList; /* 邻接表 */ struct HeadNode { Position adj; /* 邻接表头指针 */ VertInfo data; /* 存储顶点信息 */ }; typedef struct LGraphNode *LGraph; /* 邻接表表示的图 */ struct LGraphNode { int n_verts; /* 顶点数 */ int m_edges; /* 边数 */ AdjList *ver_list; /* 存储顶点邻接表 */ bool directed; /* true为有向图,false为无向图 */ }; IsAcyclic 判断 graph 是否无环图,如果是则返回 true,否则返回 false。 裁判定义的测试用主函数通过读入顶点数、边数、以及每条边的两个端点来建立一个图,随后调用 IsAcyclic 进行判断,最后根据判断结果输出 Yes 或 No。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> typedef enum { false, true } bool; typedef int Vertex; /* 顶点编号类型 */ typedef char VertInfo; /* 顶点信息类型 */ typedef struct EdgeNode *Position; /* 指针即结点位置 */ struct EdgeNode { Vertex dest; /* 边的另一端点编号 */ Position next; /* 线性表中下一个元素的位置 */ }; typedef struct HeadNode *AdjList; /* 邻接表 */ struct HeadNode { Position adj; /* 邻接表头指针 */ VertInfo data; /* 存储顶点信息 */ }; typedef struct LGraphNode *LGraph; /* 邻接表表示的图 */ struct LGraphNode { int n_verts; /* 顶点数 */ int m_edges; /* 边数 */ AdjList *ver_list; /* 存储顶点邻接表 */ bool directed; /* true为有向图,false为无向图 */ }; #define kMaxV 1000 /* 裁判实现,细节略 */ void InitGraph(LGraph graph, int kMaxVertex, bool directed); bool ExistEdge(LGraph graph, Vertex u, Vertex v); void InsertEdge(LGraph graph, Vertex u, Vertex v); LGraph BuildGraph(); /* 裁判实现部分结束 */ bool IsAcyclic( LGraph graph ); int main(void) { LGraph graph; graph = BuildGraph(); if (IsAcyclic(graph) == true) { printf("Yes\n"); } else { printf("No\n"); } return 0; } /* 你的代码将被嵌在这里 */ 输入样例: 6 9 0 1 0 2 0 3 1 2 2 3 1 4 3 4 3 5 4 5 输出样例: Yes 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB C (gcc)
最新发布
06-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangchuang2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值