æ•°æ®ç»“æž„å¯ä»¥åŒ…å«å¤šç§ç±»åž‹çš„元素å—?

时间:2016-12-14 09:07:46

标签: c data-structures linked-list singly-linked-list

This program是一ç§ä¸Žæ—§çš„å•é“¾è¡¨ç›¸åŒçš„方法。我没有创建å•ä¸ªç»“构并ä¿æŒä¸Žç»“æž„æˆå‘˜ç›¸åŒç±»åž‹çš„下一个节点的指针,而是使用了三ç§ä¸åŒçš„结构,æ¯ä¸ªç»“构中都有一个普通的long nextaddressæˆå‘˜æ¥æŒ‡å‘下一个的地å€èŠ‚点,因为指针也是这样åšçš„。

æ¯ä¸ªèŠ‚点还有一个int flagæˆå‘˜ä½œä¸ºç»“构的第一个项目,data部分由于其å¯å˜é•¿åº¦è€Œä½äºŽç»“构的末尾。

这三ç§ç»“构是内置类型的基本扩展,long,doubleå’Œchar。在访问结构时,我首先将节点的地å€è½¬æ¢ä¸ºint *,这使我å¯ä»¥è®¿é—®flag,而无需将地å€å®Œå…¨ç±»åž‹åŒ–为三者中的确定结构。

然åŽåˆ†æžflag,完æˆäº†å„ç§æ“作。

所以这是我的问题。它å¯ä»¥ç§°ä¸ºæœ‰æ•ˆçš„链表å—?而且,它甚至是一个有效的数æ®ç»“æž„å—?

4 个答案:

答案 0 :(得分:2)

您的代ç å­˜åœ¨è®¸å¤šé—®é¢˜ï¼Œä½†ä»…涉åŠæ‚¨å¯¹ç»“构的具体问题

Standard C授予您解决方案的作用

  

6.7.2.1结构和è”åˆè¯´æ˜Žç¬¦

     

第15章

     

在结构对象内,éžä½å­—段æˆå‘˜å’Œä½åŸŸä¸­çš„å•ä½   驻留的地å€æŒ‰å£°æ˜Žçš„顺åºå¢žåŠ ã€‚ 指å‘a的指针   结构对象,适当转æ¢ï¼ŒæŒ‡å‘å…¶åˆå§‹æˆå‘˜ï¼ˆæˆ–者如果该æˆå‘˜æ˜¯a   ä½å­—段,然åŽåˆ°å®ƒæ‰€åœ¨çš„å•ä½ï¼‰ï¼Œå之亦然。å¯èƒ½æœ‰æœªå‘½åçš„   在结构对象中填充,但ä¸åœ¨å…¶å¼€å¤´ã€‚

强调我的

您应该在其他结构中使用SELECT * FROM [dbo].[MyTable] as P WHERE P.Mode = CASE WHEN @includeMode1 = 1 THEN 1 ELSE 0 END OR P.Mode = CASE WHEN @includeMode2 = 2 THEN 2 ELSE 0 END OR P.Mode = CASE WHEN @includeMode3 = 3 THEN 3 ELSE 0 END :这将授予尊é‡ï¼†ï¼ƒ34;åˆå§‹æˆå‘˜ï¼†ï¼ƒ34;的规则。

gen_struct

正如你所看到的,我也改å˜äº†struct gen_type { int flag; void *nextaddress; }; struct node_type_int { struct gen_type header; long data; }; struct node_type_real { struct gen_type header; double data; }; struct node_type_char { struct gen_type header; char data; }; 的类型:æ„æ€æ˜¯æŒ‡é’ˆï¼Œæ‰€ä»¥ä½¿ç”¨æŒ‡é’ˆã€‚

æ—注:do-i-cast-the-result-of-malloc

答案 1 :(得分:1)

åªè¦æ‚¨æœ‰åŠžæ³•ç¡®å®šæ¯ä¸ªèŠ‚点包å«å“ªç§ç±»åž‹ï¼Œä¾‹å¦‚flagå˜é‡ï¼Œå°±å¯ä»¥è¿™æ ·åšã€‚

无论您使用哪ç§ç»“构类型,您都å¯ä»¥å‡è®¾flagå’Œnextaddresså°†ä½äºŽç›¸åŒçš„结构å移é‡ä¸Šï¼Œè¿™ä¼¼ä¹Žæ˜¯åˆç†çš„。虽然严格æ¥è¯´C语言并ä¸èƒ½ä¿è¯è¿™ä¸€ç‚¹ï¼Œä½†æˆ‘相信它å¯ä»¥åœ¨ä»»ä½•ç³»ç»Ÿä¸Šå®žé™…è¿è¡Œã€‚

但是,您ä¸èƒ½è®¤ä¸ºdataä½äºŽ(uint8_t*)&my_struct + sizeof(int) + sizeof(long)。由于ä¸åŒçš„对é½è¦æ±‚,此å移é‡å¯èƒ½å› ç»“构而异。

