在功能未初始化的情况下初始化链接列表结构
我确信之前已经询问过这一点,但在搜索相当长的一段时间后,本网站或其他任何关于它的内容都找不到。在功能未初始化的情况下初始化链接列表结构
我很难得到我在函数中创建和修改的结构的值。代码看起来是这样的:
struct node {
char name[35];
int employeeID;
struct node *next;
}
typedef struct node employee;
void insertInOrder(employee *head, employee *curr) {
if (head == NULL) {
*curr->next = *head;
*head = *curr;
} else {
if ((head->employeeID<curr->employeeID)&&(curr->employeeID <head->next->employeeID)) {
*curr->next = *head->next;
*head->next = *curr;
} else {
insertInOrder(head->next, curr);
}
}
}
void addEmployee(char name[], employee *head, employee *curr) {
int id;
scanf("%d", &id);
curr = malloc(sizeof(employee));
strcpy(curr->name, name);
curr->employeeID = id;
insertInOrder(head, curr);
}
int main(void) {
char name[35];
int quit = 1;
employee *head, *curr;
head = NULL;
printf("Enter data about the books: \n");
while (quit) {
scanf("%[^\n]%*c", title);
if (title[0] != '#') {
addBook(name, head, curr);
} else {
quit = 0;
}
}
在我调试,我的代码迭代到我所有的功能,但一旦我将所有我想要的数据后回到主,所有的变量都是空的。我知道它与我使用或传递指针的方式有关,但是当我查看代码时,我总是会得出合乎逻辑的结论,即我拥有的应该按照我的意愿去做。请有人指出我的算法存在缺陷。
addBook
需要Book
类型的指针,但你传递一个类型的指针Employee
编辑:
所以,首先你不需要做这样的事情*curr->next = *head
。它应该是curr->next = head
。 另外,head->next
可以为null,不会被检查。最后,head
需要始终指向列表的开头。
编辑2:
以下代码应该工作。 head
总是指向列表的开始。为了做到这一点,我们必须通过头指针的地址。我们需要这样做,因为我们将修改地址head
。
我也清理了一些东西。
void insertInOrder(employee **head, employee *curr) {
if (*head == NULL) {
// We are inserting the first element
*head = curr;
}
else if ((*head)->next == NULL) {
// This is the second element. We either insert it in front of head or before head.
if ((*head)->employeeID < curr->employeeID) {
(*head)->next = curr;
}
else {
curr->next = *head;
*head = curr;
(*head)->next = NULL;
}
}
else {
// We iterate through the list trying to find the best spot to insert curr.
employee *temp = *head;
while (temp->next != NULL) {
if ((temp->employeeID < curr->employeeID) && (curr->employeeID < temp->next->employeeID)) {
curr->next = temp->next;
temp->next = curr;
break;
}
temp = temp->next;
}
// curr has the greatest id so it is inserted at the end
if (temp->next == NULL)
temp->next = curr;
}
}
void addEmployee(char name[], employee **head) {
int id;
printf("Enter id\n");
scanf("%d", &id);
employee *curr = malloc(sizeof(employee));
strcpy(curr->name, name);
curr->employeeID = id;
curr->next = NULL;
insertInOrder(head, curr);
}
int main(void) {
int quit = 1;
employee *head = NULL;
char title[100];
printf("Enter data about the employees: \n");
while (quit) {
scanf("%s", title);
if (title[0] != '#')
addEmployee(title, &head);
else break;
}
return 0;
}
在函数内部没有必要使用*头或* CURR ..because - >是由为指针而不是只直接使用头戴式>左& curr->未来
感谢
道歉,这是从我身上试图不同的可能性遗留下来。我已将代码更改为我实际拥有的代码。 – brostone51 2014-10-08 20:04:23
这是来自旧代码的工件,谢谢指出。我减少了我的实际代码,使其更简单,更易读。 – brostone51 2014-10-08 20:00:38