我正在尝试创建一个包含LinkedList的LinkedList。主LinkedList将保存人物名字、描述以及其内部LinkedList中保存的节点数量。内部LinkedList将保存它们出现的章节号和该章节的简要描述。
例如,人物Joe(姓名)是国王(描述),出现在第4、7和10章。所以他将有3个内部节点,并附带了他在这些章节中所做的事情的描述。
但是我认为我没有正确地向LinkedList添加元素,因为当我调用迭代函数并打印每个节点时,只得到了我添加的第一个人物。
以下是我创建的两个结构体:
创建指针。
例如,人物Joe(姓名)是国王(描述),出现在第4、7和10章。所以他将有3个内部节点,并附带了他在这些章节中所做的事情的描述。
但是我认为我没有正确地向LinkedList添加元素,因为当我调用迭代函数并打印每个节点时,只得到了我添加的第一个人物。
以下是我创建的两个结构体:
struct Person{
char * name;
char * descriptor;
int count;
struct Person * next;
struct Information * info_head;
};
struct Information{
char * text;
int chapter;
struct Information * next;
};
创建指针。
struct Person * new_person, *temp_pers, *head_pers;
struct Information * new_info, *temp_info, *head_info;
用于添加新字符的函数。
void add(char * name, char * descriptor, char * info, int chapter){
new_person = (struct Person *)malloc(sizeof(struct Person));
new_info = (struct Information *)malloc(sizeof(struct Information));
new_info->chapter = chapter;
new_info->text = info;
new_person->name = name;
new_person->descriptor = descriptor;
if(head_pers == NULL){ //List is empty
head_pers = new_person; //add new person
new_person->info_head = new_info;//link to information
head_pers->next = NULL;
head_info = new_info; //name that information start of information list
head_pers->count = 1;
head_info->next = NULL;
}
else{
temp_pers = head_pers;
temp_info = head_info;
while(temp_pers != NULL){ //iterate through list of people
if(strcmp(temp_pers->name, name) == 0){ //adding a duplicate
while(temp_info != NULL){ //iterate through that persons info list
temp_info = temp_info->next;
} //reached the end of the list
temp_info = new_info;
temp_pers->count = temp_pers->count + 1;
temp_pers->next = NULL;
}
temp_pers = temp_pers->next;
}
//reached end of persons list with no find
//add new person to the end of the list
temp_pers = new_person;
temp_pers->count = temp_pers->count + 1;
temp_pers->next = NULL;
}
我的测试打印方法
void printAll(){
temp_pers = head_pers;
temp_info = head_info;
while(temp_pers != NULL){
printf("%s, %s %d\n", temp_pers->name, temp_pers->descriptor, temp_pers->count);
while(temp_info != NULL){
printf("%d\t%s", temp_info->chapter, temp_info->text);
temp_info = temp_info->next;
}
temp_pers = temp_pers->next;
}
}
主要方法
int main(){
add("Joe", "the King", "had a child.", 4);
add("Joe", "the King", "started a war", 7);
add("Sue", "the Queen", "poisoned Joe", 10);
printAll();
return 0;
}
处理一个由链表组成的链表让我感到困惑,也许我只是错过了一些很小的东西,或者可能是一些很大的东西,但任何帮助都将是极好的。几乎忘记了,代码可以编译并输出以下内容...
Joe, the King 2
4 had a child.
因为它将Joe的计数打印为2,所以我认为它有些起作用。
add
函数中,您需要实际分配last_pers->next = temp_pers
(其中last_pers
需要指向列表中的最后一个人)。 - Klas Lindbäcktemp_person
指向 NULL。在此之后分配temp_person
不会更改列表中最后一项的next
指针。 - Klas Lindbäck