【问题标题】:Linked list structures initialized in functions not being assigned properly在未正确分配函数中初始化的链表结构
【发布时间】:2014-10-08 19:47:36
【问题描述】:

我确定以前有人问过这个问题,但是在搜索了很长一段时间后,我在这个网站或任何其他网站上都找不到任何东西。

我无法获取我在函数中创建和修改的结构的值。代码看起来像:

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

在我的调试过程中,我的代码会迭代到我的所有函数中,但是一旦我在添加了我想要的所有数据后返回到 main,所有变量都是空的。我知道这与我使用或传递指针的方式有关,但是当我查看代码时,我不断得出一个合乎逻辑的结论,即我所拥有的应该做我想做的。请有人指出我的算法存在缺陷的地方。

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    addBook 接受 Book 类型的指针,但您传递的是 Employee 类型的指针

    编辑:

    因此,首先您不需要执行*curr-&gt;next = *head 之类的操作。应该是curr-&gt;next = head。 此外,head-&gt;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;
    }
    

    【讨论】:

    • 那是旧代码的产物,感谢您指出。我削减了我的实际代码,使其更简单,更易读。
    【解决方案2】:

    在函数内部不需要使用 *head 或 *curr ..因为 -> 仅由指针组成,而不是直接使用 head->left & curr->next

    谢谢

    【讨论】:

    • 抱歉,这是我在尝试不同的可能性时留下的。我已将代码更改为我实际拥有的代码。
    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2022-08-11
    • 1970-01-01
    • 2015-07-23
    • 2012-04-26
    • 2014-07-03
    相关资源
    最近更新 更多