在C中创建一个包含多个结构的单链表

时间:2015-04-13 03:25:20

标签: c struct nodes singly-linked-list

嘿我正在尝试创建一个包含2个结构的SINGLY Linked List程序。

有一个包含员工信息的结构;像这样

typedef struct{
    int ID; //Employee ID, randomly generated 4 digit integer
    char *firstName[25]; //Employee's first name
    char *lastName[35]; //Employess's last name
    char status; //AM/PM status, if valueof char:1=AM Employee,0=PM Employee
}EMPLOYEE;

然后有一个Linked List结构,它包含Employee Information Struct和对Linked List结构的引用(我接下来调用它);它看起来像这样:

struct LinkedList{
    EMPLOYEE employee;
    struct LinkedList *next;
};

在main()函数中,我必须创建两个链接列表头节点,因为我必须有两个链接列表,一个用于AM员工,一个用于PM员工,所以我做了这个:

void main() {
    struct LinkedList *AMHead = NULL; //I made this NULL for now, they will be allocated in create a LinkedListNode function.
    struct LinkedList *PMHead = NULL;
}

所以现在我遇到了困难。然后有一个创建链接列表节点的函数,它不能有参数。它将使用内存分配来创建节点,然后我将向用户询问员工信息并使用给定信息初始化Linked List节点的employee struct部分。然后,我将下一个指针设置为NULL,并返回指向此新节点的指针。这是我到目前为止写的:

void createLinkedListNode(){
    struct LList *node = (struct LList)*malloc(sizeof(struct LList)); 
    //node created by allocating memory to struct


    //prompt for all info required in employee struct
    printf("Enter ID:\n");
    printf("Enter first name:\n");
    printf("Enter last name:\n");
    printf("Enter status:\n");
};

所以我的问题是,我是否必须创建2个节点?一个用于AM列表,另一个用于PM列表,或者我可以为两者使用相同的节点。然后我如何初始化employee struct并存储读取的信息。我是否正确创建了结构和头节点,因为我在单链表项目中有2个链表。我应该修改的任何东西或任何我可以使代码更好的方式吗?

1 个答案:

答案 0 :(得分:0)

顺便说一下,我现在也在练习单链表。让我试着根据我从你的问题中理解的内容以及我认为到目前为止所学到的内容来回答。

你问道,“我必须创建两个节点吗?”我想你的问题是“我有两个创建两个链接列表吗?”

如果员工人数超过两人,则必须创建两个以上的节点。没有选择。

但是,如果您的意思是“我有两个创建两个链接列表吗?”。如果AM列表和PM列表相同,则答案为否。如果AM列表和PM列表相同,则是,您只能使用一个列表。

但是,如果AM和PM列表不相同,则需要使用两个列表。因为,你的链表是一个单链表,它不能有两个下一个指针,这就是问题所在。由于列表中的任何节点只能指向另一个节点(或NULL),因此根据您是将节点视为AM还是PM,该单个节点无法指向不同的节点。

例如:这意味着您无法使节点指向节点,其中AM列表中的employee.id == 25指向PM列表中employee.id == 30的节点。 所以,我猜你在这种情况下需要两个清单。

所以,你看,这取决于。我猜你的列表和节点的性质都是。

初始化员工结构并存储信息:

使用以下语句为新节点分配内存后:

struct LList *node = malloc(sizeof(struct LList)); 

接下来,您可以使用->运算符将数据存储到节点中。

例如,要存储ID:

int id;
printf("Enter ID:\n");
scanf("%d",&id)
node->ID = id;

同样,您可以使用->运算符存储其他数据(姓氏,名字)。

对于正确性部分,我可以看到一个问题。

您已将节点定义为:

struct LinkedList{
EMPLOYEE employee;
struct LinkedList *next;
};

但是,您已创建了一个节点:

struct LList *node = (struct LList)*malloc(sizeof(struct LList)); 

但是没有LList结构。您需要将其更改为:

struct LinkedList *node = malloc(sizeof(struct LinkedList)); 

我认为malloc()不需要进行类型转换。

我可能在此分析中犯了错误,如果上述错误,请自由评论或编辑答案。