如何解决如何使用此结构作为数据创建链接列表?
我正在尝试打印一个表,即周期表中的前十个元素作为链表,并以结构作为数据。该结构按如下方式保存元素的数据:
typedef struct element{
char *name;
char *symbol;
float weight;
}element;
,然后像这样创建列表本身:
typedef struct list{
struct element elements[]; //an array holding element types?
struct list *next;
}list;
所以因为我需要打印出前10个元素,所以我尝试使用数组来声明名称,符号和权重,但是我无法建立在链表中将其用作数据的哪种方式的连接:
char *names[10] = {"Hydrogen","Helium","Lithium","Beryllium","Boron","Carbon","Nitrogen","Oxygen","Fluorine","Neon"};
char *symbols[10] = {"H","He","Li","Be","B","C","N","O","F","Ne"};
float weights[10] = {1.008,4.003,6.941,9.012,10.811,12.011,14.007,15.999,18.998,20.180};
解决方法
尽管在某些情况下链表很有用,但链表具有元素数组并不常见。在您的情况下,我认为每个列表元素都有一个元素的链表更合适:
typedef struct list{
struct element element;
struct list *next;
}list;
作为样式,我们最终在结构名称中使用名称element
,作为类型定义的名称和结构成员。我建议将它们重命名为struct ELEMENT
和tElement
。与列表结构相同。这将使其像:
typedef struct ELEMENT {
char *name;
char *symbol;
float weight;
} tElement;
typedef struct LIST {
tElement element;
struct LIST *next;
} tList;
我留给您开发用于创建并添加到列表并进行打印的功能。
,对于链接列表结构,您有两个主要选择:
-
这些项目包含链接,因此本身就构成了链接列表节点:
struct element { char *name; char *symbol; float weight; struct element *next; // <--- here };
-
列表节点和数据是分开的(-ish)。例如:
struct element { char *name; char *symbol; float weight; }; struct node { struct element *element; // points to the item struct node *next; };
或者也许
struct node { struct element element; // contains the item struct node *next; };
列表本身可以有一个单独的结构,但不一定必须如此。列表的最小表示形式只是指向头节点的指针:
struct node *head;
像您建议的那样,通常不存在直接包含节点的结构,因为要求从此类池中绘制节点会限制列表的最大大小。还有其他原因使结构类型代表整个列表会很有用,但这可能比您现在需要为之担心的更为复杂。
顺便说一句,是否要为结构类型声明typedef
别名是一个完全独立的问题。我自己很少这样做。在很大程度上,这是一个样式问题,但我提出来是因为有些人误以为typedef
是结构类型定义的必要元素。
只需将指针添加到下一个元素。您不需要新的结构。这是一些示例代码(仅添加到列表中并已实现打印)
有一些代码从数组中填充列表。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct element{
char *name;
char *symbol;
float weight;
struct element *next;
}element;
element *addToList(element *head,const char *name,const char *symbol,float weight)
{
element *current,tmp;
if(!head)
{
head = realloc(head,sizeof(*head));
current = head;
}
else
{
element *wrk;
current = head;
while(current -> next) current = current ->next;
wrk = malloc(sizeof(*head));
if(wrk)
{
current -> next = wrk;
current = wrk;
}
}
if(current)
{
current -> name = malloc(strlen(name) + 1);
current -> symbol = malloc(strlen(symbol) + 1);
//add memory checks here
strcpy(current -> name,name);
strcpy(current -> symbol,symbol);
current -> weight = weight;
current -> next = NULL;
}
return head;
}
size_t printLinst(const element *head)
{
size_t nelems = 0;
while(head)
{
printf("%zu element = {\"%s\",\"%s\",%f}\n",++nelems,head -> name,head -> symbol,head -> weight);
head = head -> next;
}
return nelems;
}
/* another list functions */
char *names[10] = {"Hydrogen","Helium","Lithium","Beryllium","Boron","Carbon","Nitrogen","Oxygen","Fluorine","Neon"};
char *symbols[10] = {"H","He","Li","Be","B","C","N","O","F","Ne"};
float weights[10] = {1.008,4.003,6.941,9.012,10.811,12.011,14.007,15.999,18.998,20.180};
#define ARRSIZE(arr) (sizeof((arr))/sizeof((arr)[0]))
int main(void)
{
element *head = NULL;
for(size_t index = 0; index < ARRSIZE(weights); index++)
{
head = addToList(head,names[index],symbols[index],weights[index]);
}
printf("List is %zu elements long\n",printLinst(head));
/* another code */
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。