2014-10-08 123 views
0

我确信之前已经询问过这一点,但在搜索相当长的一段时间后,本网站或其他任何关于它的内容都找不到。在功能未初始化的情况下初始化链接列表结构

我很难得到我在函数中创建和修改的结构的值。代码看起来是这样的:

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; 
    } 
} 

在我调试,我的代码迭代到我所有的功能,但一旦我将所有我想要的数据后回到主,所有的变量都是空的。我知道它与我使用或传递指针的方式有关,但是当我查看代码时,我总是会得出合乎逻辑的结论,即我拥有的应该按照我的意愿去做。请有人指出我的算法存在缺陷。

回答

1

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; 
} 
+0

这是来自旧代码的工件,谢谢指出。我减少了我的实际代码,使其更简单,更易读。 – brostone51 2014-10-08 20:00:38

0

在函数内部没有必要使用*头或* CURR ..because - >是由为指针而不是只直接使用头戴式>左& curr->未来

感谢

+0

道歉,这是从我身上试图不同的可能性遗留下来。我已将代码更改为我实际拥有的代码。 – brostone51 2014-10-08 20:04:23