如何创建包含动态设置数据类型的C LinkedList

时间:2018-04-27 06:52:22

标签: c linked-list custom-data-type

C

struct node {
   int data;
   int key;
   struct node *next;
};  

上述 C 数据结构只能包含设置的数据类型,即int dataint key

Java

List<?> objectList = new ArrayList<>();  

如何创建包含动态设置数据类型的 C LinkedList

这个想法是:

struct node {
   <?> data;
   <?> key;
   struct node *next;
};  

所以我可以这样做:

List<String> objectList = new ArrayList<>();  

List<MyCustomObject> objectList = new ArrayList<>();  
C

中的

struct node {
   <String> data;
   <String> key;
   struct node *next;
};  

struct node {
   <MyCustomObject> data;
   <MyCustomObject> key;
   struct node *next;
};  

2 个答案:

答案 0 :(得分:3)

数据应为void *。然后,您需要将其隐式地转换为它需要的任何指针类型。

答案 1 :(得分:3)

你不能,因为动态data types不存在一般在C 中。通过阅读C11标准n1570进行检查。

你可能会做的是实现某种tagged union type,并创建一个包含这些的列表(或者可能是包含一些指针的列表,但你需要决定一些{ {3}}策略和相关的编码约定。)

如何实现这种标记的联合类型是不同的问题。如需灵感,请查看Glib memory management类型(但还有其他方法可以做到这一点;一个示例是Python值类型,请在GVariant章节中详细了解它;或者某些<nav class="navbar navbar-expand navbar-light bg-faded"> <a class="navbar-brand" href="#">Learning Bootstrap 4</a> <ul class="nav navbar-nav"> <li class="nav-item active"> <a class="nav-link" href="index.html">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="about.html">About</a> </li> <li class="nav-item"> <a class="nav-link" href="contact.html">Contact</a> </li> </ul> <form class="form-inline pull-xs-right"> <input class="form-control" type="text" placeholder="Search"> <button class="btn btn-primary" type="submit">Search</button> </form> </nav> 包含一些struct,或union union struct union,所有struct都以共同的歧视字段开头,或指向此int的某些long等,并进行研究Glib中该实现的extending Pythonsource code

你也可以考虑一些free software方法,例如从您的数据类型的某些描述生成一些C代码。查看metaprogrammingSWIG获取灵感。

BTW,RPCGEN标题主要库使用大量SGLIB技术(使用巨大的C宏)来提供&#34;泛型&#34;容器

还要了解C实现的preprocessorABI。在某些情况下,它可能有助于理解它(例如,如果您决定使用calling conventions)。请注意,许多基本C类型(char@Entity public class Schedule { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "user_id") private User user; @ManyToOne @JoinColumn(name = "usergroup_id") private UserGroup userGroup; private String description; private boolean master;//is this a schedule for all supervalus(true) or one supervalu(false) @OneToMany(mappedBy = "schedule",cascade = CascadeType.ALL) private List<DateActiveScheduleItem> dateActiveScheduleItems = new ArrayList<>(); @OneToMany(mappedBy = "schedule",cascade = CascadeType.PERSIST) private List<MusicScheduleItem> musicScheduleItems = new ArrayList<>(); @OneToMany(mappedBy = "schedule",cascade = CascadeType.PERSIST) private List<AdvertisementScheduleItem> advertisementScheduleItems = new ArrayList<>(); @Basic @Temporal(TemporalType.DATE) private java.util.Date dateAdded; public Long getId() { return id; //getters setters } @Entity public class DateActiveScheduleItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Basic @Temporal(TemporalType.DATE) private Date date; @JsonIgnore @ManyToOne @JoinColumn(name = "schedule_id") private Schedule schedule; //getters setters} ,数据tagged pointerspointers)具有截然不同的表示形式(不同大小,不同{{3 ,不同的方式作为参数传递并作为结果返回 - 例如在各种function pointersalignments上),甚至可能不同processor registers(想到call stack其中函数指针与数据位于不同的空间,甚至可能具有与数据指针不同的大小。