在未正确分配函数中初始化的链表结构

Posted

技术标签:

【中文标题】在未正确分配函数中初始化的链表结构【英文标题】: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,所有变量都是空的。我知道这与我使用或传递指针的方式有关,但是当我查看代码时,我不断得出一个合乎逻辑的结论,即我所拥有的应该做我想做的。请有人指出我的算法存在缺陷的地方。

【问题讨论】:

【参考方案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

谢谢

【讨论】:

抱歉,这是我在尝试不同的可能性时留下的。我已将代码更改为我实际拥有的代码。

以上是关于在未正确分配函数中初始化的链表结构的主要内容,如果未能解决你的问题,请参考以下文章

C - 链表 - 如何分配和遍历列表

C即使分配了内存,修改链表的程序也会导致分段错误

windows内核驱动中的链表结构

使用类的链表中的分段错误。我的方法正确吗?

操作系统的实验,用到c语言/数据结构的链表

[数据结构与算法]给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。