更严é‡çš„问题是指针别å。您ä¸èƒ½ä½¿ç”¨æŒ‡é’ˆstruct* x并将其转æ¢ä¸ºå¦ä¸€ç§æŒ‡é’ˆç±»åž‹struct* y。它将编译,但这è¿å了C中的类型规则并调用未定义的行为(除éžä¸¤ä¸ªç»“构具有完全相åŒçš„æˆå‘˜ï¼‰ã€‚使用积æžä¼˜åŒ–(如GCC)的符åˆæ ‡å‡†çš„编译器ä¸ä¼šæŒ‰é¢„期编译此类代ç ã€‚ (What is the strict aliasing rule?)

为了安全起è§å¹¶èŽ·å¾—更好的程åºè®¾è®¡ï¼Œæˆ‘建议您改为:

typedef struct node
{
  long   nextaddress;
  type_t type; // some enum
  void*  data;
} node_t;

其中data与节点分开分é…。你得到一个链å¼é“¾æŽ¥åˆ—表。

答案 2 :(得分:0)

尼斯。开箱å³ç”¨ï¼Œæˆ‘喜欢ä¸åŒçš„åšæ³•ï¼ä½†æ˜¯......

考虑到内存对é½å·®å¼‚,您觉得下é¢çš„代ç å¯èƒ½å­˜åœ¨é—®é¢˜ï¼š

dataaddress = ((long)(&generic->nextaddress)) + sizeof(long);

这里å‡è®¾æ•°æ®æ˜¯è¿žç»­å­˜å‚¨çš„,因此通过将sizeof long添加到下一个地å€çš„地å€æ¥è®¡ç®—æ•°æ®çš„地å€ã€‚但这ä¸ä¸€å®šæ€»æ˜¯è¿™æ ·å—?

相å,我觉得在读å–标志值åŽæ›´å¥½åœ°å°†å…¶è½¬æ¢ä¸ºé€‚当的结构类型,然åŽè¯»å–æ•°æ®ã€‚

考虑到这些挑战,虽然你节çœäº†ä¸€äº›å†…存但增加了一些处ç†ã€‚因此,虽然它看起æ¥åƒä¸€ä¸ªæœ‰æ•ˆçš„链表,但实现å¯ä»¥æ ¹æ®å†…存与处ç†çš„选择æ¥å†³å®šã€‚

答案 3 :(得分:0)

您的代ç è‡³å°‘有两个弱点:

1。)long和指针之间的转æ¢ã€‚åªæœ‰å½“整数类型å¯ä»¥ä¿æŒå¿…è¦çš„范围时,C标准æ‰å…许这ç§æƒ…况,而在具有32ä½longæ•´æ•°å’Œ64ä½æŒ‡é’ˆçš„体系结构中å¯èƒ½ä¸æ˜¯è¿™ç§æƒ…况。

我在C11标准中添加了引文,第6.3.2.3节指针:

  

æ•´æ•°å¯ä»¥è½¬æ¢ä¸ºä»»ä½•æŒ‡é’ˆç±»åž‹ã€‚除éžäº‹å…ˆæŒ‡æ˜Žï¼Œå¦åˆ™   结果是实现定义的,å¯èƒ½æ²¡æœ‰æ­£ç¡®å¯¹é½ï¼Œå¯èƒ½ä¸æŒ‡å‘   引用类型的实体,å¯èƒ½æ˜¯é™·é˜±è¡¨ç¤º.67)

     

任何指针类型都å¯ä»¥è½¬æ¢ä¸ºæ•´æ•°ç±»åž‹ã€‚除éžäº‹å…ˆæŒ‡æ˜Žï¼Œå¦åˆ™   结果是实现定义的。如果结果无法以整数类型表示,   行为未定义。结果ä¸å¿…在任何整数的值范围内   类型。

     

67)用于将指å‘整数或整数的指针转æ¢ä¸ºæŒ‡é’ˆçš„映射函数   与执行环境的寻å€ç»“构一致

2.)实现å‡è®¾ä¸¤ä¸ªä¸åŒç»“构中的字段(其中å‰é¢çš„字段的类型匹é…)存储在结构内的相åŒä½ç½®ï¼ˆå移)。虽然大多数实现都是如此,但åªæœ‰å½“这两个结构是è”åˆçš„一部分时,标准æ‰èƒ½ä¿è¯è¿™ä¸€ç‚¹ã€‚

第6.5.2.3节结构和工会æˆå‘˜ï¼š

  

为了简化工会的使用,我们æ出了一项特殊ä¿è¯ï¼šå¦‚æžœå·¥ä¼šåŒ…å« Â Â å‡ ä¸ªç»“æž„å…±äº«ä¸€ä¸ªå…±åŒçš„åˆå§‹åºåˆ—(è§ä¸‹æ–‡ï¼‰ï¼Œå¦‚果是è”盟   对象当å‰åŒ…å«è¿™äº›ç»“构中的一个,å…许检查公共结构   其中任何一个的åˆå§‹éƒ¨åˆ†éƒ½æ˜¯å®Œæ•´ç±»åž‹çš„è”盟的声明   是å¯è§çš„。如果相应的æˆå‘˜ï¼ŒTwo结构共享共åŒçš„åˆå§‹åºåˆ—   对于一个或多个åºåˆ—具有兼容类型(并且对于ä½å­—段,具有相åŒçš„宽度)   åˆå§‹æˆå‘˜ã€‚