在未正确分配函数中初始化的链表结构
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->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;
【讨论】:
那是旧代码的产物,感谢您指出。我削减了我的实际代码,使其更简单,更易读。【参考方案2】:在函数内部不需要使用 *head 或 *curr ..因为 -> 仅由指针组成,而不是直接使用 head->left & curr->next
谢谢
【讨论】:
抱歉,这是我在尝试不同的可能性时留下的。我已将代码更改为我实际拥有的代码。以上是关于在未正确分配函数中初始化的链表结构的主要内容,如果未能解决你的问题,请参考以下文章